在库中创建 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 吗?
由于字体将在特定 windows 上绘制,因此需要 windows 的设备上下文才能正确绘制。您将 CWnd* 作为参数发送给您的函数,它将由您的动态库导出。
// MyMfcLibrary.cpp
void InitializeFont(CWnd* pWnd)
{
CClientDC dc(pWnd);
Gdiplus::Font myfont(dc.GetSafeHdc()->GetSafeHdc(), &logfont);
/**/
}
创建临时 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);
至于临时 windows,dummyWnd.GetDC()->GetSafeHdc()
在调试模式下失败并引发错误,因为 MFC 将检查 window 句柄是否有效。
在发布模式下,它实际上可能会工作,因为它最终会调用有效的 ::GetDC(NULL)
。但是它将以资源泄漏结束,因为从未调用 ReleaseDC
。
我将以下代码从基于 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 吗?
由于字体将在特定 windows 上绘制,因此需要 windows 的设备上下文才能正确绘制。您将 CWnd* 作为参数发送给您的函数,它将由您的动态库导出。
// MyMfcLibrary.cpp
void InitializeFont(CWnd* pWnd)
{
CClientDC dc(pWnd);
Gdiplus::Font myfont(dc.GetSafeHdc()->GetSafeHdc(), &logfont);
/**/
}
创建临时 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);
至于临时 windows,dummyWnd.GetDC()->GetSafeHdc()
在调试模式下失败并引发错误,因为 MFC 将检查 window 句柄是否有效。
在发布模式下,它实际上可能会工作,因为它最终会调用有效的 ::GetDC(NULL)
。但是它将以资源泄漏结束,因为从未调用 ReleaseDC
。