2010-02-16 173 views
11

我是win32api编程的新手。我想知道如何在非gui程序中创建一个对话框(没有创建任何资源)。C++ Win32api,创建无资源对话框

我见过一些CreateIndirect函数的例子。这是最好的方法吗?任何其他方式?

谢谢!

回答

16

你会使用DialogBoxIndirectParamCreateDialogIndirectParam

有了这些功能,它更多的工作,但它可以嵌入一个简单的对话框模板代码中的一个初始化的静态结构。对话框模板的格式具有一些内置的可变大小的数组,因此必须具有特定于特定对话框的结构声明,但对于调试代码而言,这可以正常工作。

像这样的事情

#define DLGTITLE L"Debug" 
#define DLGFONT L"MS Sans Serif" 
#define DLGAPPLY L"&Apply" 
#define DLGCANCEL L"&Cancel" 
#define NUMCHARS(aa) (sizeof(aa)/sizeof((aa)[0])) 
#define IDC_BITMAP 99 

#pragma pack(push, 4)     
static struct { // dltt 

    DWORD style; 
    DWORD dwExtendedStyle; 
    WORD ccontrols; 
    short x; 
    short y; 
    short cx; 
    short cy; 
    WORD menu;   // name or ordinal of a menu resource 
    WORD windowClass; // name or ordinal of a window class 
    WCHAR wszTitle[NUMCHARS(DLGTITLE)]; // title string of the dialog box 
    short pointsize;  // only if DS_SETFONT flag is set 
    WCHAR wszFont[NUMCHARS(DLGFONT)]; // typeface name, if DS_SETFONT is set 

    // control info 
    // 
    struct { 
     DWORD style; 
     DWORD exStyle; 
     short x; 
     short y; 
     short cx; 
     short cy; 
     WORD id; 
     WORD sysClass;  // 0xFFFF identifies a system window class 
     WORD idClass;  // ordinal of a system window class 
     WCHAR wszTitle[NUMCHARS(DLGAPPLY)]; 
     WORD cbCreationData; // bytes of following creation data 
//  WORD wAlign;   // align next control to DWORD boundry. 
    } apply; 

    struct { 
     DWORD style; 
     DWORD exStyle; 
     short x; 
     short y; 
     short cx; 
     short cy; 
     WORD id; 
     WORD sysClass;  // 0xFFFF identifies a system window class 
     WORD idClass;  // ordinal of a system window class 
     WCHAR wszTitle[NUMCHARS(DLGCANCEL)]; 
     WORD cbCreationData; // bytes of following creation data 
    } cancel; 

    struct { 
     DWORD style; 
     DWORD exStyle; 
     short x; 
     short y; 
     short cx; 
     short cy; 
     WORD id; 
     WORD sysClass;  // 0xFFFF identifies a system window class 
     WORD idClass;  // ordinal of a system window class 
     WCHAR wszTitle[1]; // title string or ordinal of a resource 
     WORD cbCreationData; // bytes of following creation data 
    } bitmap; 

    } g_DebugDlgTemplate = { 

    WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU // style 0x94c800c4 
    | DS_MODALFRAME | DS_3DLOOK 
    | DS_SETFONT, 
    0x0,  // exStyle; 
    3,   // ccontrols 
    0, 0, 300, 180, 
    0,      // menu: none 
    0,      // window class: none 
    DLGTITLE,    // Window caption 
    8,      // font pointsize 
    DLGFONT, 

     { 
     WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_GROUP | BS_DEFPUSHBUTTON, // 0x50030001 
     WS_EX_NOPARENTNOTIFY, // 0x4 
     190,160,50,14, 
     IDOK, 
     0xFFFF, 0x0080, // button 
     DLGAPPLY, 0, 
     }, 

     { 
     WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON, // 0x50010000 
     WS_EX_NOPARENTNOTIFY, // 0x4 
     244,160,50,14, 
     IDCANCEL, 
     0xFFFF, 0x0080, // button 
     DLGCANCEL, 0, 
     }, 

     { 
     WS_CHILD | WS_VISIBLE | WS_GROUP | SS_LEFT, // 0x50020000 
     WS_EX_NOPARENTNOTIFY, // 0x4 
     6,6,288,8, 
     IDC_BITMAP, 
     0xFFFF, 0x0082, // static 
     L"", 0, 
     }, 
    }; 

#pragma pack(pop) 

INT_PTR CALLBACK Debug_DlgProc (
    HWND hwnd, 
    UINT uMsg, 
    WPARAM wParam, 
    LPARAM lParam) 
{ 
    switch (uMsg) 
     { 
     case WM_INITDIALOG: 
      { 
      } 
      break; 

     case WM_COMMAND: 
      { 
      UINT wId = LOWORD(wParam); 
      if (wId == IDOK || wId == IDCANCEL) 
       { 
       EndDialog (hwnd, wId); 
       } 
      } 
      break; 

     case WM_CLOSE: 
      EndDialog(hwnd, IDCANCEL); 
      break; 
     } 

    return FALSE; 
} 


LRESULT DoDebugDialog(HWND hwndApp, LPVOID pvData) 
{ 
    HINSTANCE hinst = hwndApp ? (HINSTANCE)(LONG_PTR)GetWindowLongPtr(hwndApp, GWLP_HINSTANCE) 
          : (HINSTANCE)GetModuleHandle(NULL); 

    return DialogBoxIndirectParamW (hinst, (LPCDLGTEMPLATEW)&g_DebugDlgTemplate, hwndApp, 
            Debug_DlgProc, (LPARAM)pvData); 
} 

一个更复杂的解决方案是建立在内存中的对话框模板结构,但这种行之有效的调试代码在对话框本身并没有太大变化。

+0

谢谢!非常有用的代码。 – huff 2010-02-16 02:22:39