2017-09

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

モードレスダイアログボックスを作る

 モードレスダイアログボックスってのは親ウィンドウにも入力可能なダイアログボックス。親に入力できないのはモーダルダイアログボックス。

 モードレスダイアログボックスの作り方の最小限の手順は以下の通り。
1.ダイアログエディタで普通にダイアログを作成し、そのクラスも作成する。
(例としてクラスをCDlg1とする)
2.CDlg1のインスタンスを生成。
3.CDlg1のメンバ関数内でCDialog::Create(CDlg1のダイアログID , (※親ウィンドウオブジェクトのポインタ))を呼ぶ。
(CDlg1::IDDで自分のダイアログID)

 例①:Modelessというメンバ関数を作ってそこで親ウィンドウオブジェクトのポインタを渡している。
//親クラスでインスタンス(モードレスの場合はメンバ変数とかにしないと消えるよ)
CDlg1 Dlg1; 

//親クラスからの呼び出し
Dlg1.Modeless(this); 

//CDlg1クラス内のメンバ関数でCDialog::Create()の呼び出し
void CDlg1::Modeless(CWnd *pParent)
{
    CDialog::Create(CDlg1::IDD , pParent);
}

//消す時はこんな感じ。もう一度作る時はCDialog::Create()を呼べばOK
void CDlg1::OnOK()
{
    DestroyWindow();

例②:コンストラクタ内で作ってしまう場合。また、new、deleteを使ってみる。

//親クラスのメンバ変数にCDlg1クラスのポインタを作っておく
CDlg1 *Dlg1; 

//親クラスでインスタンスの生成
Dlg1 = new CDlg1(this); 

//CDlg1クラス内のコンストラクタ内でCDialog::Create()を呼ぶ。
void CDlg1::CDlg1(CWnd *pParent) : CDialog(CDlg1::IDD , pParent)
{
    //{{AFX_DATA_INIT(CDlg1)
        // メモ - ClassWizard はこの位置にマッピング用のマクロを追加または削除します。
    //}}AFX_DATA_INIT
    
    CDialog::Create(CDlg1::IDD , pParent);

//最後に親クラスでDestroyWindow() と delete とか
Dlg1->DestroyWindow(); 
delete Dlg1; 

 意外と簡単で、ダイアログとかを普通に作ってそのメンバ関数の中でCDialog::Create()を呼ぶだけ。CDialog::Create()をCDlg1のメンバ関数内で呼ぶのは、親クラスで呼ぶとなぜかエラーになる。やってることは一緒だと思うんだけど、よくわからん。

 CDialog::Create()した状態でもう一度CDialog::Create()するとエラーになるけど、DestroyWindow()は、もう一度DestroyWindow()してもエラーにならないので、うまく使えばいいかも。

 ちなみに、親クラスのメンバ変数にCDlg1のインスタンスを持たせておいて、例2のようにCDlg1のコンストラクタ内でCDialog::Create()を行うと、親ウィンドウがない状態になり、もう一つ普通に違うダイアログが出た状態になる。重なりの順位が変えられるのと、タスクバーにアイコンがもう一つ出るところが違う。

スポンサーサイト

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

http://ku470.blog68.fc2.com/tb.php/7-298137f6
この記事にトラックバックする(FC2ブログユーザー)

«  | HOME |  »

プロフィール

ku_470

Author:ku_470
HP

FLVP (FLVプレイヤー)
Vector
説明

カテゴリー

最近の記事

最近のコメント

最近のトラックバック

FC2カウンター

リンク

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。