- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
有必要关闭所有对话框控件的默认字体的“ClearType”属性。可以通过设置对一个控件执行此操作
logfont.lfQuality = ANTIALIASED_QUALITY
有很多关于如何对模态对话框(http://neelaakash.wordpress.com/2007/12/31/change-default-dialog-font-of-cdialog/ 和其他)执行相同操作的建议,但对于非模态对话框(使用 new 和 Create(...) 方法实例化)应该这样做。我自己尝试这样做:
覆盖'Create'方法,并修改对话框模板:
BOOL CActivationChildDialogLicenseInfo::Create(UINT nIDTemplate,
CWnd* pParentWnd)
{
CDialogTemplate dlt;
int nResult;
// load dialog template
if (!dlt.Load(MAKEINTRESOURCE(nIDTemplate))) return -1;
// set your own font, for example “Arial”, 10 pts.
dlt.SetFont(L"Arial", 12);
// get pointer to the modified dialog template
LPSTR pdata = (LPSTR)GlobalLock(dlt.m_hTemplate);
// let MFC know that you are using your own template
m_lpszTemplateName = NULL;
InitModalIndirect(pdata);
// display dialog box
nResult = CActivationChildDialog::Create(nIDTemplate, pParentWnd);
// unlock memory object
GlobalUnlock(dlt.m_hTemplate);
return nResult ;
}
似乎这个方法什么都不做(它被调用,我已经通过在里面放置断点来检查它)。我试过打电话
nResult = CActivationChildDialog::Create(NULL, pParentWnd);
...但是得到了很多断言。
我还尝试覆盖“OnSetFont”方法:
void CActivationChildDialogLicenseInfo::OnSetFont(CFont *pFont)
{
CActivationChildDialog::OnSetFont(pFont);
LOGFONT logfont;
pFont->GetLogFont(&logfont);
LOGFONT logfont2=logfont;
pFont->DeleteObject();
logfont2.lfItalic = true;
logfont2.lfQuality = ANTIALIASED_QUALITY;
pFont->CreateFontIndirect(&logfont2);
}
这会在运行时导致断言并导致使用非常大的字体(丢失默认字体设置,不接受新的指定设置)...我不知道为什么。
请指教,如何更改将被所有对话框控件“继承”的默认对话框字体?
非常感谢。
最佳答案
首先:简单、可靠的方法是创建对话框,然后将 WM_SETFONT
(或调用 SetFont()
)发送到对话框和其中的每个控件。我将在下面向您展示如何做到这一点,但首先,这就是您已经尝试过的两种策略没有(也不能)起作用的原因:
首先,如果您想使用已经加载的对话框模板,您应该调用 CDialog::CreateIndirect()
。
但是别打扰了。对话框模板仅包含面名称和磅值 - 它不允许允许您指定其他 LOGFONT 值,例如 lfQuality
。如果它做了,您可以简单地在资源定义中指定它并完全避免编写任何运行时代码!
WM_SETFONT
理论上,您可以完成这项工作。但这不实用。您的代码有几个问题:首先,您必须为每个子控件拦截此消息,以便它执行任何有用的操作:对话框本身可能不呈现任何文本。但更糟糕的是,您将 原始 字体传递给基类(基类将其传递给默认窗口过程,该过程将其存储在内部供以后使用)然后立即销毁它 - 这意味着对话框 (以及使用该字体的所有其他内容,包括所有子控件)将尝试使用伪造的字体绘制文本,并因此恢复为默认字体。最后,您要创建一个新字体,该字体附加到由 MFC 创建和销毁的临时对象 (pFont
) - 在内部,您正在使用的 CFont 对象将从字体句柄分离并销毁,泄漏一个没有任何用处的字体对象的句柄。
HFONT 是 Windows 用来表示字体对象的句柄类型。与大多数 GDI 一样,有创建字体的特定函数,以及用于销毁字体的通用 DeleteObject()
函数。
CFont 是 HFONT 的轻量级包装类。一个 CFont 实例可以从现有的 HFONT 附加和分离,或用于创建一个新的。如果 CFont 实例在其析构函数执行时仍附加到 HFONT,它将调用 DeleteObject()
来销毁底层对象。在内部,MFC 在调用各种消息处理程序(如 OnSetFont)时使用临时 CFont 实例,这些实例与 HFONT 附加和分离。值得记住的是,在内部,Windows 对 CFont 一无所知,并且在任何给定时间点,单个 HFONT 可能属于 0 个或多个 CFont 实例。
当您创建新字体时——无论它是否包含在 CFont 对象中——您就是该字体的所有者,您有责任在使用完后销毁它。 Passing it to WM_SETFONT
(CWnd::SetFont()
) doesn't change ownership! 这实际上非常有用,因为它允许您将相同的字体传递到多个窗口而不必担心哪个会破坏它 - 您仍然是所有者,因此您可以(并且必须)自己销毁它(一旦有没有 window 仍在使用它)。
所以你现在应该有足够的背景来理解必要的步骤:
// define this as a class member - class destructor then handles step four!
CFont m_nonCleartypeFont;
BOOL CActivationChildDialogLicenseInfo::Create(UINT nIDTemplate,
CWnd* pParentWnd)
{
// step one: create dialog normally
BOOL nResult = CActivationChildDialog::Create(nIDTemplate, pParentWnd);
// step two: create custom font
// relying on destructor to destroy font once we're done with it
// so be careful to only create it once!
if ( NULL == m_nonCleartypeFont.m_hObject )
{
CFont* pOriginalFont = GetFont(); // use template font as... template!
// pull information from original font
LOGFONT logfont;
pOriginalFont->GetLogFont(&logfont);
// make font adjustments:
// specify italics
logfont.lfItalic = true;
// and non-cleartype antialiasing
logfont.lfQuality = ANTIALIASED_QUALITY;
// create our font based on adjusted information
m_nonCleartypeFont.CreateFontIndirect(&logfont);
}
// step three: set our custom font on the dialog and all children
<a href="http://msdn.microsoft.com/en-us/library/3y64cf7e.aspx" rel="noreferrer noopener nofollow">SetFont</a>(&m_nonCleartypeFont, FALSE);
// Send message to quickly set this font for all children.
// See documentation for <a href="http://msdn.microsoft.com/en-us/library/7z0ce68s.aspx" rel="noreferrer noopener nofollow">SendMessageToDescendants()</a>
// - this is actually the example given!
<a href="http://msdn.microsoft.com/en-us/library/7z0ce68s.aspx" rel="noreferrer noopener nofollow">SendMessageToDescendants</a>(<a href="http://msdn.microsoft.com/en-us/library/ms632642.aspx" rel="noreferrer noopener nofollow">WM_SETFONT</a>,
(WPARAM)m_nonCleartypeFont.m_hObject,
MAKELONG(FALSE, 0),
FALSE);
return nResult;
}
关于c++ - 如何更改非模态对话框的默认 CDialog 字体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3282938/
不知道为什么我不能使用 CDialog 并在 cpp 文件中设置内存空间。它只在头文件中起作用。这不是一样的吗???谢谢 头文件: public: CDialog *m_pages[6];
我创建了两个 CDialog 类。我们称它们为 MainDialog 和 ExtraDialog。我希望 ExtraDialog 既可以通过 doModal 显示,也可以作为 MainDialog 中
我有一个 SDI 应用程序。在应用程序中有一个无模式对话框,用于显示一些消息,例如在工作期间与服务器通信。问题是,当对话框的父窗口设置为主框架时,ShowWindow 方法无法按预期工作。对话框似乎被
谁能告诉我如何在 MFC 的 Visual c++ 6.0 中创建一个非模态对话框并显示它?我写了这段代码: CDialog dialog; if (dialog.init(initializatio
我有一个长时间运行的任务和一个通知用户该任务正在运行的对话框。任务完成后,对话框会通知用户。 我想在使用 AfxBeginThread 创建的 Worker-Thread 中开始任务,当任务完成时,我
有没有办法从 CDialog 派生类(如 CWnd::m_hWnd 成员)中检索窗口句柄? 谢谢 最佳答案 HWND hWnd = GetSafeHwnd(); 应该可以解决问题,但是 CDialog
所以我有一个基于 MFC 的应用程序,它主要派生自 CDialog,带有一些控件等。 由于某些原因,它需要托管在另一个应用程序中,使用基于CView 的容器类。 所以必须有某种方式...在容器类中使用
我看过处理这个东西的绘图的代码 (DFCS_SCROLLSIEGRIP),但肯定有一种窗口样式,我可以应用它“免费”获取它。对吧? 最佳答案 代替更好的答案,我将发布我拥有的代码,该代码绘制尺寸夹点并
MS documentation (和 others )“明确”指出: ... Because the normal OnOk and OnCancel member functions of a C
这是我的问题:在我的解决方案中,我有 2 个项目,一个是我在其中创建了一个资源文件 (mylib.rc) 和一个对话框模板的库。然后我创建了一个继承 CDialog 并使用此模板的类。但是当我实例化它
我有一个 CDialog 类,我需要它被其他类的总和同时调用。根据我的理解,这应该可以工作,但它将是 Dialog 的同一个实例,并且我需要与调用类一样多的不同实例。这可能吗? 最佳答案 同时显示在屏
我不想使用“图形资源”来创建对话框! 我目前拥有的: CDialog *dlgWin = new CDialog(); dlgWin->Create("hello"); // <-- but thi
我在创建基于 CDialog 的窗口的某些代码时遇到问题。该代码上周运行良好。我所做的唯一更改是用散列数组替换 C++ 双端队列。我已经注释掉了调用 Create 方法的代码行,以允许我跳过加载窗口。
我正在处理一个 MFC 项目,我需要一个单独的循环,该循环将连续运行或每隔几秒运行一次,并且每次它可能需要也可能不需要运行对话框以从用户那里获取一些输入。我正在考虑使用 AfxBeginThread,
我有一个对话框,在按下“确定”按钮后,程序会使用对话框中的数据并绘制图表。我需要绘制绘图而不必像 IDOK 那样关闭对话框,因此需要应用按钮。绘制对话框的代码是, INT_PTR val = dlg-
如何在鼠标悬停时更改应用程序图标?我想在我的 CDialog 的系统菜单中放置一些菜单项,并且我希望当用户将鼠标悬停在它上面时图标突出显示,以表明它是一个用户界面组件(类似于最新版本的 firefox
有必要关闭所有对话框控件的默认字体的“ClearType”属性。可以通过设置对一个控件执行此操作 logfont.lfQuality = ANTIALIASED_QUALITY 有很多关于如何对模态对
我已经按照这个问题制作了一个非模态/无模态对话框: How to display a non-modal CDialog? 我在 VS2008 中使用 MFC/C++。与 MFC 和 C++ 相比,我
我创建了一个 SDI 应用程序并创建了一个对话框窗口。我想向该对话框添加一个工具栏,所以我这样编码: int CAddNewEmployee::OnCreate(LPCREATESTRUCT lpCr
我遇到过 CDialog::SetDefId,虽然它非常简单明了,它用于“按钮”,但我想将此功能与非按钮控件一起使用。我知道你必须按 Enter 或 Return 使对话框使用该 ID 如果我在 CD
我是一名优秀的程序员,十分优秀!