
はじめまして質問させてください。
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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
画面を強制的に再描画させる方法
C言語・C++・C#
-
VC++スレッドの正しい終了のさせかた
C言語・C++・C#
-
-
4
MFC、ダイアログベースでのモードレス作成
C言語・C++・C#
-
5
MFC ダイアログ上のID取得について
C言語・C++・C#
-
6
EDITコントロールで入力できる文字を制限するには?
C言語・C++・C#
-
7
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
8
ダイアログ内コントロールの位置取得について
C言語・C++・C#
-
9
CEdit の内容が変わった時にメッセージを表示させたい
C言語・C++・C#
-
10
エディットボックスの入力制限について
C言語・C++・C#
-
11
MFCのワーカースレッドとUIスレッドの使い分け
C言語・C++・C#
-
12
MFCでOnPaintのタイミング
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
このコンパイルエラーの意味に...
-
ダイアログ表示時にチェックボ...
-
MFCアプリのコマンドラインでパ...
-
イベントにAddHandlerされてい...
-
FriendとPublicの違い。。。
-
エディットコントロールでEnter...
-
既定のコンストラクタがない?
-
CMainFrameクラスの使い方
-
関数の呼び出し元の検索
-
ボタンのオーナードローについて
-
MFCのCListCtrlでスクロールを検出
-
不要になった、普通の構造体の処理
-
MenuStripの継承でプロパティが...
-
DLLからEXEのクラスを呼び出す...
-
【ASP.NET】 独自で作成したク...
-
Delphi2007のCheckBox.Font.Col...
-
オーバーライド関数の呼び出し...
-
privateなメンバ関数をテストす...
-
OnPaintとOnDraw関数の違いにつ...
-
(UWSC) 「#32770」の意味わかり...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA チェックボックスをオーバ...
-
FriendとPublicの違い。。。
-
イベントにAddHandlerされてい...
-
既定のコンストラクタがない?
-
ダイアログ表示時にチェックボ...
-
(UWSC) 「#32770」の意味わかり...
-
【ASP.NET】 独自で作成したク...
-
エディットコントロールでEnter...
-
クラスのアドレスを引数として...
-
WindowsAPIのリストビューの...
-
エディットコントロールのイベ...
-
MFCアプリのコマンドラインでパ...
-
ボタンのオーナードローについて
-
正規表現 [^/]+ の意味を教えて
-
C++ protectedにアクセス不可
-
このコンパイルエラーの意味に...
-
MFCのドラッグ&ドロップについて
-
C# 別プロジェクトのフォームを...
-
オーバーライド関数の呼び出し...
-
MFCのCListCtrlでスクロールを検出
おすすめ情報