none
GetClipBox出错,GetLastError得到87,这是为何? RRS feed

  • 问题

  • 为了进行绘制裁剪多边形,使用了GetClipBox这个函数,封装的时候传入的是HDC

    在MFC调用时,把CDC的m_hDC传入了进去,但是就出错了,错误值为87

    发现使用::GetClipBox(pDC->m_hAttribDC, &rc);就能返回正确,使用::GetClipBox(pDC->m_hDC, &rc);就不行

    可是绘制又得用pDC->m_hDC

    这是什么原因,怎么解决?

    2017年11月10日 9:52

全部回复

  • 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
    2017年11月13日 2:19
  • 为了进行绘制裁剪多边形,使用了GetClipBox这个函数,封装的时候传入的是HDC

    在MFC调用时,把CDC的m_hDC传入了进去,但是就出错了,错误值为87

    发现使用::GetClipBox(pDC->m_hAttribDC, &rc);就能返回正确,使用::GetClipBox(pDC->m_hDC, &rc);就不行

    可是绘制又得用pDC->m_hDC

    这是什么原因,怎么解决?

    LPToDP,ExtSelectClipRgn这些函数也会出现错误,但是使用m_hAttribDC就准确了

    可是输出是m_hDC,怎么处理这样的问题?

    2017年11月13日 2:34
  • 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却带有两个。

    不知道如何处理裁剪区域的绘制。

    2017年11月13日 4:00
  • >>结果是裁剪没有成功,绘制的线超出了裁剪区域。这种情况,我的参数只有一个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
    2017年11月13日 7:36
  • 有的,CDC::GetClipBox是准确的。

    但是问题在于封装的库传入的函数只能是HDC。

    而CDC又包含两个HDC,所以就混乱了。

    2017年11月13日 11:04
  • >>结果是裁剪没有成功,绘制的线超出了裁剪区域。这种情况,我的参数只有一个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

    2017年11月14日 1:20
  • >>绘制模块是一个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.

    • 已建议为答案 Baron Bi 2017年12月12日 7:12
    • 取消建议作为答案 Poker_1 2018年6月5日 8:34
    2017年11月30日 6:08