📄 wingdi.cpp
字号:
if (m_hDC != m_hAttribDC)
VERIFY(::SetWindowExtEx(m_hDC, x, y, &size));
if (m_hAttribDC != NULL)
VERIFY(::SetWindowExtEx(m_hAttribDC, x, y, &size));
return size;
}
CSize CDC::ScaleWindowExt(int xNum, int xDenom, int yNum, int yDenom)
{
ASSERT(m_hDC != NULL);
CSize size;
if (m_hDC != m_hAttribDC)
VERIFY(::ScaleWindowExtEx(m_hDC, xNum, xDenom, yNum, yDenom, &size));
if (m_hAttribDC != NULL)
VERIFY(::ScaleWindowExtEx(m_hAttribDC, xNum, xDenom, yNum, yDenom, &size));
return size;
}
int CDC::GetClipBox(LPRECT lpRect) const
{
ASSERT(m_hDC != NULL);
return ::GetClipBox(m_hDC, lpRect);
}
int CDC::SelectClipRgn(CRgn* pRgn)
{
ASSERT(m_hDC != NULL);
int nRetVal = ERROR;
if (m_hDC != m_hAttribDC)
nRetVal = ::SelectClipRgn(m_hDC, (HRGN)pRgn->GetSafeHandle());
if (m_hAttribDC != NULL)
nRetVal = ::SelectClipRgn(m_hAttribDC, (HRGN)pRgn->GetSafeHandle());
return nRetVal;
}
int CDC::ExcludeClipRect(int x1, int y1, int x2, int y2)
{
ASSERT(m_hDC != NULL);
int nRetVal = ERROR;
if (m_hDC != m_hAttribDC)
nRetVal = ::ExcludeClipRect(m_hDC, x1, y1, x2, y2);
if (m_hAttribDC != NULL)
nRetVal = ::ExcludeClipRect(m_hAttribDC, x1, y1, x2, y2);
return nRetVal;
}
int CDC::ExcludeClipRect(LPCRECT lpRect)
{
ASSERT(m_hDC != NULL);
int nRetVal = ERROR;
if (m_hDC != m_hAttribDC)
nRetVal = ::ExcludeClipRect(m_hDC, lpRect->left, lpRect->top,
lpRect->right, lpRect->bottom);
if (m_hAttribDC != NULL)
nRetVal = ::ExcludeClipRect(m_hAttribDC, lpRect->left, lpRect->top,
lpRect->right, lpRect->bottom);
return nRetVal;
}
int CDC::IntersectClipRect(int x1, int y1, int x2, int y2)
{
ASSERT(m_hDC != NULL);
int nRetVal = ERROR;
if (m_hDC != m_hAttribDC)
nRetVal = ::IntersectClipRect(m_hDC, x1, y1, x2, y2);
if (m_hAttribDC != NULL)
nRetVal = ::IntersectClipRect(m_hAttribDC, x1, y1, x2, y2);
return nRetVal;
}
int CDC::IntersectClipRect(LPCRECT lpRect)
{
ASSERT(m_hDC != NULL);
int nRetVal = ERROR;
if (m_hDC != m_hAttribDC)
nRetVal = ::IntersectClipRect(m_hDC, lpRect->left, lpRect->top,
lpRect->right, lpRect->bottom);
if (m_hAttribDC != NULL)
nRetVal = ::IntersectClipRect(m_hAttribDC, lpRect->left, lpRect->top,
lpRect->right, lpRect->bottom);
return nRetVal;
}
int CDC::OffsetClipRgn(int x, int y)
{
ASSERT(m_hDC != NULL);
int nRetVal = ERROR;
if (m_hDC != m_hAttribDC)
nRetVal = ::OffsetClipRgn(m_hDC, x, y);
if (m_hAttribDC != NULL)
nRetVal = ::OffsetClipRgn(m_hAttribDC, x, y);
return nRetVal;
}
int CDC::OffsetClipRgn(SIZE size)
{
ASSERT(m_hDC != NULL);
int nRetVal = ERROR;
if (m_hDC != m_hAttribDC)
nRetVal = ::OffsetClipRgn(m_hDC, size.cx, size.cy);
if (m_hAttribDC != NULL)
nRetVal = ::OffsetClipRgn(m_hAttribDC, size.cx, size.cy);
return nRetVal;
}
CPoint CDC::MoveTo(int x, int y)
{
ASSERT(m_hDC != NULL);
CPoint point;
if (m_hDC != m_hAttribDC)
VERIFY(::MoveToEx(m_hDC, x, y, &point));
if (m_hAttribDC != NULL)
VERIFY(::MoveToEx(m_hAttribDC, x, y, &point));
return point;
}
BOOL CDC::LineTo(int x, int y)
{
ASSERT(m_hDC != NULL);
if (m_hAttribDC != NULL && m_hDC != m_hAttribDC)
::MoveToEx(m_hAttribDC, x, y, NULL);
return ::LineTo(m_hDC, x, y);
}
UINT CDC::SetTextAlign(UINT nFlags)
{
ASSERT(m_hDC != NULL);
UINT nRetVal = GDI_ERROR;
if (m_hDC != m_hAttribDC)
::SetTextAlign(m_hDC, nFlags);
if (m_hAttribDC != NULL)
nRetVal = ::SetTextAlign(m_hAttribDC, nFlags);
return nRetVal;
}
int CDC::SetTextJustification(int nBreakExtra, int nBreakCount)
{
ASSERT(m_hDC != NULL);
int nRetVal = 0;
if (m_hDC != m_hAttribDC)
nRetVal = ::SetTextJustification(m_hDC, nBreakExtra, nBreakCount);
if (m_hAttribDC != NULL)
nRetVal = ::SetTextJustification(m_hAttribDC, nBreakExtra, nBreakCount);
return nRetVal;
}
int CDC::SetTextCharacterExtra(int nCharExtra)
{
ASSERT(m_hDC != NULL);
int nRetVal = 0x8000000;
if (m_hDC != m_hAttribDC)
nRetVal = ::SetTextCharacterExtra(m_hDC, nCharExtra);
if (m_hAttribDC != NULL)
nRetVal = ::SetTextCharacterExtra(m_hAttribDC, nCharExtra);
return nRetVal;
}
DWORD CDC::SetMapperFlags(DWORD dwFlag)
{
ASSERT(m_hDC != NULL);
DWORD dwRetVal = GDI_ERROR;
if (m_hDC != m_hAttribDC)
dwRetVal = ::SetMapperFlags(m_hDC, dwFlag);
if (m_hAttribDC != NULL)
dwRetVal = ::SetMapperFlags(m_hAttribDC, dwFlag);
return dwRetVal;
}
typedef DWORD (CALLBACK* AFX_GDIGETLAYOUTPROC)(HDC);
typedef DWORD (CALLBACK* AFX_GDISETLAYOUTPROC)(HDC, DWORD);
DWORD CDC::GetLayout() const
{
ASSERT(m_hDC != NULL);
HINSTANCE hInst = ::GetModuleHandleA("GDI32.DLL");
ASSERT(hInst != NULL);
DWORD dwGetLayout = LAYOUT_LTR;
AFX_GDIGETLAYOUTPROC pfn;
pfn = (AFX_GDIGETLAYOUTPROC) GetProcAddress(hInst, "GetLayout");
// if they API is available, just call it. If it is not
// available, indicate an error.
if (pfn != NULL)
dwGetLayout = (*pfn)(m_hDC);
else
{
dwGetLayout = GDI_ERROR;
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
}
return dwGetLayout;
}
DWORD CDC::SetLayout(DWORD dwSetLayout)
{
ASSERT(m_hDC != NULL);
HINSTANCE hInst = ::GetModuleHandleA("GDI32.DLL");
ASSERT(hInst != NULL);
DWORD dwGetLayout = LAYOUT_LTR;
AFX_GDISETLAYOUTPROC pfn;
pfn = (AFX_GDISETLAYOUTPROC) GetProcAddress(hInst, "SetLayout");
// If the API is availalbe, just call it. If it's not available,
// setting anything other than LAYOUT_LTR is an error.
if (pfn != NULL)
dwGetLayout = (*pfn)(m_hDC, dwSetLayout);
else if (dwSetLayout != LAYOUT_LTR)
{
dwGetLayout = GDI_ERROR;
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
}
return dwGetLayout;
}
void CWnd::ScreenToClient(LPRECT lpRect) const
{
ASSERT(::IsWindow(m_hWnd));
::ScreenToClient(m_hWnd, (LPPOINT)lpRect);
::ScreenToClient(m_hWnd, ((LPPOINT)lpRect)+1);
if (GetExStyle() & WS_EX_LAYOUTRTL)
CRect::SwapLeftRight(lpRect);
}
void CWnd::ClientToScreen(LPRECT lpRect) const
{
ASSERT(::IsWindow(m_hWnd));
::ClientToScreen(m_hWnd, (LPPOINT)lpRect);
::ClientToScreen(m_hWnd, ((LPPOINT)lpRect)+1);
if (GetExStyle() & WS_EX_LAYOUTRTL)
CRect::SwapLeftRight(lpRect);
}
/////////////////////////////////////////////////////////////////////////////
// Advanced Win32 GDI functions
BOOL CDC::ArcTo(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4)
{
ASSERT(m_hDC != NULL);
BOOL bResult = ::ArcTo(m_hDC, x1, y1, x2, y2, x3, y3, x4, y4);
if (m_hDC != m_hAttribDC)
{
CPoint pt;
VERIFY(::GetCurrentPositionEx(m_hDC, &pt));
VERIFY(::MoveToEx(m_hAttribDC, pt.x, pt.y, NULL));
}
return bResult;
}
int CDC::SetArcDirection(int nArcDirection)
{
ASSERT(m_hDC != NULL);
int nResult = 0;
if (m_hDC != m_hAttribDC)
nResult = ::SetArcDirection(m_hDC, nArcDirection);
if (m_hAttribDC != NULL)
nResult = ::SetArcDirection(m_hAttribDC, nArcDirection);
return nResult;
}
BOOL CDC::PolyDraw(const POINT* lpPoints, const BYTE* lpTypes, int nCount)
{
ASSERT(m_hDC != NULL);
BOOL bResult = ::PolyDraw(m_hDC, lpPoints, lpTypes, nCount);
if (m_hDC != m_hAttribDC)
{
CPoint pt;
VERIFY(::GetCurrentPositionEx(m_hDC, &pt));
VERIFY(::MoveToEx(m_hAttribDC, pt.x, pt.y, NULL));
}
return bResult;
}
BOOL CDC::PolylineTo(const POINT* lpPoints, int nCount)
{
ASSERT(m_hDC != NULL);
BOOL bResult = ::PolylineTo(m_hDC, lpPoints, nCount);
if (m_hDC != m_hAttribDC)
{
CPoint pt;
VERIFY(::GetCurrentPositionEx(m_hDC, &pt));
VERIFY(::MoveToEx(m_hAttribDC, pt.x, pt.y, NULL));
}
return bResult;
}
BOOL CDC::SetColorAdjustment(const COLORADJUSTMENT* lpColorAdjust)
{
ASSERT(m_hDC != NULL);
BOOL bResult = FALSE;
if (m_hDC != m_hAttribDC)
bResult = ::SetColorAdjustment(m_hDC, lpColorAdjust);
if (m_hAttribDC != NULL)
bResult = ::SetColorAdjustment(m_hAttribDC, lpColorAdjust);
return bResult;
}
BOOL CDC::PolyBezierTo(const POINT* lpPoints, int nCount)
{
ASSERT(m_hDC != NULL);
BOOL bResult = ::PolyBezierTo(m_hDC, lpPoints, nCount);
if (m_hDC != m_hAttribDC)
{
CPoint pt;
VERIFY(::GetCurrentPositionEx(m_hDC, &pt));
VERIFY(::MoveToEx(m_hAttribDC, pt.x, pt.y, NULL));
}
return bResult;
}
BOOL CDC::SelectClipPath(int nMode)
{
ASSERT(m_hDC != NULL);
// output DC always holds the current path
if (!::SelectClipPath(m_hDC, nMode))
return FALSE;
// transfer clipping region into the attribute DC
BOOL bResult = TRUE;
if (m_hDC != m_hAttribDC)
{
HRGN hRgn = ::CreateRectRgn(0, 0, 0, 0);
if (::GetClipRgn(m_hDC, hRgn) < 0 || !::SelectClipRgn(m_hAttribDC, hRgn))
{
TRACE0("Error: unable to transfer clip region in CDC::SelectClipPath!\n");
bResult = FALSE;
}
DeleteObject(hRgn);
}
return bResult;
}
int CDC::SelectClipRgn(CRgn* pRgn, int nMode)
{
ASSERT(m_hDC != NULL);
int nRetVal = ERROR;
if (m_hDC != m_hAttribDC)
nRetVal = ::ExtSelectClipRgn(m_hDC, (HRGN)pRgn->GetSafeHandle(), nMode);
if (m_hAttribDC != NULL)
nRetVal = ::ExtSelectClipRgn(m_hAttribDC, (HRGN)pRgn->GetSafeHandle(), nMode);
return nRetVal;
}
/////////////////////////////////////////////////////////////////////////////
// Special handling for metafile playback
int CALLBACK AfxEnumMetaFileProc(HDC hDC,
HANDLETABLE* pHandleTable, METARECORD* pMetaRec, int nHandles, LPARAM lParam)
{
CDC* pDC = (CDC*)lParam;
ASSERT_VALID(pDC);
switch (pMetaRec->rdFunction)
{
// these records have effects different for each CDC derived class
case META_SETMAPMODE:
pDC->SetMapMode((int)(short)pMetaRec->rdParm[0]);
break;
case META_SETWINDOWEXT:
pDC->SetWindowExt(
(int)(short)pMetaRec->rdParm[1], (int)(short)pMetaRec->rdParm[0]);
break;
case META_SETWINDOWORG:
pDC->SetWindowOrg(
(int)(short)pMetaRec->rdParm[1], (int)(short)pMetaRec->rdParm[0]);
break;
case META_SETVIEWPORTEXT:
pDC->SetViewportExt(
(int)(short)pMetaRec->rdParm[1], (int)(short)pMetaRec->rdParm[0]);
break;
case META_SETVIEWPORTORG:
pDC->SetViewportOrg(
(int)(short)pMetaRec->rdParm[1], (int)(short)pMetaRec->rdParm[0]);
break;
case META_SCALEWINDOWEXT:
pDC->ScaleWindowExt(
(int)(short)pMetaRec->rdParm[3], (int)(short)pMetaRec->rdParm[2],
(int)(short)pMetaRec->rdParm[1], (int)(short)pMetaRec->rdParm[0]);
break;
case META_SCALEVIEWPORTEXT:
pDC->ScaleViewportExt(
(int)(short)pMetaRec->rdParm[3], (int)(short)pMetaRec->rdParm[2],
(int)(short)pMetaRec->rdParm[1], (int)(short)pMetaRec->rdParm[0]);
break;
case META_OFFSETVIEWPORTORG:
pDC->OffsetViewportOrg(
(int)(short)pMetaRec->rdParm[1], (int)(short)pMetaRec->rdParm[0]);
break;
case META_SAVEDC:
pDC->SaveDC();
break;
case META_RESTOREDC:
pDC->RestoreDC((int)(short)pMetaRec->rdParm[0]);
break;
case META_SETBKCOLOR:
pDC->SetBkColor(*(UNALIGNED COLORREF*)&pMetaRec->rdParm[0]);
break;
case META_SETTEXTCOLOR:
pDC->SetTextColor(*(UNALIGNED COLORREF*)&pMetaRec->rdParm[0]);
break;
// need to watch out for SelectObject(HFONT), for custom font mapping
case META_SELECTOBJECT:
{
HGDIOBJ hObject = pHandleTable->objectHandle[pMetaRec->rdParm[0]];
UINT nObjType = GetObjectType(hObject);
if (nObjType == 0)
{
// object type is unknown, determine if it is a font
HFONT hStockFont = (HFONT)::GetStockObject(SYSTEM_FONT);
HFONT hFontOld = (HFONT)::SelectObject(pDC->m_hDC, hStockFont);
HGDIOBJ hObjOld = ::SelectObject(pDC->m_hDC, hObject);
if (hObjOld == hStockFont)
{
// got the stock object back, so must be selecting a font
pDC->SelectObject(CFont::FromHandle((HFONT)hObject));
break; // don't play the default record
}
else
{
// didn't get the stock object back, so restore everything
::SelectObject(pDC->m_hDC, hFontOld);
::SelectObject(pDC->m_hDC, hObjOld);
}
// and fall through to PlayMetaFileRecord...
}
else if (nObjType == OBJ_FONT)
{
// play back as CDC::SelectObject(CFont*)
pDC->SelectObject(CFont::FromHandle((HFONT)hObject));
break; // don't play the default record
}
}
// fall through...
default:
::PlayMetaFileRecord(hDC, pHandleTable, pMetaRec, nHandles);
break;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -