たびたびすみません
まだ下のダイアログを表示するDLLでキー入力が解決していませんが
宜しくお願いします
スタティックが6個、ボタンが2つのダイアログをSDKで作成しています。
それぞれのコントロールをMoveWindowで配置しているのですが、
ウィンドウハンドルを取得する為に
hWnd = GetDlgItem(hDlgWnd, IDC_DELETE );
の様にしています。
そこで疑問なのがエラー処理の仕方です
コントロール毎に
if(hWnd != NULL){
hWnd = GetDlgItem(hDlgWnd, IDC_DELETE );
MoveWindow(hWnd,省略);
}
を記述すると思うのですが、hWndがNULLになるとMoveWindowが実行されません。
これではダメなのですが、他に方法がみつかりません
そこで、
WM_INITDIALOG内でhWnd = GetDlgItemでhWndがNULLになる事ってありますか?
たくさんのコントロールのウィンドウハンドルを取得するときの
エラー処理方法は一般的にどうなんでしょう?
宜しくお願いします。
>GetDlgItemでhWndがNULLになる事ってありますか?
(MSDNより引用)
関数が失敗すると、NULL が返ります。これは、ダイアログボックスのハンドルが無効だ
ったこと、またはコントロールが存在しなかったことを意味します。
・・逆に云えば
「ダイアログボックスのハンドルが有効である」「コントロールが存在する」
「無効なコントロールIDではない」場合は NULL にはならないってことでしょう。
つうことで、NULLになる場合は(コントロールの作成を含めて)ダイアログの作成
に失敗しているのだから、「ダイアログの作成に失敗しました」とかいうエラー
メッセージを表示して、EndDialog() で抜けるとか。
ありがとうございます。
EndDialogをOnInitDialog内で呼んだらどうなるかを調べる為に変更したのですが、
以下の様な状態になってしまいます。
ダイアログプロシージャで
case WM_INITDIALOG:
OnInitDialog(hDlgWnd);
// 色変更用ブラシの作成
g_hbrTitle = CreateSolidBrush( TITLE_BAR_COLOR ); <----ここ2
g_hbrLabel = CreateSolidBrush( LABEL_COLOR );
break;
OnInitDialogで
hWnd = GetDlgItem(hDlgWnd, IDC_DELETE );
if( hWnd != NULL ) Err(hDlgWnd); <----ここ1
MoveWindow(hWnd, 0, 0, nWidth, LABEL_HIGHT, FALSE );
void Err(HWND hDlgWnd)
{
EndDialog(hDlgWnd, IDC_DELETE);
}
とあります。
で、ここ1が動作してEndDialogが実行されます。
この時ここ2にブレークポイントを置くと固まってしまい、
VCをタスクの終了で強制終了させないと駄目な状態になります
MFCの時は気にせず好きな所にブレークポイントを置いたのですが、
SDKでは置いてはいけない所ってあるのですか?
表題と違う質問になりますが、宜しくお願いします。
関係ないかもしれないけど、OnInitDialog( HWND hDlgWnd);
も、Err( HWND hDlgWnd); も 値を返さない関数だけど、これでいいのかな?
今の状態では、Err() が呼ばれて EndDialog しても、その次の行
>g_hbrTitle = CreateSolidBrush( TITLE_BAR_COLOR );
を実行しようとするのでは?
まず、OnInitDialog内でEndDialogを呼んだとしても
その場でダイアログが終了するわけではないので先の処理を実行するはずです。
EndDialogを呼ぶのであれば、呼んだときは先の処理を実行せずにプロシージャを
抜けるようにするのが本当でしょう。
EndDialogは、あくまでもダイアログに終わって良いよと指示するだけなので
一旦、プロシージャからOSに制御が戻らないと実際の終了処理は走らないはずです。
ロジックの組み立てそのものに矛盾があるように思います。
みなさんありがとうございます。
違う箇所の問題でここの部分のソースがすっかり変わってしまいました。
なので、このスレッドは閉じます。
ありがとうございました