对于我的应用程序,我需要创建一个不使用资源的对话框.我试图用DialogBoxInderect函数做到这一点.代码令人难以置信的丑陋,但不知怎的,我成功地做到了.
问题是,由于某种原因,对话框比我用更大的字体要求的要大得多.
如果我从资源加载它,对话框的样子如下:
这是我调用DialogBoxInderect函数时指定的相同大小的对话框.

以下是在代码中定义的方式:
HGLOBAL hGlobal;
LPDLGTEMPLATE wlsDialogTemplate;
LPDLGITEMTEMPLATE wlsDialogItemTemplate;
LPWORD nextItem;
LPWSTR itemString;
int32_t itemStringLength;
// Check for memory allocation errors
hGlobal = GlobalAlloc(GMEM_ZEROINIT, 1024);
if (!hGlobal)
return -1;
wlsDialogTemplate = (LPDLGTEMPLATE)GlobalLock(hGlobal);
// Define a dialog box.
wlsDialogTemplate->style = WS_CAPTION;
wlsDialogTemplate->x = 0;
wlsDialogTemplate->y = 0;
wlsDialogTemplate->cx = 320;
wlsDialogTemplate->cy = 115;
GlobalUnlock(hGlobal);
retCode = DialogBoxIndirect(0, (LPDLGTEMPLATE)hGlobal, 0, ActivateWlsMsgDialog);
Run Code Online (Sandbox Code Playgroud)
以下是RC文件中的定义方式:
IDD_WLS_SMALL_MESSAGE_DLG DIALOGEX 0, 0, 320, 115
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION
CAPTION "Dialog"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
DEFPUSHBUTTON "OK",ID_CUSTOM_OK,175,95,120,15
PUSHBUTTON "Cancel",ID_CUSTOM_CANCEL,45,95,120,15
CTEXT "Static",IDC_HEADER_TEXT,120,10,170,70
CONTROL "",IDC_LOGO,"Static",SS_BITMAP,16,10,83,70
END
Run Code Online (Sandbox Code Playgroud)
如您所见,第二个对话框比定义的大得多.我尝试使用各种风格标志,但没有任何成功(这就是为什么在更大的对话框上有红叉).
对此有何帮助?谢谢!
较大的尺寸很容易解释.Windows会根据字体自动调整对话框的大小,较大的对话框使用不同的字体.事实上,它使用的是默认的系统字体(对Windows对话框字体的困惑的问题的详细信息在我的回答被发现这里).
所以要关注的真正问题是为什么它使用不同的字体,并修复它将解决尺寸问题.
在对话框资源文件中,将DS_SETFONT标志指定为对话框样式之一.根据文档,这个标志
[i]指出对话框模板的标题(标准或扩展)包含指定客户区中文本和对话框控件的字体的附加数据.如果可能,系统根据指定的字体数据选择字体.系统将字体句柄传递给对话框,并通过向每个控件发送
WM_SETFONT消息.
这就解释了为什么那个显示预期的字体.
下一个逻辑问题是动态创建的对话框模板有什么不同,用DialogBoxIndirect函数显示.罪魁祸首再次是DS_SETFONT旗帜,但在这种情况下,旗帜不存在.这意味着该对话框不包含有关用于显示其控件的字体的任何信息,系统默认为默认系统字体(这是您在第二个屏幕截图中看到的丑陋的Windows 2.0时代字体).
一旦我们达成这种理解,解决方案应该是显而易见的:您需要告诉对话框您希望它使用哪种字体.有两种可能的方法可以让我想到:
DS_SETFONT标志并在对话框模板的标题中提供字体信息,如上面链接的文档中所述.WM_INITDIALOG消息.后者可能就是你真正想做的事情,因为它允许你使用实际的系统字体(令人困惑的是,它与我所谓的"默认"系统字体不同),这是Windows Vista中的Segoe UI然后.请注意,即使在您的第一个屏幕截图中,它也使用了MS Sans Serif,因此在Aero界面中就像一个痛苦的拇指.再次,请参阅此答案以获取有关字体的更多信息,而不是您想知道的字体以及用于实现此功能的示例代码 您需要确保为对话框本身及其所有子控件设置字体.