掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
DialogBoxParamによるグローバル変数の節約方法について (ID:73684)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
C言語ですか(質問)。C++を使うとDLGとそれが扱うデータをひとくくりにして 寿命をコントロールしやすいのでDialogBoxParam()を使う場面はだいぶ減ります。 詳しくは解説しませんが、 1.DialogBoxParam()の、第5引数に任意の32bit値を渡す。 2.受け取り側の当該DLGのコールバックは、 WM_INITDIALOGの時のLPARAMに、先の32bit値を受け取ることができる。 3.当たり前だが、この32bit値はある構造を持つデータのポインタでもOK。 という仕組みです。以上の事から、以下の制限があります。 4.受け渡すデータ(構造体のポインタなど)の寿命は、 受け取り側のDLGの寿命より長くなくてはならない。 つまり、ローカルな変数など、スコープを抜けると なくなっちゃうような物を渡してはだめなわけですね。 以上の仕組みを疑似的コードにすると // 主データ構造 typedef struct DATA_MAIN{ int data1; int data2; }DATA_MAIN; DATA_MAIN DataMain;// 主データのインスタンス // 主ウインドウコールバック WndProc(...){ : DialogBoxParam( hInst,"MYDLG",hWnd, (DLGPROC)MyDlgProc, (LPARAM)&DataMain); : } // DLG のコールバック MyDlgProc(HWND hDlg,UINT msg, WPARAM wp, LPARAM lp){ static DATA_MAIN * pDatatMain_for_DLG; switch( msg){ case WM_INITDIALOG: // 主データのポインタを取得 pDatatMain_for_DLG = ( DATA_MAIN *)lp; // Editにデータを設定 SetDlgItemInt(hDlg,ID_EDIT1,pDatatMain_for_DLG->data1, TRUE); break; case IDOK: // Editの設定値を取得し、主データに戻す pDatatMain_for_DLG->data1 = GetDlgItemInt(hDlg,ID_EDIT1,NULL,TRUE); EndDialog(...); break; } }
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.