プログラムでダイアログにメニューを作成したい – プログラミング – Home

プログラムでダイアログにメニューを作成...
 
通知
すべてクリア

[解決済] プログラムでダイアログにメニューを作成したい


らら
 らら
(@らら)
ゲスト
結合: 22年前
投稿: 93
Topic starter  

リソースエディタからでなく、プログラム上で
ダイアログまたはダイアログバーにメニューを作成したいのですが
↓のプログラムでは表示されません。これだけでは足りないのでしょうか?
すみませんが、よろしくお願いします。(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();
}


引用未解決
トピックタグ
subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

SetMenuメソッドでセットするとか。


返信引用
aharen
 aharen
(@aharen)
ゲスト
結合: 18年前
投稿: 25
 

完全解ではないかもしれないがご参考にはなると思います
http://www.athomejp.com/goldfish/mfc/window/ownermenu.asp


返信引用
aharen
 aharen
(@aharen)
ゲスト
結合: 18年前
投稿: 25
 

同じサイトだが
http://www.athomejp.com/goldfish/mfc/window/addmenu.asp
もありますね


返信引用
aharen
 aharen
(@aharen)
ゲスト
結合: 18年前
投稿: 25
 

似ているが少し違うのもありました
http://home.att.ne.jp/banana/akatsuki/doc/atlwtl/atlwtl07-03/index.html


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

PreCreateWindowはダイアログの場合呼ばれないようです。
ですので、OnInitDailogあたりで、subaru さんのおっしゃるSetMenuで設定します。

ClassWiardで割り当ててしまうと(つまり、this->GetMenu() != NULL の状態になると
き)、何もしないでもダイアログにメニューが表示されます。
ですので、本題とは少し意味合いが違うような気もします。

> 似ているが少し違うのもありました
MFCとはまったく別なのでは?(ATL/WTLの方法)


返信引用
らら
 らら
(@らら)
ゲスト
結合: 22年前
投稿: 93
Topic starter  

【半解決】
ありがとうございます。
ダイアログは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しています。
お世話かけます。。。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

本題と関係ないですが、ちょっと確認です。
PreCreateWindowでうまくいったのですか?

http://msdn.microsoft.com/library/ja/default.asp?
url=/library/ja/jpdnvcpp/htm/MFCFAQ.asp
ヨリ
<MSDN>
CDialog::PreCreateWindow()が呼び出されないわけは?

ダイアログ ボックスを作成したときには、PreCreateWindowは呼び出されません。ダイ
アログ ボックス用のデータやコントロールを初期化したい場合は、OnInitDialogメッセ
ージをトラップし、そこで必要な処理をします。PreCreateWindowは、作成しているウィ
ンドウのパラメータを変更するために使用するものです
</MSDN>
とあるので、てっきり呼べないかとおもっていたんですが。
(手もとのVC6でブレイクポイントはってもこなかったし、、)


返信引用
らら
 らら
(@らら)
ゲスト
結合: 22年前
投稿: 93
Topic starter  

あ、すみません。
一日空いて勘違いしてしまっていました。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;
}
よろしくお願いします。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

どうやら出来ないようです。

CDialogBarで、同じようにOnCreateでSetMenuをしたところ、0が返ってきたので、
GetLastErrorでエラーを確認したところ、

1436
子ウィンドウにメニューを表示することはできません。

だそうです。


返信引用
らら
 らら
(@らら)
ゲスト
結合: 22年前
投稿: 93
Topic starter  

お手数おかけいたしております。
テストプログラムまで作って試していただいてありがとうございます。

>子ウィンドウにメニューを表示することはできません。
なるほど、CControlBarは自動的に作られるフレイムの上に乗っかっているんでしたね・・・

メニュー配置はあきらめて、ボタン配置してTrackPopupMenuで
似たようにしてみようと思います。
大変お世話になりました。
ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました