VC++については超初心者でして、初めての質問です。
環境は、Windows XP(SP2)、VC++.NET です。
現在、会社の新人研修で作成しているVC++の課題ソフトでつまづいてしまい、
作業が進まず困っております。
モーダルダイアログ上のButtonを押下することで、PostMessage関数でユーザ定義の
メッセージをCMainFrameクラスへ送り、親画面だけを最小化させたいのですが、
親に引きずられダイアログまで最小化してしまいます。
課題の仕様では、最小化した親画面をダイアログ上のButton押下で復活させることに
なっているのですが、ダイアログまで最小化している現状では、その後の一切の
操作が不可能になっております。
親画面だけ最小化することは、モーダル式のダイアログでは無理なのでしょうか?
ネット上で検索した結果、モーダルダイアログの親子関係を無くせば解消できるという
情報を得て、ダイアログ初期化処理でSetOwner(NULL)を実行してみたのですが、
何も変化が見られませんでした。
見づらいですが、参考までに拙いソースコードを載せますので、
何卒、宜しくお願い申し上げます。
以下、課題ソフトの今回関係する仕様と、ソースコードの一部です。
***************************************************************************
【仕様】
・親画面:静的3分割ウィンドウで、1つのCTreeViewと2つのCScrollViewを持つ
・親画面上のツールボタン押下で、モーダルダイアログを表示
・モーダルダイアログ上のButton押下で親画面を最小化
・モーダルダイアログ上のButton押下で最小化されていた親画面を復活表示
【ソースコード】
<CDocumentクラス:ダイアログ起動処理>
void CBmpAPDoc::OpenPlusDlg(void)
{
CPlusList cPlus; //CPlusListクラスオブジェクト
//モーダルダイアログボックスモードでダイアログボックスを起動
cPlus.m_ptrRet = cPlus.DoModal();
//終了原因は何か?
if (cPlus.m_endFlag == 3) {
//アプリケーション終了メッセージ送信
AfxGetMainWnd()->PostMessage(WM_CLOSE);
}
}
<CDialogクラス:ダイアログ初期化処理>
BOOL CPlusList::OnInitDialog()
{
bool ret;
LOGFONT logFont;
int wFull, hFull; //ディスプレイサイズ
SetOwner(NULL);
//Buttonコントロール作成&初期化
//メイン画面最小化/最大化ボタン
CButton *pbMain = new CButton;
pbMain->Create(最小化, WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
CRect(246,50,334,80), this, IDC_MAIN);
・・・ 省略(以下、ダイアログ上のコントロールの作成・初期化処理が続く)・・・
CDialog::OnInitDialog();
return TRUE; // return TRUE unless you set the focus to a control
// 例外 : OCX プロパティ ページは必ず FALSE を返します。
}
<CDialogクラス:Button押下時の処理>
void CPlusList::OnBnClickedMain()
{
bool ret1;
CString btnCap;
CWnd* p_Parent;
//親ウィンドウ=メイン画面へのポインタ取得
p_Parent = this->GetParent();
//ボタン表示を「最小化/復活」切替
int ret2 = GetDlgItemText(IDC_MAIN, btnCap); //現在のボタンのキャプシ
ョン取得
//現在のボタンキャプションは
if ( btnCap == 最小化 ) { //最小化表示→メインの状態は最大化
//ボタンキャプションを最大化に
btnCap = 復 活;
//MessageをPost(アイドルになったらメッセージ送信)
ret1 = p_Parent->PostMessage(UM_MINIMIZE, 0, 0);
}
else { //最大化表示→メインの状態は最小化
//ボタンキャプションを最小化に
btnCap = 最小化;
//MessageをPost(アイドルになったらメッセージ送信)
ret1 = p_Parent->PostMessage(UM_MAXIMIZE, 0, 0);
}
//ボタンへキャプションを書き込み
SetDlgItemText(IDC_MAIN, btnCap);
}
<CMainFrameクラス:最小化メッセージハンドラ>
LRESULT CMainFrame::OnUmMinimize(WPARAM wParam, LPARAM lParam)
{
//メインウィンドウを最小化
CloseWindow();
return 0;
}
<CMainFrameクラス:最大化メッセージハンドラ>
LRESULT CMainFrame::OnUmMaximize(WPARAM wParam, LPARAM lParam)
{
//メインウィンドウを最大化&アクティブ状態に
bool ret = ShowWindow(SW_SHOWMAXIMIZED);
return 0;
}