- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在这里使用原始的 Windows API。我试图在 WM_INITDIALOG 消息期间将字体传递给对话框,然后在该对话框内创建新的子窗口时继续使用该字体。但我不想继续传递我创建的 HFONT,我想在需要时从对话框窗口中检索它。
因此,当我输入 WM_INITDIALOG 处理程序时,我创建字体,然后使用 SendMessage(WM_SETFONT) 将其发送到对话框。然后,每当我想创建一个新的子窗口时,我认为我需要做的就是使用 SendMessage(WM_GETFONT) 检索对话框字体。但是我从对话框收到的句柄不是我创建的句柄,因此当我使用该新句柄设置新的控制字体时,我得到错误的字体也就不足为奇了。
我仅在应用程序终止时销毁字体句柄。但我敢打赌,无效的句柄不是问题,否则,在下面的示例中,我显式传递字体句柄的控件将不会显示正确的句柄。
有什么想法吗?
#include <Windows.h>
#include <CommCtrl.h>
static INT_PTR CALLBACK DialogProc(
_In_ HWND hwndDlg,
_In_ UINT uMsg,
_In_ WPARAM wParam,
_In_ LPARAM lParam)
{
static HFONT hFont = NULL;
switch(uMsg)
{
case WM_CLOSE:
::EndDialog(hwndDlg, 0);
::DeleteObject(hFont);
return TRUE;
case WM_INITDIALOG:
{
// create our font
hFont = ::CreateFontW(
36,
0,
0,
0,
FW_NORMAL,
0,
0,
0,
DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
CLEARTYPE_QUALITY,
VARIABLE_PITCH,
L"Tahoma");
// set that font as the dialog font
::SendMessageW(hwndDlg, WM_SETFONT, (WPARAM)hFont, TRUE);
// retrieve the dialog font
HFONT hFontDialog = (HFONT)::SendMessageW(hwndDlg, WM_GETFONT, 0, 0);
// create two child windows
HWND hwndStatic1 = ::CreateWindowExW(0, WC_STATIC, L"hFont", WS_VISIBLE | WS_CHILD, 0, 0, 100, 30, hwndDlg, NULL, 0, 0);
HWND hwndStatic2 = ::CreateWindowExW(0, WC_STATIC, L"hFontDialog", WS_VISIBLE | WS_CHILD, 0, 50, 100, 20, hwndDlg, NULL, 0, 0);
// set their fonts, using the one we created for the first one and
// the one from the dialog for the second one
::SendMessageW(hwndStatic1, WM_SETFONT, (WPARAM)hFont, TRUE);
::SendMessageW(hwndStatic2, WM_SETFONT, (WPARAM)hFontDialog, TRUE);
return FALSE;
}
}
return FALSE;
}
#include <PshPack2.h>
struct DialogTemplate
{
DLGTEMPLATE Base;
WORD Menu;
WORD Class;
WCHAR Title[1];
};
#include <PopPack.h>
int WINAPI wWinMain(
__in HINSTANCE hInstance,
__in_opt HINSTANCE hPrevInstance,
__in LPWSTR lpCmdLine,
__in int nShowCmd)
{
DialogTemplate dt = {0};
dt.Base.style = DS_CENTER | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU;
dt.Base.cx = 200;
dt.Base.cy = 200;
return ::DialogBoxIndirectParamW(
::GetModuleHandle(NULL),
(DLGTEMPLATE*)&dt, // holy hack, Batman! I hope this is OK...
NULL,
DialogProc,
(LPARAM)0);
}
最佳答案
对话框不响应WM_SETFONT
。对话框具有在其模板中定义的字体,如果设置了 DS_SETFONT 样式,它将在创建时将其传播到其所有子控件。您从 WM_GETFONT
返回的字体是最初基于模板创建的字体。
如果您想在创建对话框后更改控件字体,则需要分别向它们发送 WM_SETFONT
消息。
关于为什么会出现这种情况,我的理论是:对话框布局基于字体大小(“对话框单位”是字体高度和平均字体宽度的一小部分)。因此,对话框在创建时需要知道其字体,以便调整控件的大小和布局。从对话框的角度来看,之后更改字体可能需要调整大小/重新布局,而这不是对话框管理器中已实现的功能。
关于c - HFONT 我从对话框中得到的不是我发送的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18155793/
我使用 Win32 API 和 C/C++。我有一个 HFONT,想用它来创建一个新的 HFONT。新字体应该使用完全相同的字体规范,只是它应该是粗体。比如: HFONT CreateBoldFont
我在这里使用原始的 Windows API。我试图在 WM_INITDIALOG 消息期间将字体传递给对话框,然后在该对话框内创建新的子窗口时继续使用该字体。但我不想继续传递我创建的 HFONT,我想
我遇到过这样一种情况,我们需要知道 QFont 当前使用的字体的文件名。 .知道一个QFont可以给我们字体系列和 Windows HFONT处理。 字体系列是不够的,因为像Bold这样的操作样式或
我正在为使用 MFC 构建并使用普通旧 GDI 的旧应用程序添加 SVG 导出支持。由于 SVG 1.1 不支持文本换行,我不得不手动执行此操作。 该应用程序为我提供了一个CFont 实例(其中包含一
这个问题在这里已经有了答案: Create modified HFONT from HFONT (2 个答案) What are the windows system font specificat
HFONT childfont = SendMessage (childwin, WM_GETFONT, NULL, NULL); 导致错误“从‘LRESULT’到‘HFONT__*’的无效转换”当M
在我的对话框中,我将字体设置为默认的 GUI 字体,但是我确实需要手动将字体大小设置为 15。我该怎么做? HFONT myQueryFont; myQueryFont = (HFONT)GetS
我想知道哪些指标用于计算正确的行高(2 个相邻文本行基线之间的垂直距离)。 “正确”应任意定义为“无论 DrawTextW 做什么”。 The accepted answer here似乎遵循图表提供
我是一名优秀的程序员,十分优秀!