首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在库中创建CWnd

在库中创建CWnd
EN

Stack Overflow用户
提问于 2019-11-02 12:35:08
回答 2查看 275关注 0票数 0

我将以下代码从基于MFC对话框的项目移到MFC库dll中:

代码语言:javascript
复制
CWnd dummyWnd;
standard = new Gdiplus::Font(dummyWnd.GetDC()->GetSafeHdc(), &logfont); //GetDC() returns null, which did not happen in an MFC dialog-based app

我需要一个临时DC来创建双工字体,测量字符串和其他实用程序功能。

我的问题:

  • 可以像我在基于对话框的应用程序中那样使用CWnd吗?
  • ,或者我可以用另一种方式获得DC吗?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-02 13:50:31

若要创建临时dc:

代码语言:javascript
复制
//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:

代码语言:javascript
复制
HDC hdc = ::GetDC(0);
standard = new Gdiplus::Font(hdc, &logfont);
...
ReleaseDC(0, hdc); //cleaup

或者,使用MFC

代码语言:javascript
复制
CClientDC dc(NULL);
standard = new Gdiplus::Font(dc.GetSafeHdc(), &logfont);

对于临时窗口,dummyWnd.GetDC()->GetSafeHdc()在调试模式下失败并引发错误,因为MFC将检查窗口句柄是否有效。

在发布模式下,它可能实际工作,因为它最终调用了有效的::GetDC(NULL)。但是,它将以资源泄漏告终,因为从来没有调用过ReleaseDC

票数 0
EN

Stack Overflow用户

发布于 2019-11-02 13:23:14

由于字体将在特定窗口上绘制,因此需要窗口的设备上下文才能正确绘制。将CWnd*作为参数发送到函数,该函数将由动态库导出。

代码语言:javascript
复制
// MyMfcLibrary.cpp
void InitializeFont(CWnd* pWnd)
{
   CClientDC dc(pWnd);
   Gdiplus::Font myfont(dc.GetSafeHdc()->GetSafeHdc(), &logfont);
   /**/
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58671154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档