📄 atlgdi.h
字号:
dc.SelectBitmap(hbmOldDC);
if(hSrcDC == NULL)
dc.DeleteDC();
return TRUE;
}
// Text Functions
BOOL TextOut(int x, int y, LPCTSTR lpszString, int nCount = -1)
{
ATLASSERT(m_hDC != NULL);
if(nCount == -1)
nCount = lstrlen(lpszString);
return ::TextOut(m_hDC, x, y, lpszString, nCount);
}
BOOL ExtTextOut(int x, int y, UINT nOptions, LPCRECT lpRect, LPCTSTR lpszString, UINT nCount = -1, LPINT lpDxWidths = NULL)
{
ATLASSERT(m_hDC != NULL);
if(nCount == -1)
nCount = lstrlen(lpszString);
return ::ExtTextOut(m_hDC, x, y, nOptions, lpRect, lpszString, nCount, lpDxWidths);
}
SIZE TabbedTextOut(int x, int y, LPCTSTR lpszString, int nCount = -1, int nTabPositions = 0, LPINT lpnTabStopPositions = NULL, int nTabOrigin = 0)
{
ATLASSERT(m_hDC != NULL);
if(nCount == -1)
nCount = lstrlen(lpszString);
LONG lRes = ::TabbedTextOut(m_hDC, x, y, lpszString, nCount, nTabPositions, lpnTabStopPositions, nTabOrigin);
SIZE size = { GET_X_LPARAM(lRes), GET_Y_LPARAM(lRes) };
return size;
}
int DrawText(LPCTSTR lpstrText, int cchText, LPRECT lpRect, UINT uFormat)
{
ATLASSERT(m_hDC != NULL);
return ::DrawText(m_hDC, lpstrText, cchText, lpRect, uFormat);
}
int DrawTextEx(LPTSTR lpstrText, int cchText, LPRECT lpRect, UINT uFormat, LPDRAWTEXTPARAMS lpDTParams = NULL)
{
ATLASSERT(m_hDC != NULL);
return ::DrawTextEx(m_hDC, lpstrText, cchText, lpRect, uFormat, lpDTParams);
}
#if (_WIN32_WINNT >= 0x0501)
int DrawShadowText(LPCWSTR lpstrText, int cchText, LPRECT lpRect, DWORD dwFlags, COLORREF clrText, COLORREF clrShadow, int xOffset, int yOffset)
{
ATLASSERT(m_hDC != NULL);
// This function is present only if comctl32.dll version 6 is loaded;
// we use LoadLibrary/GetProcAddress to allow apps compiled with
// _WIN32_WINNT >= 0x0501 to run on older Windows/CommCtrl
int nRet = 0;
HMODULE hCommCtrlDLL = ::LoadLibrary(_T("comctl32.dll"));
ATLASSERT(hCommCtrlDLL != NULL);
if(hCommCtrlDLL != NULL)
{
typedef int (WINAPI *PFN_DrawShadowText)(HDC hDC, LPCWSTR lpstrText, UINT cchText, LPRECT lpRect, DWORD dwFlags, COLORREF clrText, COLORREF clrShadow, int xOffset, int yOffset);
PFN_DrawShadowText pfnDrawShadowText = (PFN_DrawShadowText)::GetProcAddress(hCommCtrlDLL, "DrawShadowText");
ATLASSERT(pfnDrawShadowText != NULL); // this function requires CommCtrl6
if(pfnDrawShadowText != NULL)
nRet = pfnDrawShadowText(m_hDC, lpstrText, cchText, lpRect, dwFlags, clrText, clrShadow, xOffset, yOffset);
::FreeLibrary(hCommCtrlDLL);
}
return nRet;
}
#endif //(_WIN32_WINNT >= 0x0501)
BOOL GetTextExtent(LPCTSTR lpszString, int nCount, LPSIZE lpSize) const
{
ATLASSERT(m_hDC != NULL);
if(nCount == -1)
nCount = lstrlen(lpszString);
return ::GetTextExtentPoint32(m_hDC, lpszString, nCount, lpSize);
}
DWORD GetTabbedTextExtent(LPCTSTR lpszString, int nCount = -1, int nTabPositions = 0, LPINT lpnTabStopPositions = NULL) const
{
ATLASSERT(m_hDC != NULL);
if(nCount == -1)
nCount = lstrlen(lpszString);
return ::GetTabbedTextExtent(m_hDC, lpszString, nCount, nTabPositions, lpnTabStopPositions);
}
BOOL GrayString(HBRUSH hBrush, BOOL (CALLBACK* lpfnOutput)(HDC, LPARAM, int), LPARAM lpData, int nCount, int x, int y, int nWidth, int nHeight)
{
ATLASSERT(m_hDC != NULL);
return ::GrayString(m_hDC, hBrush, (GRAYSTRINGPROC)lpfnOutput, lpData, nCount, x, y, nWidth, nHeight);
}
UINT GetTextAlign() const
{
ATLASSERT(m_hDC != NULL);
return ::GetTextAlign(m_hDC);
}
UINT SetTextAlign(UINT nFlags)
{
ATLASSERT(m_hDC != NULL);
return ::SetTextAlign(m_hDC, nFlags);
}
int GetTextFace(LPTSTR lpszFacename, int nCount) const
{
ATLASSERT(m_hDC != NULL);
return ::GetTextFace(m_hDC, nCount, lpszFacename);
}
int GetTextFaceLen() const
{
ATLASSERT(m_hDC != NULL);
return ::GetTextFace(m_hDC, 0, NULL);
}
#ifndef _ATL_NO_COM
#ifdef _OLEAUTO_H_
BOOL GetTextFace(BSTR& bstrFace) const
{
USES_CONVERSION;
ATLASSERT(m_hDC != NULL);
ATLASSERT(bstrFace == NULL);
int nLen = GetTextFaceLen();
if(nLen == 0)
return FALSE;
LPTSTR lpszText = (LPTSTR)_alloca(nLen * sizeof(TCHAR));
if(!GetTextFace(lpszText, nLen))
return FALSE;
bstrFace = ::SysAllocString(T2OLE(lpszText));
return (bstrFace != NULL) ? TRUE : FALSE;
}
#endif
#endif //!_ATL_NO_COM
#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
int GetTextFace(CString& strFace) const
{
ATLASSERT(m_hDC != NULL);
int nLen = GetTextFaceLen();
if(nLen == 0)
return 0;
LPTSTR lpstr = strFace.GetBufferSetLength(nLen);
if(lpstr == NULL)
return 0;
int nRet = GetTextFace(lpstr, nLen);
strFace.ReleaseBuffer();
return nRet;
}
#endif //defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
BOOL GetTextMetrics(LPTEXTMETRIC lpMetrics) const
{
ATLASSERT(m_hDC != NULL);
return ::GetTextMetrics(m_hDC, lpMetrics);
}
int SetTextJustification(int nBreakExtra, int nBreakCount)
{
ATLASSERT(m_hDC != NULL);
return ::SetTextJustification(m_hDC, nBreakExtra, nBreakCount);
}
int GetTextCharacterExtra() const
{
ATLASSERT(m_hDC != NULL);
return ::GetTextCharacterExtra(m_hDC);
}
int SetTextCharacterExtra(int nCharExtra)
{
ATLASSERT(m_hDC != NULL);
return ::SetTextCharacterExtra(m_hDC, nCharExtra);
}
// Advanced Drawing
BOOL DrawEdge(LPRECT lpRect, UINT nEdge, UINT nFlags)
{
ATLASSERT(m_hDC != NULL);
return ::DrawEdge(m_hDC, lpRect, nEdge, nFlags);
}
BOOL DrawFrameControl(LPRECT lpRect, UINT nType, UINT nState)
{
ATLASSERT(m_hDC != NULL);
return ::DrawFrameControl(m_hDC, lpRect, nType, nState);
}
// Scrolling Functions
BOOL ScrollDC(int dx, int dy, LPCRECT lpRectScroll, LPCRECT lpRectClip, HRGN hRgnUpdate, LPRECT lpRectUpdate)
{
ATLASSERT(m_hDC != NULL);
return ::ScrollDC(m_hDC, dx, dy, lpRectScroll, lpRectClip, hRgnUpdate, lpRectUpdate);
}
// Font Functions
BOOL GetCharWidth(UINT nFirstChar, UINT nLastChar, LPINT lpBuffer) const
{
ATLASSERT(m_hDC != NULL);
return ::GetCharWidth(m_hDC, nFirstChar, nLastChar, lpBuffer);
}
// GetCharWidth32 is not supported under Win9x
BOOL GetCharWidth32(UINT nFirstChar, UINT nLastChar, LPINT lpBuffer) const
{
ATLASSERT(m_hDC != NULL);
return ::GetCharWidth32(m_hDC, nFirstChar, nLastChar, lpBuffer);
}
DWORD SetMapperFlags(DWORD dwFlag)
{
ATLASSERT(m_hDC != NULL);
return ::SetMapperFlags(m_hDC, dwFlag);
}
BOOL GetAspectRatioFilter(LPSIZE lpSize) const
{
ATLASSERT(m_hDC != NULL);
return ::GetAspectRatioFilterEx(m_hDC, lpSize);
}
BOOL GetCharABCWidths(UINT nFirstChar, UINT nLastChar, LPABC lpabc) const
{
ATLASSERT(m_hDC != NULL);
return ::GetCharABCWidths(m_hDC, nFirstChar, nLastChar, lpabc);
}
DWORD GetFontData(DWORD dwTable, DWORD dwOffset, LPVOID lpData, DWORD cbData) const
{
ATLASSERT(m_hDC != NULL);
return ::GetFontData(m_hDC, dwTable, dwOffset, lpData, cbData);
}
int GetKerningPairs(int nPairs, LPKERNINGPAIR lpkrnpair) const
{
ATLASSERT(m_hDC != NULL);
return ::GetKerningPairs(m_hDC, nPairs, lpkrnpair);
}
UINT GetOutlineTextMetrics(UINT cbData, LPOUTLINETEXTMETRIC lpotm) const
{
ATLASSERT(m_hDC != NULL);
return ::GetOutlineTextMetrics(m_hDC, cbData, lpotm);
}
DWORD GetGlyphOutline(UINT nChar, UINT nFormat, LPGLYPHMETRICS lpgm, DWORD cbBuffer, LPVOID lpBuffer, const MAT2* lpmat2) const
{
ATLASSERT(m_hDC != NULL);
return ::GetGlyphOutline(m_hDC, nChar, nFormat, lpgm, cbBuffer, lpBuffer, lpmat2);
}
BOOL GetCharABCWidths(UINT nFirstChar, UINT nLastChar, LPABCFLOAT lpABCF) const
{
ATLASSERT(m_hDC != NULL);
return ::GetCharABCWidthsFloat(m_hDC, nFirstChar, nLastChar, lpABCF);
}
BOOL GetCharWidth(UINT nFirstChar, UINT nLastChar, float* lpFloatBuffer) const
{
ATLASSERT(m_hDC != NULL);
return ::GetCharWidthFloat(m_hDC, nFirstChar, nLastChar, lpFloatBuffer);
}
// Printer/Device Escape Functions
int Escape(int nEscape, int nCount, LPCSTR lpszInData, LPVOID lpOutData)
{
ATLASSERT(m_hDC != NULL);
return ::Escape(m_hDC, nEscape, nCount, lpszInData, lpOutData);
}
int Escape(int nEscape, int nInputSize, LPCSTR lpszInputData,
int nOutputSize, LPSTR lpszOutputData)
{
ATLASSERT(m_hDC != NULL);
return ::ExtEscape(m_hDC, nEscape, nInputSize, lpszInputData, nOutputSize, lpszOutputData);
}
int DrawEscape(int nEscape, int nInputSize, LPCSTR lpszInputData)
{
ATLASSERT(m_hDC != NULL);
return ::DrawEscape(m_hDC, nEscape, nInputSize, lpszInputData);
}
// Escape helpers
int StartDoc(LPCTSTR lpszDocName) // old Win3.0 version
{
DOCINFO di;
memset(&di, 0, sizeof(DOCINFO));
di.cbSize = sizeof(DOCINFO);
di.lpszDocName = lpszDocName;
return StartDoc(&di);
}
int StartDoc(LPDOCINFO lpDocInfo)
{
ATLASSERT(m_hDC != NULL);
return ::StartDoc(m_hDC, lpDocInfo);
}
int StartPage()
{
ATLASSERT(m_hDC != NULL);
return ::StartPage(m_hDC);
}
int EndPage()
{
ATLASSERT(m_hDC != NULL);
return ::EndPage(m_hDC);
}
int SetAbortProc(BOOL (CALLBACK* lpfn)(HDC, int))
{
ATLASSERT(m_hDC != NULL);
return ::SetAbortProc(m_hDC, (ABORTPROC)lpfn);
}
int AbortDoc()
{
ATLASSERT(m_hDC != NULL);
return ::AbortDoc(m_hDC);
}
int EndDoc()
{
ATLASSERT(m_hDC != NULL);
return ::EndDoc(m_hDC);
}
// MetaFile Functions
BOOL PlayMetaFile(HMETAFILE hMF)
{
ATLASSERT(m_hDC != NULL);
if(::GetDeviceCaps(m_hDC, TECHNOLOGY) == DT_METAFILE)
{
// playing metafile in metafile, just use core windows API
return ::PlayMetaFile(m_hDC, hMF);
}
// for special playback, lParam == pDC
return ::EnumMetaFile(m_hDC, hMF, EnumMetaFileProc, (LPARAM)this);
}
BOOL PlayMetaFile(HENHMETAFILE hEnhMetaFile, LPCRECT lpBounds)
{
ATLASSERT(m_hDC != NULL);
return ::PlayEnhMetaFile(m_hDC, hEnhMetaFile, lpBounds);
}
BOOL AddMetaFileComment(UINT nDataSize, const BYTE* pCommentData) // can be used for enhanced metafiles only
{
ATLASSERT(m_hDC != NULL);
return ::GdiComment(m_hDC, nDataSize, pCommentData);
}
// Special handling for metafile playback
static int CALLBACK EnumMetaFileProc(HDC hDC, HANDLETABLE* pHandleTable, METARECORD* pMetaRec, int nHandles, LPARAM lParam)
{
CDCHandle* pDC = (CDCHandle*)lParam;
switch (pMetaRec->rdFunction)
{
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->SelectFont((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 CDCHandle::SelectFont(HFONT)
pDC->SelectFont((HFONT)hObject);
break; // don't play the default record
}
}
// fall through...
default:
::PlayMetaFileRecord(hDC, pHandleTable, pMetaRec, nHandles);
break;
}
return 1;
}
// Path Functions
BOOL AbortPath()
{
ATLASSERT(m_hDC != NULL);
return ::AbortPath(m_hDC);
}
BOOL BeginPath()
{
ATLASSERT(m_hDC != NULL);
return ::BeginPath(m_hDC);
}
BOOL CloseFigure()
{
ATLASSERT(m_hDC != NULL);
return ::CloseFigure(m_hDC);
}
BOOL EndPath()
{
ATLASSERT(m_hDC != NULL);
return ::EndPath(m_hDC);
}
BOOL FillPath()
{
ATLASSERT(m_hDC != NULL);
return ::FillPath(m_hDC);
}
BOOL FlattenPath()
{
ATLASSERT(m_hDC != NULL);
return ::FlattenPath(m_hDC);
}
BOOL StrokeAndFillPath()
{
ATLASSERT(m_hDC != NULL);
return ::StrokeAndFillPath(m_hDC);
}
BOOL StrokePath()
{
ATLASSERT(m_hDC != NULL);
return ::StrokePath(m_hDC);
}
BOOL WidenPath()
{
ATLASSERT(m_hDC != NULL);
return ::WidenPath(m_hDC);
}
BOOL GetMiterLimit(PFLOAT pfMiterLimit) const
{
ATLASSERT(m_hDC != NULL);
return ::GetMiterLimit(m_hDC, pfMiterLimit);
}
BOOL SetMiterLimit(float fMiterLimit)
{
ATLASSERT(m_hDC != NULL);
return ::SetMiterLimit(m_hDC, fMiterLimit, NULL);
}
int GetPath(LPPOINT lpPo
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -