お世話になります。
画面を表示中に「処理実行」ボタンを押下すると、
画面が閉じ、実行中のプログレスバー付きの
あらたな画面を表示したいと思っています。
画面の「処理実行」押下時の処理を以下の
ように書いたのですが、うまく動きません。
どうも、PostMessage関数の処理が、
新たに表示したプログレスバー付きの画面で、
キャンセル処理が動作してしまう(新たに表示したプログレスバー付きの画面
の、PostNcDestroy()関数が呼び出される)のですが、
回避方法はあるでしょうか?
ビュークラスへのポインタのpViewがなくならないように、
PostMessage関数を使っています。
//処理実行ボタン押下時処理
void CMainDlg::OnOK()
{
PostMessage(WM_COMMAND, IDCANCEL);
pView->clsAutoCal->DoModal();
//clsAutoCal:CDialogから派生したクラスの変数
//(プログレスバー付きの画面)
}
なお、VC++6.0 MFCです。
よろしくおねがいします。
CMainDlg::OnOK() を抜けてからやるのではだめですか?
CMainDlg dlg;
if( dlg.DoModal() == IDOK ){
pView->...
}
OnOKの中でIDCANCELを送る行為が意味不明です。
OnOKもOnCancelもEndDialogが呼ばれ、その戻り値がIDOKかIDCANCELかの
違いだけのような。
どうせならユーザー定義のメッセージを作ってビューに送り、
そこでモーダルダイアログを出してもらえばいいと思います。
void CMainDlg::OnOK()
{
pView->PostMessage(WM_XX,...) ;
}
XXView::OnXX(WPARAM wParam , LPARAM lParam )
{
clsAutoCal->DoModal();
}
なぜ、PostMessage(WM_COMMAND, IDCANCEL);を
OnOKの中で読んでいるのかをきちんと説明した方が良いと思います。
名古屋さんが作成しているプログラムの内部的な仕組みを知っていないと
なぜそうなるのか分かりませんから。
あと、CMainDlgがモーダルならPostMessageとかを使わずに
EndDialogを呼ぶのが普通でしょう。
OnCancelの処理が呼びたいのであれば、その部分を内部関数にして
OnCancelとOnOKから呼ぶようにした方がいいです。
私もてつやさんの意見に賛成で、Viewにやらせたい仕事であるなら
Viewにやらせた方がいいです。ポインタを引き回して使うよりも
メッセージで連携をとらせた方がウインドウ間の結合度が低く抑えられるので
再利用しやすいですし。
解答ありがとうございます。
>CMainDlg::OnOK() を抜けてからやるのではだめですか?
>CMainDlg dlg;
>if( dlg.DoModal() == IDOK ){
> pView->...
>}
説明不足でしたが、CMainDlgは、モードレスで表示しています。
モードレスでは無理ですよね?
ユーザー定義のメッセージは知識がないので一度調べてみようと
おもいます。
#外していたらごめんなさい。
> 説明不足でしたが、CMainDlgは、モードレスで表示しています。
> //処理実行ボタン押下時処理
> void CMainDlg::OnOK()
> {
> PostMessage(WM_COMMAND, IDCANCEL);
> pView->clsAutoCal->DoModal();
> //clsAutoCal:CDialogから派生したクラスの変数
> //(プログレスバー付きの画面)
> }
え〜っと、CMainDlg::OnOK()のなかで、DoModal()を呼んでいるので、
そこから抜けない限り、CMainDlgの処理が進まないからでは?
(この場合、OnOK()から抜け出せないのでは?)
#Windowsのメッセージ関係は苦手なので、間違いがあるようなら、識者の方々、
#フォローをお願いします。
ツイート | ![]() |