リソースエディタからでなく、プログラム上で
ダイアログまたはダイアログバーにメニューを作成したいのですが
↓のプログラムでは表示されません。これだけでは足りないのでしょうか?
すみませんが、よろしくお願いします。(VC++6.0)
class CDlgTest : public CDialog
{
public:
CDlgTest(CWnd* pParent = NULL);
CMenu m_menu; //←ここでメニュークラス持つ
protected:
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
afx_msg void OnDestroy();
//<その他省略>
};
BOOL CDlgTest::PreCreateWindow(CREATESTRUCT& cs)
{
//IDR_TESTMENUのメニューはリソースエディタで作成しています。
m_menu.LoadMenu( IDR_TESTMENU ); //←リソースからメニューをロード
cs.hMenu = m_menu.GetSafeHmenu();
return CDialog::PreCreateWindow(cs);
}
void CDlgTest::OnDestroy()
{
m_menu.DestroyMenu();
CDialog::OnDestroy();
}
SetMenuメソッドでセットするとか。
完全解ではないかもしれないがご参考にはなると思います
http://www.athomejp.com/goldfish/mfc/window/ownermenu.asp
PreCreateWindowはダイアログの場合呼ばれないようです。
ですので、OnInitDailogあたりで、subaru さんのおっしゃるSetMenuで設定します。
ClassWiardで割り当ててしまうと(つまり、this->GetMenu() != NULL の状態になると
き)、何もしないでもダイアログにメニューが表示されます。
ですので、本題とは少し意味合いが違うような気もします。
> 似ているが少し違うのもありました
MFCとはまったく別なのでは?(ATL/WTLの方法)
【半解決】
ありがとうございます。
ダイアログはSetMenuを使用し、以下でうまくいきました!
BOOL CDlgTest::PreCreateWindow(CREATESTRUCT& cs)
{
m_menu.LoadMenu( IDR_TESTMENU );
SetMenu( &m_menu );
//cs.hMenu = m_menu.GetSafeHmenu();
return CDialog::PreCreateWindow(cs);
}
ただ、実際にやりたいのはダイアログではなく、CControlBarだったのです。
ダイアログでメニューを作成できれば、同じ方法でCControlBarでも
できると思ったのですが、SetMenu()で死んでしまいました。
同じようには出来ないのでしょうか・・・
CControlBarを派生したものを動的にCreateしています。
お世話かけます。。。
本題と関係ないですが、ちょっと確認です。
PreCreateWindowでうまくいったのですか?
http://msdn.microsoft.com/library/ja/default.asp?
url=/library/ja/jpdnvcpp/htm/MFCFAQ.asp
ヨリ
<MSDN>
CDialog::PreCreateWindow()が呼び出されないわけは?
ダイアログ ボックスを作成したときには、PreCreateWindowは呼び出されません。ダイ
アログ ボックス用のデータやコントロールを初期化したい場合は、OnInitDialogメッセ
ージをトラップし、そこで必要な処理をします。PreCreateWindowは、作成しているウィ
ンドウのパラメータを変更するために使用するものです
</MSDN>
とあるので、てっきり呼べないかとおもっていたんですが。
(手もとのVC6でブレイクポイントはってもこなかったし、、)
あ、すみません。
一日空いて勘違いしてしまっていました。m(__)m
PreCreateWindow()では、メニュー追加されませんでした。
OnInitDialog()の中にSetMenu()でうまくいきました。
ありがとうございます。
ControlBarのクラスの方もOnCreate()にSetMenu()を書いてみましたが
死なずに通過するものの、メニュー表示はされませんでした。
※クラスCTestCtrlBar は CControlBarクラスの派生です。
int CTestCtrlBar::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CControlBar::OnCreate(lpCreateStruct) == -1)
return -1;
m_menu.LoadMenu(IDR_TESTMENU );
this->SetMenu( &m_menu );
<その他自作コントロールのCreateなど省略>
return 0;
}
よろしくお願いします。
どうやら出来ないようです。
CDialogBarで、同じようにOnCreateでSetMenuをしたところ、0が返ってきたので、
GetLastErrorでエラーを確認したところ、
1436
子ウィンドウにメニューを表示することはできません。
だそうです。
お手数おかけいたしております。
テストプログラムまで作って試していただいてありがとうございます。
>子ウィンドウにメニューを表示することはできません。
なるほど、CControlBarは自動的に作られるフレイムの上に乗っかっているんでしたね・・・
メニュー配置はあきらめて、ボタン配置してTrackPopupMenuで
似たようにしてみようと思います。
大変お世話になりました。
ありがとうございました。