|
分類:[C++/CLI]
いつも、お世話になっております。
VS2005でC++/CLIを勉強中なのですが、ハンドル型(^)について理解が進まなくなったので、
助言を頂けたらと思い、書き込み致しました。
(基礎的な内容かとは思いますがすみません)
テスト的に、Windowsフォームアプリケーションプロジェクトを作成して、
以下のようなソースを追加し実行しました。
Form1_Load()がinitBmp()を実行して戻ってきた後、m_bmp->Width, m_bmp->Heightを表示しようとすると、
以下のダイアログが出ます。
---
'System.NullReferenceException' のハンドルされていない例外が System.Drawing.dll で発生しました。
追加情報: オブジェクト参照がオブジェクト インスタンスに設定されていません。
---
現状、私の中ではハンドル(^)はガーベジコレクタメモリ内で扱われるポインタのようなものと
理解しており、C的な感覚で使っていたのですが、理解が間違っているようであり、
どう修正してよいか困っております。
当然、m_bmpを関数呼び出しで初期化せず、Form1_Load内に羅列してgcnewすれば問題はありません。
まとめますと、やりたいことは、
System::Drawing::BitmapやSystem::Stringなど.netクラスを(^)で宣言したとき、
その中身を初期化や変更することを、関数を呼んでその関数内で行いたいとき、
どのような記述にすれば良いのでしょうか。
----以下ソースコード---
private:
System::Drawing::Bitmap^ m_bmp; // クラスメンバ変数としてBMPのハンドルを定義
private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e)
{
int width = 320;
int height = 240;
initBmp(m_bmp, width, height);
MessageBox::Show(System::String::Format(L"{0}, {1}", m_bmp->Width, m_bmp->Height)); // <- ここで例外
}
private: System::Void initBmp(System::Drawing::Bitmap^ bmp, int width, int height)
{
delete bmp;
bmp = gcnew Drawing::Bitmap(width, height);
//bmp.SetPixel(0, 0, Color::FromArgb(0));
}
---
|