微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C Win32api,创建一个没有资源的对话框

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

我看到有一些CreateIndirect函数的例子.这是最好的方法吗?有什么办法吗

谢谢!

解决方法

您将使用 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,300,180,// 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,},{
      WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON,// 0x50010000
      WS_EX_nopARENTNOTIFY,// 0x4
      244,IDCANCEL,// button
      DLGCANCEL,{
      WS_CHILD | WS_VISIBLE | WS_GROUP | SS_LEFT,// 0x50020000
      WS_EX_nopARENTNOTIFY,// 0x4
      6,6,288,8,IDC_BITMAP,0x0082,// static
      L"",};

#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);
}

更复杂的解决方案是在内存中建立一个对话框模板结构,但是对于调试代码,对话框本身并没有太大变化,这样做很好.

原文地址:https://www.jb51.cc/c/113107.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐