在内存中创建模板

【勇芳软件工作室】汉化HomePreviousNext

应用有时根据正在处理的数据的当前状态来适应或修改对话框的内容。在这种情况下,提供所有可能的对话框模板作为应用程序可执行文件中的资源是不现实的。但在内存中创建模板可使应用程序更灵活地适应任何情况。

在下面的示例中,应用程序在内存中创建一个模板对话框,其中包含一条消息以及“确定”和“帮助”按钮。

在对话框模板中,所有字符串(如对话框和按钮标题)都必须是Unicode字符串。此示例使用MultiByteToWideChar函数来生成这些Unicode字符串,因为Windows NT和Windows 95都支持MultiByteToWideChar

对话框模板中的DLGITEMTEMPLATE结构必须在DWORD边界上对齐。为了对齐这些结构,此示例使用一个辅助程序,该程序接受一个输入指针,并返回在DWORD(4字节)边界上对齐的最接近的指针。

#define ID_HELP 150

#define ID_TEXT 200

LPWORD lpwAlign(LPWORD LPIN)

{

ULONG ul;

ul = (ULONG) lpIn;

ul +=3;

ul >>=2;

ul <<=2;

return (LPWORD) ul;

}

LRESULT DisplayMyMessage(HINSTANCE hinst,HWND hwndOwner,

LPSTR lpszMessage)

{

HGLOBAL hgbl;

LPDLGTEMPLATE lpdt;

LPDLGITEMTEMPLATE lpdit;

LPWORD lpw;

LPWSTR lpwsz;

LRESULT ret;

int nchar;

hgbl = GlobalAlloc(GMEM_ZEROINIT, 1024);

如果(!hgbl)

return -1;

lpdt = (LPDLGTEMPLATE)GlobalLock(hgbl);

//定义一个对话框。

lpdt->style = WS_POPUP | WS_BORDER | WS_SYSMENU

| DS_MODALFRAME | WS_CAPTION;

lpdt->cdit = 3; //控件数量

lpdt->x = 10; lpdt->y = 10;

lpdt->cx = 100; lpdt->cy = 100;

lpw = (LPWORD) (lpdt + 1);

*lpw++ = 0; //没有菜单

*lpw++ = 0; //预定义对话框类(默认情况下)

lpwsz = (LPWSTR) lpw;

nchar = 1+ MultiByteToWideChar (CP_ACP, 0, "My Dialog",

-1, lpwsz, 50);

lpw += nchar;

//-----------------------

//定义一个确定按钮。

//-----------------------

lpw = lpwAlign (lpw); //在DWORD边界上对齐DLGITEMTEMPLATE

lpdit = (LPDLGITEMTEMPLATE) lpw;

lpdit->x = 10; lpdit->y = 70;

lpdit->cx = 80; lpdit->cy = 20;

lpdit->id = IDOK; //确定按钮标识符

lpdit->style = WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON;

lpw = (LPWORD) (lpdit + 1);

*lpw++ = 0xFFFF;

*lpw++ = 0x0080; //按钮类

lpwsz = (LPWSTR) lpw;

nchar = 1+MultiByteToWideChar (CP_ACP, 0, "OK", -1, lpwsz, 50);

lpw += nchar;

lpw = lpwAlign (lpw); //对齐DWORD边界上的创建数据

*lpw++ = 0; //没有创建数据

//-----------------------

//定义帮助按钮。

//-----------------------

lpw = lpwAlign (lpw); //在DWORD边界上对齐DLGITEMTEMPLATE

lpdit = (LPDLGITEMTEMPLATE) lpw;

lpdit->x = 55; lpdit->y = 10;

lpdit->cx = 40; lpdit->cy = 20;

lpdit->id = ID_HELP; //帮助按钮标识符

lpdit->style = WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON;

lpw = (LPWORD) (lpdit + 1);

*lpw++ = 0xFFFF;

*lpw++ = 0x0080; //按钮类原子

lpwsz = (LPWSTR) lpw;

nchar = 1+MultiByteToWideChar (CP_ACP, 0, "Help", -1, lpwsz, 50);

lpw += nchar;

lpw = lpwAlign (lpw); //对齐DWORD边界上的创建数据

*lpw++ = 0; //没有创建数据

//-----------------------

//定义静态文本控件。

//-----------------------

lpw = lpwAlign (lpw); //在DWORD边界上对齐DLGITEMTEMPLATE

lpdit = (LPDLGITEMTEMPLATE) lpw;

lpdit->x = 10; lpdit->y = 10;

lpdit->cx = 40; lpdit->cy = 20;

lpdit->id = ID_TEXT; //文本标识符

lpdit->style = WS_CHILD | WS_VISIBLE | SS_LEFT;

lpw = (LPWORD) (lpdit + 1);

*lpw++ = 0xFFFF;

*lpw++ = 0x0082; //静态类

for (lpwsz = (LPWSTR)lpw;

*lpwsz++ = (WCHAR) *lpszMessage++;

);

lpw = (LPWORD)lpwsz;

lpw = lpwAlign (lpw); //对齐DWORD边界上的创建数据

*lpw++ = 0; //没有创建数据

GlobalUnlock(hgbl);

ret = DialogBoxIndirect(hinst, (LPDLGTEMPLATE) hgbl,

hwndOwner, (DLGPROC) DialogProc);

GlobalFree(hgbl);

return ret;

}