はじめまして質問させてください。
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.2
- 回答日時:
によると、A::BoxDone()をオーバーライドしておけば
モードレスダイアログが破棄された時点で通知される、と
読めるのですが、どうでしょうか。
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.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.5
- 回答日時:
pB->GetSafeHandle()を使って判断は可能なようです
# 実装依存なので今後変わらないとはいえないが …
Debugモードの場合 不定値としての0xcdcdcdcdが戻り
Releaseモードでは 0が帰ってくるようです
お探しの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ランキング
-
既定のコンストラクタがない?
-
C++ protectedにアクセス不可
-
派生クラスから基本クラスprote...
-
ウィンドウの背景に画像を配置する
-
ダイアログクラスのコントロー...
-
System.Net.HttpWebRequest、も...
-
CViewクラスの切り替え
-
MFC CSplitter内にコントロール...
-
vba sendKeysを送る相手のソフ...
-
Delphi6でVB.NETで作成のDLL呼出
-
基本クラスのポインタで、派生...
-
MFCのCDialogクラスについて、、、
-
このコンパイルエラーの意味に...
-
継承を重ねた場合のコストはど...
-
Delphi2007のCheckBox.Font.Col...
-
IncludeではなくClassで宣言す...
-
FriendとPublicの違い。。。
-
C++では構造体がメンバ関数をも...
-
親クラスのコンストラクタは? ...
-
クラス メンバ関数インライン化
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
FriendとPublicの違い。。。
-
既定のコンストラクタがない?
-
イベントにAddHandlerされてい...
-
クラスのアドレスを引数として...
-
ダイアログ表示時にチェックボ...
-
(UWSC) 「#32770」の意味わかり...
-
エディットコントロールのイベ...
-
エディットコントロールでEnter...
-
WindowsAPIのリストビューの...
-
CMainFrameクラスの使い方
-
DebugクラスとTraceクラスの違い
-
MessageBoxを継承したい
-
C++ protectedにアクセス不可
-
MFCアプリのコマンドラインでパ...
-
このコンパイルエラーの意味に...
-
MFCのドラッグ&ドロップについて
-
【ASP.NET】 独自で作成したク...
-
派生クラスから基本クラスprote...
-
ダイアログクラスのコントロー...
-
C#で通常のbuttonコントロール...
おすすめ情報