Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在库中创建CWnd_C++_Mfc - Fatal编程技术网

C++ 在库中创建CWnd

C++ 在库中创建CWnd,c++,mfc,C++,Mfc,我将以下代码从基于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字体、度量字符串和其他实用程序功能 我的问题是: 是否可以像我在基

我将以下代码从基于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吗

由于字体将在特定窗口上绘制,因此需要窗口的设备上下文才能正确绘制。将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中选择任何内容

要使用Windows API获取桌面dc,请执行以下操作:

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将检查窗口句柄是否有效


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

请仔细检查您的原始代码:
CWnd dummyWnd
创建一个未附加(无窗口)的
CWnd
对象;然后
dummyWnd.GetDC()尝试获取未连接窗口的客户端区域设备上下文。这应该失败。请看:谢谢你的回复。我现在想知道为什么代码在基于对话框的项目中起作用。我也没有在那里创建()。@RichardCriten将代码更新为我使用的确切代码。为什么在基于对话框的mfc应用程序中这样做?
CDC::GetSafeHdc
:文档中的奇怪评论“…此成员函数也适用于空指针…”您对这意味着什么的猜测和我的一样好。来源:使用
CClientDC(NULL)
获取桌面dc,然后使用
CreateCompatibleDC
。。。请参阅
CPaintDC
仅应在重写
CWnd::OnPaint
时使用。这里应该是
CClientDC