ダイアログまで最小化してしまう – プログラミング – Home

ダイアログまで最小化してしまう
 
通知
すべてクリア

ダイアログまで最小化してしまう


とも
 とも
(@とも)
ゲスト
結合: 23年前
投稿: 65
 

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;
}


引用解決済
トピックタグ

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました