gpt4 book ai didi

c++ - DialogBoxIndirect 创建的对话框比要求的大

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:26:13 28 4
gpt4 key购买 nike

对于我的应用程序,我需要在不使用资源的情况下创建一个对话框。我正在尝试使用 DialogBoxInderect 函数来做到这一点。该代码丑陋得令人难以置信,但我以某种方式成功地做到了。

问题是由于某种原因,对话框比我要求的字体大得多。

如果我从资源加载对话框,下面是对话框的样子: enter image description here

这里是调用 DialogBoxInderect 函数时显示的相同大小的对话框。 enter image description here

这是它在代码中的定义:

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

这是它在 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

如您所见,第二个对话框比定义的要大得多。我尝试使用各种样式标志但没有成功(这就是为什么在较大的对话框上有红叉)。

有什么帮助吗?谢谢!

最佳答案

较大的尺寸很容易解释。 Windows 会根据其字体自动调整对话框的大小,较大的对话框使用不同的字体。事实上,它使用的是默认系统字体(有关 Windows 对话框字体令人困惑的问题的更多信息,请参见我的回答 here)。

所以真正需要关注的问题是为什么它使用不同的字体,并修复它可以解决大小问题。

在对话框资源文件中,您指定DS_SETFONT flag作为对话框样式之一。根据文档,这个标志

[i]ndicates that the header of the dialog box template (either standard or extended) contains additional data specifying the font to use for text in the client area and controls of the dialog box. If possible, the system selects a font according to the specified font data. The system passes a handle to the font to the dialog box and to each control by sending them the WM_SETFONT message.

这就解释了为什么那个显示的是预期的字体。

下一个合乎逻辑的问题是动态创建的对话框模板有何不同,用 DialogBoxIndirect 函数显示。罪魁祸首再次是 DS_SETFONT 标志,但在这种情况下,该标志不存在。这意味着该对话框不包含任何有关使用哪种字体来显示其控件的信息,并且系统默认使用默认系统字体(这是您在第二个屏幕截图中看到的丑陋的 Windows 2.0 时代字体)。

一旦我们理解了这一点,解决方案就很明显了:您需要告诉对话框您希望它使用哪种字体。我想到了两种可能的方法:

  1. 您可以设置 DS_SETFONT 标志并在对话框模板的标题中提供字体信息,如上述链接文档中所述。
  2. 或者您可以简单地创建和设置对话框的字体以响应 WM_INITDIALOG 消息。

后者可能是您真正想要做的,因为它允许您使用实际 系统字体(令人困惑的是,它与我一直称呼的不同)默认" 系统字体),它是 Windows Vista 和更高版本中的 Segoe UI。请注意,即使在您的第一个屏幕截图中,它也使用 MS Sans Serif,因此在 Aero 界面中像拇指一样突出。再次参见 this answer了解比您想知道的更多关于字体的信息,以及完成这项工作的示例代码。您需要确保为对话框本身它的所有子控件设置字体。

关于c++ - DialogBoxIndirect 创建的对话框比要求的大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9207414/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com