如题。就像VB一开始就有的那种对话框一样。但是没有主窗体。
代码如下:
#include<windows.h>bool CALLBACK DlgProc(HWND hDlg, UINT Message, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpszCmdParam, int nCmdShow)
{
HWND hWnd;

DialogBox(hInst, "IDD_DIALOG1", NULL, (DLGPROC)DlgProc); return 0;
}bool CALLBACK DlgProc(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;
}对话框在资源文件resource.h中建立IDD_DIALOG1 DIALOG 0, 0, 380, 218
STYLE WS_CAPTION | WS_SYSMENU
CAPTION "Test Dialog"
BEGIN
    DEFPUSHBUTTON   "确定",IDOK,103,183,50,14
    PUSHBUTTON      "取消",IDCANCEL,209,183,50,14
    CTEXT           "Hello World",IDC_STATIC,75,53,220,69,SS_CENTERIMAGE | 
                    SS_ENDELLIPSIS | WS_BORDER,WS_EX_CLIENTEDGE
END用vc .net 2003编译没有问题,但是运行的时候却没有生成对话框,程序直接返回。

解决方案 »

  1.   

    DialogBox(hInst, "IDD_DIALOG1", NULL, (DLGPROC)DlgProc);
    改为
    DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC)DlgProc);
      

  2.   

    试了一下 编译时提示main.cpp(10): error C2065: “IDD_DIALOG1” : 未声明的标识符我记得书上讲对于#define定义的数字作标识符采用MAKEINTRESOURCE吧
      

  3.   

    在你的resource.h文件中加上
    #define IDD_DAILOG1 100
    在你的cpp文件中加上
    #include "resource.h"
      

  4.   

    嗯,缺少资源头文件
    #include "resource.h"
      

  5.   

    不好意思,前面那个文件应该是resouce.rc好像不是#include的问题吧,如果没有定义常量的话,编译肯定不能通过的
      

  6.   

    #include "resource.h"....
    ....
    DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC)DlgProc);
      

  7.   

    【转贴】
    //下面是一个完整的Dlg sdk程序 其中 IDD_DIALOG 是你的对话框资源 ID
    //Alon
    /**********************************************/
    /* 显示 Dialog Box                            */
    /**********************************************/
    #include <windows.h>
    #include "resource.h"// 函数类型说明
    LRESULT CALLBACK MainDialogProc( HWND, UINT, WPARAM, LPARAM );// Windows 主函数
    int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, 
                          LPSTR lpCmdLine, int nCmdShow )
    {
        DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG),NULL,(DLGPROC)MainDialogProc);
        return TRUE;
    }// Windows 事件处理
    LRESULT CALLBACK MainDialogProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)
    {
    //消息的处理,我想你要的就是这里了
        switch(message)
        {
            case WM_COMMAND:  //IDC_CLOSE 是我在对话框中加入的一个按钮的ID 也可以关闭
                 if (LOWORD(wParam)==IDOK)   PostQuitMessage(0);
                 return TRUE;
                 break;
            case WM_CLOSE:  //关闭在这里
                 EndDialog(hDlg, TRUE); 
                 return TRUE;
                 break;
        }
        return FALSE;
    }
      

  8.   

    定义了资源, VC会自动生成 resource.h 这个头文件. 在工程下. 你要引用资源 ,必需包含此头文件.其实还有一种方法: 修改资源的名称为 串( 加上 引号就行了)比如改上面那个对话资源的 ID 为 "Dialog1" , 则不用 包含头文件,可直接用串来引用就象楼主写的那样 :
    DialogBox(hInst, "Dialog1", NULL, (DLGPROC)DlgProc);
      

  9.   

    DialogBox(hInst, "IDD_DIALOG1", NULL, (DLGPROC)DlgProc);
    这样可以没问题 谁规定一定要写成
    MAKEINTRESOURCE(IDD_DIALOG1)这样啊不过你在RC中也得用"IDD_DIALOG1"而不是IDD_DIALOG1
      

  10.   

    HWND hwnd;
    hwnd = DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC)DlgProc);
    ShowWindow(hwnd, SW_SHOW);
      

  11.   

    晕,错了,以为是CreateDialog了,呵呵~~
      

  12.   

    to horisly:按你说的试了一下还是不行。我现在的问题在于,在其他程序(有主窗体hwnd),用DialogBox(hInstance, "About", hwnd, (DLGPROC)AboutDlgProc);一点问题都没有。现在我想建个没有主窗体,只包含一个对话框的程序,直接在WinMain中用DialogBox(hInst, "IDD_DIALOG1", NULL, (DLGPROC)DlgProc);就不能执行,但可以通过编译。我想是不是第三个参数指定对话框的父窗体改为NULL引起的?但这里没有主窗体,所以应该是NULL啊。请高手指点。
      

  13.   

    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
    PSTR szCmdLine, int iCmdShow)
    {
    static TCHAR szAppName[] = TEXT ("Demo") ;
    HWND         hwnd ;
    MSG          msg ;
    RECT         rect ;
    WNDCLASS     wndclass ;
    int iError; wndclass.style         = 0 ;
    wndclass.lpfnWndProc   = WndProc ;
    wndclass.cbClsExtra    = 0 ;
    wndclass.cbWndExtra    = 0 ;
    wndclass.hInstance     = hInstance ;
    wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
    wndclass.hCursor       = NULL ;
    wndclass.hbrBackground = NULL ;
    wndclass.lpszMenuName  = NULL ;
    wndclass.lpszClassName = szAppName ; if (!RegisterClass (&wndclass))
    {
    MessageBox (NULL, TEXT ("This program requires Windows NT!"), 
    szAppName, MB_ICONERROR|MB_OK) ;
    return 0 ;
    } hwnd = CreateWindow (szAppName, TEXT ("Demo"),
    WS_MINIMIZEBOX | WS_CAPTION | WS_SYSMENU,
    CW_USEDEFAULT, CW_USEDEFAULT,
    CW_USEDEFAULT, CW_USEDEFAULT,
    NULL, hMenu, hInstance, NULL) ;
    hwndDlg = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DEMODLG), hwnd, demoDlgProc); GetWindowRect (hwndDlg, &rect) ;
    AdjustWindowRect (&rect, WS_CAPTION | WS_BORDER, FALSE) ; SetWindowPos (hwnd, NULL, 0, 0, rect.right - rect.left,
    rect.bottom - rect.top, SWP_NOMOVE) ; ShowWindow (hwndDlg, SW_SHOW) ; ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; // Normal message loop when a modeless dialog box is used. while (GetMessage (&msg, NULL, 0, 0))
    {
    if (hwndDlg == 0 || !IsDialogMessage (hwndDlg, &msg))
    {
    TranslateMessage (&msg) ;
    DispatchMessage (&msg) ;
    }
    }
    return msg.wParam ;
    }