こんにちは
■開発環境: VC++6.0 MFC MDI, XP(SP3)
MDIアプリでViewのウィンドウの境界を掴んでサイズ変更しようとしたときに
ダイアログをDoModalで出しユーザー認証を求める、といった動作をさせたいです。
まずViewクラスのOnSize()内にダイアログ表示処理を追加したところ、
マウス操作ができない現象がありました(枠拡大カーソルのまま。tabキーでは移動可)。
他に試したこと:
ChildFrame内のOnGetMinMaxInfo()にダイアログ表示処理を記述
→この場合、マウス操作は出来るもののダイアログを閉じた後に
ウィンドウの境界を掴みっぱなしになるという現象が出てしまいました。
このような現象を回避できる方法をご教示いただけましたらと思います。
どうぞよろしくお願いいたします。
CChildFrameにて
WM_NCLBUTTONDOWN(OnNcLButtonDown)のメッセージを使う。
OnNcLButtonDownの第1引数のnHitTestの値を見れば、
押されたときにカーソルがどの位置にあるかわかる。
境界線上にあるなら、望みの処理を行う。
#2005以降しかもってないので、VC6としての資料は確認してないです。
ryoさん、ありがとうございます。
OnNcLButtonDownの中で、ダイアログを呼び出したところ
マウス操作ができない現象が回避できました。
ダイアログを閉じた後はやはり境界線を掴みっぱなしになったため、
WM_LBUTTONUPをSendしてあげることで解決できました。
>ダイアログを閉じた後はやはり境界線を掴みっぱなしになったため、
>WM_LBUTTONUPをSendしてあげることで解決できました。
推測ですが、認証・ダイアログなどの追加した処理を行ったあとに
OnNcLButtonDownの本来の動作を行っていませんか?
OnNcLButtonDownをクラスウィザードなどで追加した場合
CChildFrame::OnNcLButtonDown( nHittest,point)
{
CMDICihldFrameWnd::OnNcLButtonDown(nHittest,point); //*1
}
となっていたと思います。
この*1の行が、継承元の関数を呼び出す、つまり「本来の動作を呼び出す」ための一行
です。
なので、「本来の動作をさせたくない」場合は、こいつを避ける必要があります。
たとえば、こんな感じ
CChildFrame::OnNcLButtonDown( nHittest,point)
{
if( nHittest関連){
// 認証処理
return; //ここで抜ける
}
CMDICihldFrameWnd::OnNcLButtonDown(nHittest,point); //*1
}
仰るとおり、
CMDICihldFrameWnd::OnNcLButtonDown(nHittest,point); //*1
が必ず通るようになっていたため、でした。
とても勉強になりました。ありがとうございました!