環境は
VC6++、Win2000 です。
ビューから、親ウィンドウなしの独立したサブウィンドウを作成し、そのウィンドウでデータを
入力し、データ入力が間違っていた場合、メッセージボックスで警告するコードを書いていま
す。
現象は、サブウィンドウが何回か点滅し中途半端な描画で止まり、最後にメッセージボックスが
表示されるのですがフォーカスはサブウィンドウのままです。
CSubWnd* m_pView;
・・・・・・・・・・・・・
HBRUSH hBrush = CreateSolidBrush(RGB(220, 220, 220));
m_pView->CreateEx(0, AfxRegisterWndClass(NULL, NULL, hBrush), title,
WS_VISIBLE | WS_CAPTION | WS_THICKFRAME , CRect(150,150,700,500), NULL, NULL);
・・・・・・・・・・・・・
m_pView->SetWindowPos(&wndTop, NULL, NULL, NULL, NULL, SWP_NOMOVE | SWP_NOSIZE);
・・・・・・・・・・・・・
// 以下のコードは、OnDraw(),サブウィンドウのOnPaint()と両方で試しています。
if(errorflag == 1)
{
if(IDOK == AfxMessageBox(AとBを同時に選択することはできません。,MB_OK |
MB_APPLMODAL))
{
errorflag = 0;
}
}
以上です。
メッセージボックスにフォーカスを移せばよいと思うのですが、方法がわかりません。
よろしくお願いします。
レスが付かないようですが
ひょっとしたら、OnDraw()やOnPaint()に
AfxMessageBoxを記述しているからでは?
>// 以下のコードは、OnDraw(),サブウィンドウのOnPaint()と両方で試しています。
その場所にAfxMessageBoxは想像つかないんですが。
レスありがとうございます。
初心者なので、使い方が間違っているのかもしれません。
データ入力の正誤をドキュメントクラスで判定し、UpdateAllView()を呼び出しています。
OnDraw()やOnPaint()内で、AfxMessageBox()を記述しています。
ビューウィンドウを親ウィンドウしたサブウィンドウを作成するとうまくいきます。
ところが、サブウィンドウを移動すると、フレームにサブウィンドウの残像が残ってしまいま
す。
m_pView->CreateEx(0, AfxRegisterWndClass(NULL, NULL, hBrush), title,
WS_VISIBLE | WS_CAPTION | WS_THICKFRAME , CRect(150,150,700,500), this, NULL);
よろしくお願いします。
描画の最中にデータチェックしてはいけません。
なぜかというと、
OnDraw()やOnPaint()は、UpdateAllView()を呼びだしたときだけではなく、
サブウィンドウがスクロールしたり、別のウィンドウで隠されていた部分が現れ
たり、と様々な理由で(OSから)呼びだされます。
つまり、プログラム内でOnDraw()やOnPaint()がいつ呼ばれるのかは予測できな
いのです。
今回の場合、メッセージボックスが表示されると、サブウィンドウの一部をおお
い隠すので、それが原因でOnDraw()やOnPaint()が呼ばれます。
OnDraw()やOnPaint()の中では、メッセージボックスを表示します。
これではウィンドウズメッセージの無限ループです。
結論としては、
UpdateAllView()を呼んでいる場所でデータチェックを行い、NGならメッセージ
ボックスを表示するだけ、OKだったら初めてUpdateAllView()を呼ぶようにしま
しょう。
ありがとうございました。
描画の最中に、メッセージボックスを呼び出すのを止めまたところ、うまくいきました。
今後、気をつけます。