Borland C++で、どうしても、リソースで設定されたメニューが表示されない。

[戻る]
ちゃまいえ 2015/03/25(水) 16:32:37
お世話になります。
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との関係は、
どうなるのでしょうか?
よろしくお願いいたします。

ちゃまいえ 2015/03/25(水) 20:53:48
今、Visual Studioの方で、
調べていたら、
下記の、コードで、
ループを一回廻って、
また、whileに戻って来た
次のステップで、
どこかに、コントロールが飛んでしまっているようです。
何処に行ったのかは、ブレークポイントを
幾つも置いても、つかまらず、よくわかりません。

        while(GetMessage(&msg , NULL , 0 , 0)) 
    {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
        }
        return msg.wParam;

と、言うことは、BCC特有の問題でもないようだし、
どうしてしまったのかなあ。

K 2015/03/26(木) 13:58:22
どこから手を付ければ・・・ という感じですが、
とりあえず

> しかし、そのメニューが表示されないのです。

は「メニュー」ではなく「ダイアログ」と表現した方がよさそうに思います。
メニューとダイアログは別概念です。

「表示されない」こと自体に関しては、

> 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に戻って来た

「表示されていないだけ」なのでメッセージループは普通に(?)回っているのでは
ないでしょうか。

仲澤@失業者 2015/03/26(木) 16:00:32
マニュアルにある通りモードレスダイアログの表示は

HWND CreateDialog(
  HINSTANCE hInstance,  // モジュールのハンドル
  LPCTSTR lpTemplate,   // ダイアログボックステンプレートの名前
  HWND hWndParent,      // オーナーウィンドウのハンドル
  DLGPROC lpDialogFunc  // ダイアログボックスプロシージャ
);

ですね。この引数は「全て省略できません」。
特にダイアログボックスプロシージャが無いのはアウトですね。

ただし、RegisterClass()でウインドウクラスを登録し、
そのクラス名称でCreateDialog()することもできます。
CreateDialog()がCreateWindow()を使用している事を利用した裏ワザに近い方法で、
(WNDCLASSにコールバックが指定されているため)
lpDialogFuncにNULLが渡せるのはこのケースだけです。
が、あまり一般的ではありません。
(というか、いまどきほんとに動くのか疑問)

ITO 2015/03/31(火) 09:18:48
うーーん、
フリーのボーランドCですよね。
Windows7用の Platform SDK は使えるのでしょうか?
  コンソール上だから動作はするのでしょうけれども、XPまでのライブラリーを
 使っていると、リソ−スの不一致等の不具合がでるのでは?
と思いますが、どうでしょうか?

古いスレッドには追加発言できません。