
はじめまして質問させてください。
VC++ 2005 MFC で開発しております。
以下に動作仕様を記載いたします。
・ボタン押下でダイアログをモードレスで作成表示。
・再度ボタンが押下された場合、表示されていれば無視。
表示されていなければ新規作成。
・モードレスで作成したDlgはクローズ時に完全にDeleteしたい。
以下のように実装しましたところ、
【クラスA】メイン
B* pB;
pB = NULL;
void A::Onボタンクリック{
if( pB == NULL ){
pB = new B();
pB->Create( ID, this );
}
pB.ShowWindow( true );
}
【クラスB】モードレス
void B::OnCancel()
{
//CDialog::OnCancel();
this->DestroyWindow();
}
void B::PostNcDestroy()
{
//CDialog::PostNcDestroy();
delete this;
}
2回目以降、クラスAで「pB」がNULLにならずに判定部分ではまっております。
どのような方法が最適かお詳しい方がおられましたらご教授お願い致します。
ちなみにポインタではなくメンバ変数の場合だと
if( b.GetSafeHwnd() == NULL )
でうまくいくのですが
ポイントはモードレスダイアログの毎回Deleteです。
クラスBでフラグを持つことで解決できますが
あまりうまいやりかたではないと思うので質問させて頂きます。
以上になります。
よろしくお願い致します。
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
pB->GetSafeHandle()を使って判断は可能なようです
# 実装依存なので今後変わらないとはいえないが …
Debugモードの場合 不定値としての0xcdcdcdcdが戻り
Releaseモードでは 0が帰ってくるようです
No.4
- 回答日時:
クラスB側で破棄される場合に呼ばれる OnOKやOnCnacelでクラスA側の特定の関数を呼ぶようにコーディングしましょう
void A::MyDone()
{
pB = NULL;
}
といった publicアクセスのメンバ関数を用意しておいて
クラスB側で
void B::OnOK()
{
((A*)this->GetParent())->MyDone();
this->DestroyWindow();
}
void B::OnCancel()
{
((A*)this->GetParent())->MyDone();
this->DestroyWindow();
}
といった具合にします
または RegisterWindowMessegeでクラスBを閉じる場合にクラスAに通知するメッセージを登録しておいて
OnOKには
this->GetParent()->PostMessage( uMsgRegist, 1, 0 );
OnCancelには
this->GetParent()->PostMessage( uMsgRegist, 0, 0 );
などとしておいて
クラスA側のメッセージマップに
ON_REGISTERED_MESSAGE( uMsgRegist, MyDoneCallBack )
メンバ関数として
LRESULT A::myDoneCallBack(WPARAM wParam, LPARAM lParam)
{
pB = NULL;
if ( wParam == 1 ) {
// OKで閉じたとき
} else {
// Cancelで閉じたとき
}
}
といった具合でしょう
No.3
- 回答日時:
こんばんは。
飽くまで参考意見という事で。クラスBをシングルトンにする。
ただ、質問には「クラスBにフラグ等を持たせたく無い」とあるので、私ならこうする。
【クラスA】メイン
class A : public CDialog
{
public:
//フラグを操作するメンバ関数
void SetFlag(bool flagB)
{
this->m_flagB = flagB;
}
private:
//クラスBダイアログが開いているかどうか 初期はfalse
bool m_flagB;
//その他色々
};
void A::Onボタンクリック()
{
//フラグが上がっているので引き返す
if(m_flagB)
return;
//フラグを上げる
m_flagB = true;
//クラスBダイアログを開く
B* pB = new B();
pB->Create(ID, this);
pB->ShowWindow(SW_SHOW);
}
【クラスB】モードレス
void B::OnCancel()
{
// TODO: この位置に特別な後処理を追加してください。
A* p = dynamic_cast<A*>(this->GetParent());
if(p)
{
p->SetFlag(false);
}
this->DestroyWindow();
}
void CDlgB::PostNcDestroy()
{
// TODO: この位置に固有の処理を追加するか、または基本クラスを呼び出してください
delete this;
}
No.2
- 回答日時:
によると、A::BoxDone()をオーバーライドしておけば
モードレスダイアログが破棄された時点で通知される、と
読めるのですが、どうでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript jQueryで同じクラス名のものを別物として扱いたい 1 2022/06/17 14:14
- JavaScript jQueryでのレスポンシブが綺麗に動かない 3 2022/06/21 11:08
- MySQL PHPとMySQLを使った掲示板の作り方 1 2022/06/02 13:00
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- 高校 高2数Bの質問です。 ベクトル PB+DS-PS-XB=DX を証明する問題です。 →は省略させて頂 2 2022/05/15 01:03
このQ&Aを見た人はこんなQ&Aも見ています
-
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
画面を強制的に再描画させる方法
C言語・C++・C#
-
MFC ダイアログ上のID取得について
C言語・C++・C#
-
-
4
VC++スレッドの正しい終了のさせかた
C言語・C++・C#
-
5
MFC、ダイアログベースでのモードレス作成
C言語・C++・C#
-
6
CEdit の内容が変わった時にメッセージを表示させたい
C言語・C++・C#
-
7
テキストボックスからフォーカス外す
C言語・C++・C#
-
8
MFCでSDIからダイアログの呼び出し
C言語・C++・C#
-
9
EDITコントロールで入力できる文字を制限するには?
C言語・C++・C#
-
10
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
11
MFCでコンボボックスを選択不可状態にしたい
C言語・C++・C#
-
12
ダイアログ内コントロールの位置取得について
C言語・C++・C#
-
13
エディットボックスの入力制限について
C言語・C++・C#
-
14
ビジュアルC++でボタンの有効/無効
C言語・C++・C#
-
15
MFCのワーカースレッドとUIスレッドの使い分け
C言語・C++・C#
-
16
MFCでOnPaintのタイミング
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA チェックボックスをオーバ...
-
EXCEL VBAでのマッチング処理
-
ボタンのオーナードローについて
-
(UWSC) 「#32770」の意味わかり...
-
ダイアログ表示時にチェックボ...
-
FriendとPublicの違い。。。
-
【C++】相互参照
-
任意の解像度のメモリデバイス...
-
既定のコンストラクタがない?
-
MFCでSDIからダイアログの呼び出し
-
継承を重ねた場合のコストはど...
-
MenuStripの継承でプロパティが...
-
VC++ 7.1 で メインウィンドウ...
-
イベントにAddHandlerされてい...
-
名前空間について
-
DataContextについて
-
継承したクラスを、継承元のク...
-
ビットマップボタンを押したと...
-
MFC 分割ウィンドウのそれぞれ...
-
ダイアログクラスのコントロー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA チェックボックスをオーバ...
-
FriendとPublicの違い。。。
-
既定のコンストラクタがない?
-
イベントにAddHandlerされてい...
-
(UWSC) 「#32770」の意味わかり...
-
ボタンのオーナードローについて
-
MFCアプリのコマンドラインでパ...
-
ダイアログ表示時にチェックボ...
-
【ASP.NET】 独自で作成したク...
-
エディットコントロールでEnter...
-
MFCのドラッグ&ドロップについて
-
オーバーライド関数の呼び出し...
-
DataGridViewのセルに斜線を引...
-
MFCのCListCtrlでスクロールを検出
-
C++ protectedにアクセス不可
-
ダイアログクラスのコントロー...
-
クラスのアドレスを引数として...
-
エディットコントロールのイベ...
-
個々の関数について継承してい...
-
WindowsAPIのリストビューの...
おすすめ情報