【问题标题】:C++ Win32api, creating a dialog box without resourceC++ Win32api,创建无资源对话框
【发布时间】:2011-01-17 05:33:27
【问题描述】:

我是 win32api 编程新手。我想知道如何在非 gui 程序中创建一个对话框(不创建任何资源)。

我已经看到了一些使用 CreateIndirect 函数的示例。这是最好的方法吗?还有什么办法吗?

谢谢!

【问题讨论】:

    标签: c++ windows winapi dialog


    【解决方案1】:

    您可以使用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);
    }
    

    更复杂的解决方案是在内存中构建对话框模板结构,但这适用于对话框本身变化不大的调试代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-29
      相关资源
      最近更新 更多