- 締切済み
win32api c言語 メニュー表示 リソース
Borland C++ Compiler 5.1.1を使ってwindowsプログラミングを しているのですがメニューの表示ができません 参考にしているページ http://wisdom.sakura.ne.jp/system/winapi/win32/win76.html http://www.geocities.jp/ky_webid/win32c/028.html ソースはまるまるコピーしているので exeファイルの生成から実行、ウィンドウの表示までは問題ないです brc32 xxx.rc xxx.exe と指定してもexeファイルには変化が無く(tdumpで確認してもresource欄に変化なし) .RESファイルが作成されるのみで exeファイルを実行してもメニュー表示はありませんでした 続いて(先ほど生成されたファイルは一旦削除) bcc32 -c -W xxx.c brcc32 xxx.rc ilink32 xxx.obj, , , , ,xxx.RES としてみたところexeファイルに変化があり その他ilc ild ilf ils map tdsといったファイルも同時に生成されました ですが実行してみたところ「有効なwin32アプリケーションではありません」とのこと 参考にしているサイトどちらのソースも同じ状況になります・・・ 分かる方指摘の方お願いします
- みんなの回答 (3)
- 専門家の回答
みんなの回答
こんにちは。 #2です。 プログラムの不具合の原因が中々掴めないような場合は、プログラムの動作が、 『何処まで正常か』 or 『何処で失敗しているか』 を見極める作業(デバッグ)が必要だと思います。 そのためには、実行時の特定データあるいは、関数の戻り値などをチェックし、 正常or異常を細かく見ていくしかないと思います。 手始めに、#2のプログラムで言えば、WinAPIのLoadMenu()、SetMenu()あたり が怪しそうなので、これらの関数の戻り値がどうなっているかを見ることから始 めた方が良いかもしれません。 以下は、#2のプログラムに戻り値チェックを追加したサンプルです。 この辺りから検証してみて下さい。 ■LoadMenu()、及び、SetMenu()の戻り値チェック挿入部分 注)下記サンプルでは、インデントに全角スペースを入れています。 使用する際は半角スペースorタブに置換して下さい。 ================================= //ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { static HMENU hMenu; LPVOID lpMsgBuf = NULL; //※メッセージ用 BOOL bRes; //※戻り値用 switch( msg ) { case WM_CREATE: //ウィンドウが作られたとき //メニューリソースをロードする hMenu = LoadMenu( NULL, _T("IDR_MENU") ); //※戻り値チェック if(hMenu==NULL){ //エラーメッセージ表示 FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL ); MessageBox( NULL, lpMsgBuf, _T("GetLastError: LoadMenu()"), MB_OK | MB_ICONINFORMATION ); LocalFree( lpMsgBuf ); lpMsgBuf = NULL; } else{ //成功メッセージ表示 MessageBox( NULL, _T("LoadMenu()は成功しました。"), _T("LoadMenu()"), MB_OK | MB_ICONINFORMATION ); } //ウィンドウにメニューリソースを割り当てる bRes = SetMenu( hWnd, hMenu ); //※戻り値チェック if(bRes==FALSE){ //エラーメッセージ表示 FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL ); MessageBox( NULL, lpMsgBuf, _T("GetLastError: SetMenu()"), MB_OK | MB_ICONINFORMATION ); LocalFree( lpMsgBuf ); lpMsgBuf = NULL; } else{ //成功メッセージ表示 MessageBox( NULL, _T("SetMenu()は成功しました。"), _T("SetMenu()"), MB_OK | MB_ICONINFORMATION ); } return 0; --以降変更なし-- : =================================
こんにちは。 コンパイル時または、リソースファイルとの結合時、及びリンク時に何かしらの エラー(または、warning)は出ていないでしょうか? 念のため、ご使用の環境での、bcc32.exe等のユーティリティへのパス設定、 及び、インクルードファイル&ライブラリファイルのパス設定が正しく設定され ているかどうかを確認された方が良いかもしれません。 ※もしも、BCC以外の開発環境(VC++、MinGW、Cygwin等)を共存させている 場合は、それらの環境設定の状態(参照パスの優先度、競合等)により、 ビルド作業時(実行ファイル生成)や、実行ファイルの実行時に問題が発生 する可能性があります。 当方の環境(BCC5.5.1)で、以下のソースファイル及び、バッチファイルを使用 してビルド作業を行ったところ、正常に実行ファイルが作成され、実行時も問題 なく動作し、メニュー表示等が行われました。 ですので、宜しければ質問者さんの環境でも、以下のファイルを使用して検証 してみて下さい。 ■ソースファイル 1)リソーススクリプト ファイル名: "Test1.rc" ======================================== #include "resource.h" /*リソーススクリプト*/ IDR_MENU MENU { POPUP "FILE(&F)" { MENUITEM "開く(&O)" , ID_FILE MENUITEM "終了(&X)" , ID_EXIT } POPUP "HELP(&H)" { MENUITEM "ヘルプ表示(&P)" , ID_HELP MENUITEM "バージョン情報(&V)" , ID_VERSION } } ======================================== 2)リソース用ヘッダファイル ファイル名: "resource.h" ======================================== #define ID_FILE 0 #define ID_EXIT 1 #define ID_HELP 2 #define ID_VERSION 3 ======================================== 3)メインプログラムソース ・ご提示の下記参考サイトのページの2番目(下の方)のソースを、そのまま 使用させて頂きました。 ・ファイル名は、"Test1.c" とします。 ◎Win32API(C言語)編 第28章 メニューバーを作る http://www.geocities.jp/ky_webid/win32c/028.html ■実行ファイル作成用バッチファイル ・下記のバッチファイルを使用しビルドを行いました。 ・上記のソースファイルと下記のバッチファイルは、全て同一フォルダに置いて 下さい。 ・1)で上手くいかなかった場合は、2)の方で試してみて下さい。 注)リソーススクリプトのファイル名と、メインプログラムソースのファイル名は 拡張子を除いて同じにして下さい。 1)デフォルト設定を利用するバージョン ファイル名: "make1.bat" ======================================== bcc32 -W -w-8057 %1.c brc32 %1.rc %1.exe ======================================== <使用例> **> make1 Test1 ←ソース名(拡張子なし)を指定 2)インクルード&ライブラリのパス等のオプション指定バージョン ・下記バッチファイルの『インクルードパス』、及び、『ライブラリパス』は、 ご使用の環境に合わせて変更して下さい。 ファイル名: "make2.bat" =========================================================== bcc32 -IC:\borland\bcc55\Include -LC:\borland\bcc55\Lib -W -w- %1.c brc32 -iC:\borland\bcc55\Include -x -32 -V4.0 %1.rc %1.exe =========================================================== <使用例> **> make2 Test1 ←ソース名(拡張子なし)を指定 以上です。
- usatan2
- ベストアンサー率37% (163/436)
直接の回答ではありませんが、 BccWin + BccForm を活用されたらメニュー表示が簡単に作れますよ。 <準備> BccWinをインストール BccFormを解凍 BccWin起動 オプション - ツール設定 で BccForm を登録 <利用> ファイル - 新規 - 新規プロジェクト - ウインドウズ型 新規プロジェクトを作成 にチェック ファイル作成 - C言語ソースファイルに「form.c」- OK ビルドボタン、実行ボタン で Hello のフォームが完成。 <画面の設計> ツール - BCCForm でリソースエディタを起動する リソースタイプの「ダイヤログ」の行をクリックすると、画面が出る。 四角を書くとボタンが出来る(デフォルト) 右クリックで「コントロールの追加」で追加する
お礼
詳しい解説ありがとうございます さっそく、書いていただいたソースとバッチファイルで実行してみたのですが コンパイルは問題なくでき(warning等も表示はされず)、生成されたexeファイルも 実行はできるのですが、やはりメニューは表示されず・・・ あらためて環境変数やcfgファイルの中身を確認してみたものの不審な点も見当たらず・・・ もうすこし考えてみようと思います。