お世話になります。
Windows 7で使っています。
ソースに対しては、
Winmainが頭に来ているので、
bcc32 -W R.c
でコンパイルをかけた後、
リソースに対しては、
brc R.rc
でコンパイル。
しかし、そのメニューが表示されないのです。
メニューの表示ルーチンは、エラーもなく通過しているようですが。
その部分は、ソースの方で、
hwnd = CreateDialog(hInstance , TEXT(Rainbow) , 0 , NULL);
if (hwnd == NULL)
return -1;
エラーを返すことなく、下に降りて行き、
while(GetMessage(&msg , NULL , 0 , 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
と、各種ボタンからのmsgを取りに行きますが、
メニューそのものが表示されないので、
クリックも押せず、永久ループに入ってしまいます。
ヘッダー Rec.h(僅か2行)
#define ID_REC 0x4566
#define ID_REC_END 0x4568
を介して
リソースは、下記のように規定しているのですが、
#include Rec.h
Rainbow DIALOG 10 , 10 , 230 , 50
FONT 12 , MS ゴシック
// STYLE WS_VISIBLE | WS_POPUPWINDOW
CLASS Rainbow
CAPTION Menu Assistance for Sound Recording (.wavファイルへの録音メニュ
ー)
{
PUSHBUTTON Record (録音開始) , ID_REC , 20 , 15 , 80 , 10
PUSHBUTTON Terminate (録音終了) , ID_REC_END , 140 , 15 , 80 , 10
}
WM_CREATEでは
下記のようにしていますが、
case WM_CREATE:
mop.dwCallback = (DWORD)hWnd;
mop.lpstrDeviceType = (LPCSTR)MCI_DEVTYPE_WAVEFORM_AUDIO;
mop.lpstrElementName = TEXT(");
L = strlen(strFile);
strFile[L] = '.';
strFile[L+1] = 'w';
strFile[L+2] = 'a';
strFile[L+3] = 'v';
strFile[L+4] = NULL;
mciSendCommand(0 , MCI_OPEN ,
MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID |
MCI_OPEN_ELEMENT , (DWORD)&mop);
return 0;
ここで、下記のような、ダイアログボックスの
コマンドは、入れていません。
それが悪いのでしょうか?
idd = DialogBox(hInst, Rainbow, hWnd, (DLGPROC)MyDlgProcX);
InvalidateRect(hWnd, NULL, TRUE);
もし、そうならば、どのように入れるのが妥当で、
先のCreateDialogとの関係は、
どうなるのでしょうか?
よろしくお願いいたします。
今、Visual Studioの方で、
調べていたら、
下記の、コードで、
ループを一回廻って、
また、whileに戻って来た
次のステップで、
どこかに、コントロールが飛んでしまっているようです。
何処に行ったのかは、ブレークポイントを
幾つも置いても、つかまらず、よくわかりません。
while(GetMessage(&msg , NULL , 0 , 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
と、言うことは、BCC特有の問題でもないようだし、
どうしてしまったのかなあ。
どこから手を付ければ・・・ という感じですが、
とりあえず
> しかし、そのメニューが表示されないのです。
は「メニュー」ではなく「ダイアログ」と表現した方がよさそうに思います。
メニューとダイアログは別概念です。
「表示されない」こと自体に関しては、
> hwnd = CreateDialog(hInstance , TEXT(Rainbow) , 0 , NULL);
> if (hwnd == NULL)
> return -1;
に続けて
ShowWindow( hwnd, SW_SHOWDEFAULT );
とでもすれば表示されるようにならないでしょうか?
もしくは、R.rc でコメントアウトされていますが、
> // STYLE WS_VISIBLE | WS_POPUPWINDOW
の WS_VISIBLE を生かす、とか。
# そもそも、「スタイルの指定なし」って大丈夫なのかわかりませんが。
表示されたとして、ボタンを押した時の処理が適切に記述されているかは
わかりませんので、正しく動作するかどうかはわかりません。
> ここで、下記のような、ダイアログボックスの
> コマンドは、入れていません。
> それが悪いのでしょうか?
> idd = DialogBox(hInst, Rainbow, hWnd, (DLGPROC)MyDlgProcX);
> InvalidateRect(hWnd, NULL, TRUE);
それは「モーダルダイアログ」とする時の記述です。
# InvalidateRect() は不要と思いますが。
CreateDialog() は「モードレスダイアログ」です。
> 今、Visual Studioの方で、
> 調べていたら、
> 下記の、コードで、
> ループを一回廻って、
> また、whileに戻って来た
「表示されていないだけ」なのでメッセージループは普通に(?)回っているのでは
ないでしょうか。
マニュアルにある通りモードレスダイアログの表示は
HWND CreateDialog(
HINSTANCE hInstance, // モジュールのハンドル
LPCTSTR lpTemplate, // ダイアログボックステンプレートの名前
HWND hWndParent, // オーナーウィンドウのハンドル
DLGPROC lpDialogFunc // ダイアログボックスプロシージャ
);
ですね。この引数は「全て省略できません」。
特にダイアログボックスプロシージャが無いのはアウトですね。
ただし、RegisterClass()でウインドウクラスを登録し、
そのクラス名称でCreateDialog()することもできます。
CreateDialog()がCreateWindow()を使用している事を利用した裏ワザに近い方法で、
(WNDCLASSにコールバックが指定されているため)
lpDialogFuncにNULLが渡せるのはこのケースだけです。
が、あまり一般的ではありません。
(というか、いまどきほんとに動くのか疑問)
うーーん、
フリーのボーランドCですよね。
Windows7用の Platform SDK は使えるのでしょうか?
コンソール上だから動作はするのでしょうけれども、XPまでのライブラリーを
使っていると、リソ-スの不一致等の不具合がでるのでは?
と思いますが、どうでしょうか?