メニューバーからダイアログを開く

[戻る]
@松本 2008/02/05(火) 21:58:35
Visual C++6.0初心者の@松本と申します。
開発環境WinXP(SP2)、Win32でプログラムを作成しております。

リソースエディタで作成したダイアログにメニューバーを付けています。
そのメニューをプルダウンして表示させたいくつかのメニューの1つを選択すると
別のダイアログを表示させるには、どのように記述すると良いのでしょうか。

LRESULT CALLBACK    About( HWND, UINT, WPARAM, LPARAM );
上記の関数とswitch()文を用いて記述してみたのですが・・・
参考書などで調べてもMFCを用いて記述されているものが多く、
行き詰ってしまい、こちらで投稿させて頂きました。
初歩的な内容で失礼にあたるかと思いますが、
どなたかお分かりの方ご教授お願い致します。

oops 2008/02/05(火) 23:58:03
とりあえずここ行ってみ
http://www.kumei.ne.jp/c_lang/sdk/sdk_13.htm

@松本 2008/02/06(水) 19:21:42
oopsさんご返答ありがとうございます。
URLのページを参考に下記のようにプログラムを記述しました。
実行させたところ、ダイアログのメニュー(POP_HELP1_IDD)をクリックしても
ダイアログ(IDD_DIALOGBOX1)が表示されません。
エラー,警告はともに0です。
プログラムの記述を間違えているのでしょうか?
よろしければ、訂正・助言をお願い致します。

グローバル変数
 HINSTANCE hInst; 
を宣言し、関数プロトタイプ宣言で
LRESULT CALLBACK    WndProc( HWND, UINT, WPARAM, LPARAM );
LRESULT CALLBACK    Help( HWND, UINT, WPARAM, LPARAM );
の2つを宣言しました。

// ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
   int wmId;
   switch( message ){

   case WM_COMMAND:
        wmId    = LOWORD(wParam); 

     switch( wmId ){
       case POP_HELP1_IDD:
               DialogBox(hInst, (LPCTSTR)IDD_DIALOGBOX1, hWnd, (DLGPROC)Help);
          break;
        default:
          return DefWindowProc( hWnd, message, wParam, lParam );
          }
          break;
     }
     return 0;
}

//メッセージハンドラ
LRESULT CALLBACK Help( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam )
{
     switch( message ){
    case WM_INITDIALOG:
        return TRUE;

    case WM_COMMAND:
        if( LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL ) {
            EndDialog(hDlg, LOWORD(wParam));
            return TRUE;
        }
        break;
    }
    return FALSE;
}

2008/02/06(水) 20:28:13
メニューバーをつけたダイアログのプロシージャがWndProcだったならそれでもいい
気がしますが、Aboutを使って〜となっているのが気になります。
「メニューバーをつけたダイアログ」を表示するときにDialogBoxの引数で指定した
プロシージャは本当にWndProcですか?

oops 2008/02/07(木) 17:26:01
hInstが空とか?

oops 2008/02/07(木) 17:30:14
あと

// ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
   int wmId;
   switch( message ){

   case WM_COMMAND:
        wmId    = LOWORD(wParam); 

     switch( wmId ){
       case POP_HELP1_IDD:
               DialogBox(hInst, (LPCTSTR)IDD_DIALOGBOX1, hWnd, (DLGPROC)Help);
          break;
        default:
          return DefWindowProc( hWnd, message, wParam, lParam );
          }
          break;
     }
     return 0;
}

で
    WPARAM wp
って定義してるのに
    wmId    = LOWORD(wParam);
とかなってるし、最後の break; も不要やし。

oops 2008/02/07(木) 17:36:47
とりあえずソースがおかしすぎる。

return DefWindowProc( hWnd, message, wParam, lParam ); の位置もおかしいし。

もう一回上のURLのソースと見比べてみ。

@松本 2008/02/16(土) 18:01:12
麩さん、oopsさんご返答ありがとうございます。
もう1度ソースを確認し、書き換えたものを載せます。

>>「メニューバーをつけたダイアログ」を表示するときに
DialogBoxの引数で指定したプロシージャは本当にWndProcですか?

下記はメニューバーをつけたダイアログを表示させる部分のソースです。
この部分を間違えているのでしょうか?
Visual C++を始めて間もなく、勉強不足で簡単なことを質問しているのだと
思いますが、ご教授のほどお願い致します。
////////////////////////////////////////////////////////
//
//    Function : WinMain ( HINSTANCE, HINSTANCE, LPSTR, int )
//
////////////////////////////////////////////////////////
int        PASCAL WinMain ( HINSTANCE hInstance, HINSTANCE 
hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
    int        Ret;

    hPrevInstance = hPrevInstance;
    lpCmdLine = lpCmdLine;
    nCmdShow = nCmdShow;
    // Create Dialog
    Ret = DialogBox( hInstance, MAKEINTRESOURCE(IDD_DIALOG), NULL, 
DIO_Sample );
    return Ret;
}


LRESULT CALLBACK    WndProc( HWND, UINT, WPARAM, LPARAM );
LRESULT CALLBACK    Help( HWND, UINT, WPARAM, LPARAM );

// ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
   int wmId;
   switch( message ){

   case WM_COMMAND:
       wmId = LOWORD(wParam); 

     switch( wmId ){
             case IDM_DIALOG1:
               DialogBox(hInst, (LPCTSTR)IDD_DIALOGBOX1, hWnd, (DLGPROC)Help);
          break;
       default:
          return (DefWindowProc( hWnd, message, wParam, lParam ));
               break;
          }
     }
     return 0;

}
//メッセージハンドラ
LRESULT CALLBACK Help( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam )
{
     switch( message ){
    case WM_INITDIALOG:
        return TRUE;

    case WM_COMMAND:
        if( LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL ) {
            EndDialog(hDlg, LOWORD(wParam));
            return TRUE;
        }
        break;
    }
    return FALSE;

}

oops 2008/02/16(土) 18:40:01
えっと間違いが多すぎるからどこから突けばいいか…


int        PASCAL WinMain ( HINSTANCE hInstance, HINSTANCE 
hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
    int        Ret;

    hPrevInstance = hPrevInstance;
    lpCmdLine = lpCmdLine;
    nCmdShow = nCmdShow;
    // Create Dialog
    Ret = DialogBox( hInstance, MAKEINTRESOURCE(IDD_DIALOG), NULL, 
DIO_Sample );
    return Ret;
}


最初の
    hPrevInstance = hPrevInstance;
    lpCmdLine = lpCmdLine;
    nCmdShow = nCmdShow;
の意味がわからんのと、DialogBox関数のDIO_Sampleが何者かわからん。


あとまだ
    return (DefWindowProc( hWnd, message, wParam, lParam ));
の位置がおかしいよ。

oops 2008/02/16(土) 19:12:12
とりあえず適当やけど作ってみた。

ソース丸写しするんじゃなくて、自分のどこが間違ってるか確かめてね



#include <windows.h>
#include "resource.h"


LRESULT CALLBACK Dialog1Proc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK Dialog2Proc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
           LPSTR lpCmdLine, int nCmdShow)
{
    DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL,
            (DLGPROC)Dialog1Proc);
    return 0;
}

LRESULT CALLBACK Dialog1Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    HINSTANCE hInstance;

    switch(uMsg)
    {
        case WM_COMMAND:
            switch(LOWORD(wParam))
            {
                case IDM_DIALOG:
                    hInstance = (HINSTANCE)GetWindowLong(hDlg, GWL_HINSTANCE);

                    DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG2), hDlg,
                            (DLGPROC)Dialog2Proc);
                    break;
                case IDOK:
                    EndDialog(hDlg, 0);
                    break;
                case IDCANCEL:
                    EndDialog(hDlg, 0);
                    break;
            }
            break;
        default:
            return FALSE;
    }
    return TRUE;
}

LRESULT CALLBACK Dialog2Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
        case WM_COMMAND:
            switch(LOWORD(wParam))
            {

                case IDCANCEL:
                    EndDialog(hDlg, 0);
                    break;
            }
            break;
        default:
            return FALSE;
    }
    return TRUE;
}

oops 2008/02/16(土) 19:14:16
違う間違えた。。

スレ汚してゴメンね。


#include <windows.h>
#include "resource.h"

LRESULT CALLBACK Dialog1Proc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK Dialog2Proc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
           LPSTR lpCmdLine, int nCmdShow)
{
    DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL,
            (DLGPROC)Dialog1Proc);
    return 0;
}

LRESULT CALLBACK Dialog1Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    HINSTANCE hInstance;

    switch(uMsg)
    {
        case WM_COMMAND:
            switch(LOWORD(wParam))
            {
                case IDM_DIALOG:
                    hInstance = (HINSTANCE)GetWindowLong(hDlg, GWL_HINSTANCE);

                    DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG2), hDlg,
                            (DLGPROC)Dialog2Proc);
                    break;
                case IDCANCEL:
                    // 閉じるときの処理
                    EndDialog(hDlg, 0);
                    break;
            }
            break;
        default:
            return FALSE;
    }
    return TRUE;
}

LRESULT CALLBACK Dialog2Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
        case WM_COMMAND:
            switch(LOWORD(wParam))
            {
                case IDOK:
                    EndDialog(hDlg, 0);
                    break;
                case IDCANCEL:
                    EndDialog(hDlg, 0);
                    break;
            }
            break;
        default:
            return FALSE;
    }
    return TRUE;
}

@松本 2008/02/20(水) 12:25:54
[[解決]]
oopsさんご教授のほどありがとうございます。
ダイアログを呼び出す命令の引数が何と対応しているのか分かっていなかったのと、
CALLBACK関数の基本的な構造やプロシージャについての勉強不足でした。

呼び出したダイアログに関しては、表示させて後は閉じるだけで良いので
プッシュボタン等の命令を変更しました。
プログラムの方を訂正し、実行させたところ正しく動作するようになりました。
これからプログラムのメインループとの統合を行おうと思っています。
丁寧に教えて下さり、本当にありがとうございました。

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