在库中创建CWnd
Create CWnd in library
我将以下代码从基于MFC对话框的项目移动到MFC库dll:
CWnd dummyWnd;
standard = new Gdiplus::Font(dummyWnd.GetDC()->GetSafeHdc(), &logfont); //GetDC() returns null, which did not happen in an MFC dialog-based app
我需要一个临时DC来创建gdiplus字体、测量字符串和其他实用程序功能。
我的问题:
- 是否可以像我在基于对话框的应用程序中那样使用CWnd
- 或者我可以用另一种方式简单地获得DC吗
创建临时dc:
//create memory dc
CClientDC dc(NULL);
CDC memdc;
memdc.CreateCompatibleDC(&dc);
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(&dc, width, height);
memdc.SelectObject(bitmap);
但在这种情况下,您可能不需要临时dc。您可以简单地使用桌面dc,只要您没有在桌面dc上书写,或者没有选择桌面dc中的任何内容。
要获得桌面dc,请使用Windows API:
HDC hdc = ::GetDC(0);
standard = new Gdiplus::Font(hdc, &logfont);
...
ReleaseDC(0, hdc); //cleaup
或者,使用MFC
CClientDC dc(NULL);
standard = new Gdiplus::Font(dc.GetSafeHdc(), &logfont);
对于临时窗口,dummyWnd.GetDC()->GetSafeHdc()
在调试模式下失败并引发错误,因为MFC将检查窗口句柄是否有效。
在发布模式下,它可能实际工作,因为它最终调用了有效的::GetDC(NULL)
。然而,它将以资源泄漏告终,因为从未调用过ReleaseDC
。
由于字体将在特定窗口上绘制,因此需要窗口的设备上下文才能正确绘制。您将CWnd*作为参数发送到您的函数,该函数将由您的动态库导出。
// MyMfcLibrary.cpp
void InitializeFont(CWnd* pWnd)
{
CClientDC dc(pWnd);
Gdiplus::Font myfont(dc.GetSafeHdc()->GetSafeHdc(), &logfont);
/**/
}
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 使用std::multimap迭代器创建std::list
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 使用CMake创建QML插件
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 试图在visual studio上用C++创建一个桌面应用程序
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 如何在C++20中创建模板别名的推导指南
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 如何创建一个空的全局类并在启动时实例化它
- 无法创建抽象类的实例
- 链接到自行创建的dll失败
- 在库中创建CWnd
- 为什么CWnd::CreateEx无法创建我的窗口
- winapi - 我应该重写 CButton 还是 CWnd 以创建自定义控件
- 全局挂钩到Cwnd::使用MHook创建
- 如何创建衍生自CWnd弹出窗口