询问者
GetClipBox出错,GetLastError得到87,这是为何?

问题
全部回复
-
Hi Poker_1,
感谢在MSDN论坛发帖。
>>在MFC调用时,把CDC的m_hDC传入了进去,但是就出错了,错误值为87
发现使用::GetClipBox(pDC->m_hAttribDC, &rc);就能返回正确,使用::GetClipBox(pDC->m_hDC, &rc);就不行
可是绘制又得用pDC->m_hDC
这是什么原因,怎么解决?
错误码87的意思是参数设置不正确。
请检查一下你的pDC->m_hDC值是否合理。CDC包含两个设备上下文,m_hDC和m_hAttribDC,它们在创建CDC对象时引用同一个设备。 CDC将所有输出GDI调用指向m_hDC,并将大部分属性GDI调用指向m_hAttribDC。例如:
你可以尝试使用CDC::GetSafeHdc来获取正确的m_hDC值。
希望对你有所帮助。
Best Regards,
Baron Bi
MSDN Community Support
Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.- 已编辑 Baron Bi 2017年11月30日 6:09
-
-
m_hDC是否合理是什么意思?
我通过HDC hDC = pDC->GetSafeDC()得到的值与m_hDC是一样的。
首先,通过这个hDC来画线(MoveToEx,LineTo),一切正常。
其次,画文字。诸如GetTextMetrics确实也出现了问题,所以我通过HDC hDesktopDC = GetDC(NULL)重新获取了一个HDC,然后用hDesktopDC 来执行GetTextMetrics,以获取文字信息,最后再使用hDC(CDC的m_hDC),可以正常输出。
最后,要绘制裁剪区域。需要执行GetClipBox、LPToDP、ExtSelectClipRgn这样的函数,传入hDC是失败的,传入m_hAttribDC可以成功,但是输出又不准确了,无法正常的完成裁剪。相当于现在我的尝试是:
// pPoints 是原始的坐标点 LPtoDP(m_hAttribDC, pPoints, nPointCount); HRGN hClipRgn = ::CreatePolyPolygonRgn(pPoints, pCounts, nPolyCount, ALTERNATE ); RECT rect; ::GetClipBox(m_hAttribDC, &rect ); ::LPtoDP(m_hAttribDC, (POINT*)&rect, 2); HRGN hOldClipRgn = ::CreateRectRgnIndirect(&rect ); ::GetClipRgn(m_hAttribDC, hOldClipRgn); ::CombineRgn(hClipRgn, hOldClipRgn, hClipRgn, RGN_AND); ::ExtSelectClipRgn(m_hAttribDC, hClipRgn, RGN_COPY); // 创建完裁剪区后,绘制规则的图形 MoToEx(m_hDC, 0, 0, NULL); LineTo(m_hDC, 900, 900); // 结束裁剪 ::ExtSelectClipRgn(m_hAttribDC, hOldClipRgn, RGN_COPY);
结果是裁剪没有成功,绘制的线超出了裁剪区域。这种情况,我的参数只有一个HDC,但是CDC却带有两个。
不知道如何处理裁剪区域的绘制。
-
>>结果是裁剪没有成功,绘制的线超出了裁剪区域。这种情况,我的参数只有一个HDC,但是CDC却带有两个。
不知道如何处理裁剪区域的绘制。
请问你是什么类型的工程? Win32还是MFC?
你有没有尝试过直接调用CDC::GetClipBox来获取裁剪的矩形?
Best Regards,
Baron Bi
MSDN Community Support
Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.- 已编辑 Baron Bi 2017年11月30日 6:09
-
>>结果是裁剪没有成功,绘制的线超出了裁剪区域。这种情况,我的参数只有一个HDC,但是CDC却带有两个。
不知道如何处理裁剪区域的绘制。
请问你是什么类型的工程? Win32还是MFC?
你有没有尝试过直接调用CDC::GetClipBox来获取裁剪的矩形?
Best Regards,
Sera Yu
MSDN Community Support
Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.绘制模块是一个WIN32 DLL
外部调用的是MFC
-
>>绘制模块是一个WIN32 DLL
外部调用的是MFC
那你可以尝试直接调用CDC::GetClipBox来获取裁剪的矩形rect, 然后使用m_hAttribDC和获取的rect来进行图形绘制。
Best Regards,
Baron Bi
MSDN Community Support
Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.