📄 atlgdi.h
字号:
bool operator ==(const LOGFONT& logfont) const
{
return(logfont.lfHeight == lfHeight &&
logfont.lfWidth == lfWidth &&
logfont.lfEscapement == lfEscapement &&
logfont.lfOrientation == lfOrientation &&
logfont.lfWeight == lfWeight &&
logfont.lfItalic == lfItalic &&
logfont.lfUnderline == lfUnderline &&
logfont.lfStrikeOut == lfStrikeOut &&
logfont.lfCharSet == lfCharSet &&
logfont.lfOutPrecision == lfOutPrecision &&
logfont.lfClipPrecision == lfClipPrecision &&
logfont.lfQuality == lfQuality &&
logfont.lfPitchAndFamily == lfPitchAndFamily &&
lstrcmp(logfont.lfFaceName, lfFaceName) == 0);
}
};
template <bool t_bManaged>
class CFontT
{
public:
// Data members
HFONT m_hFont;
// Constructor/destructor/operators
CFontT(HFONT hFont = NULL) : m_hFont(hFont)
{ }
~CFontT()
{
if(t_bManaged && m_hFont != NULL)
DeleteObject();
}
CFontT<t_bManaged>& operator =(HFONT hFont)
{
Attach(hFont);
return *this;
}
void Attach(HFONT hFont)
{
if(t_bManaged && m_hFont != NULL && m_hFont != hFont)
::DeleteObject(m_hFont);
m_hFont = hFont;
}
HFONT Detach()
{
HFONT hFont = m_hFont;
m_hFont = NULL;
return hFont;
}
operator HFONT() const { return m_hFont; }
bool IsNull() const { return (m_hFont == NULL); }
// Create methods
HFONT CreateFontIndirect(const LOGFONT* lpLogFont)
{
ATLASSERT(m_hFont == NULL);
m_hFont = ::CreateFontIndirect(lpLogFont);
return m_hFont;
}
#if !defined(_WIN32_WCE) && (_WIN32_WINNT >= 0x0500)
HFONT CreateFontIndirectEx(CONST ENUMLOGFONTEXDV* penumlfex)
{
ATLASSERT(m_hFont == NULL);
m_hFont = ::CreateFontIndirectEx(penumlfex);
return m_hFont;
}
#endif // !defined(_WIN32_WCE) && (_WIN32_WINNT >= 0x0500)
#if !defined(_WIN32_WCE) || (_ATL_VER >= 0x0800)
HFONT CreateFont(int nHeight, int nWidth, int nEscapement,
int nOrientation, int nWeight, BYTE bItalic, BYTE bUnderline,
BYTE cStrikeOut, BYTE nCharSet, BYTE nOutPrecision,
BYTE nClipPrecision, BYTE nQuality, BYTE nPitchAndFamily,
LPCTSTR lpszFacename)
{
ATLASSERT(m_hFont == NULL);
#ifndef _WIN32_WCE
m_hFont = ::CreateFont(nHeight, nWidth, nEscapement,
nOrientation, nWeight, bItalic, bUnderline, cStrikeOut,
nCharSet, nOutPrecision, nClipPrecision, nQuality,
nPitchAndFamily, lpszFacename);
#else // CE specific
m_hFont = ATL::CreateFont(nHeight, nWidth, nEscapement,
nOrientation, nWeight, bItalic, bUnderline, cStrikeOut,
nCharSet, nOutPrecision, nClipPrecision, nQuality,
nPitchAndFamily, lpszFacename);
#endif // _WIN32_WCE
return m_hFont;
}
#endif // !defined(_WIN32_WCE) || (_ATL_VER >= 0x0800)
HFONT CreatePointFont(int nPointSize, LPCTSTR lpszFaceName, HDC hDC = NULL, bool bBold = false, bool bItalic = false)
{
LOGFONT logFont = { 0 };
logFont.lfCharSet = DEFAULT_CHARSET;
logFont.lfHeight = nPointSize;
SecureHelper::strncpy_x(logFont.lfFaceName, _countof(logFont.lfFaceName), lpszFaceName, _TRUNCATE);
if(bBold)
logFont.lfWeight = FW_BOLD;
if(bItalic)
logFont.lfItalic = (BYTE)TRUE;
return CreatePointFontIndirect(&logFont, hDC);
}
HFONT CreatePointFontIndirect(const LOGFONT* lpLogFont, HDC hDC = NULL)
{
HDC hDC1 = (hDC != NULL) ? hDC : ::GetDC(NULL);
// convert nPointSize to logical units based on hDC
LOGFONT logFont = *lpLogFont;
#ifndef _WIN32_WCE
POINT pt = { 0, 0 };
pt.y = ::MulDiv(::GetDeviceCaps(hDC1, LOGPIXELSY), logFont.lfHeight, 720); // 72 points/inch, 10 decipoints/point
::DPtoLP(hDC1, &pt, 1);
POINT ptOrg = { 0, 0 };
::DPtoLP(hDC1, &ptOrg, 1);
logFont.lfHeight = -abs(pt.y - ptOrg.y);
#else // CE specific
// DP and LP are always the same on CE
logFont.lfHeight = -abs(::MulDiv(::GetDeviceCaps(hDC1, LOGPIXELSY), logFont.lfHeight, 720)); // 72 points/inch, 10 decipoints/point
#endif // _WIN32_WCE
if(hDC == NULL)
::ReleaseDC(NULL, hDC1);
return CreateFontIndirect(&logFont);
}
BOOL DeleteObject()
{
ATLASSERT(m_hFont != NULL);
BOOL bRet = ::DeleteObject(m_hFont);
if(bRet)
m_hFont = NULL;
return bRet;
}
// Attributes
int GetLogFont(LOGFONT* pLogFont) const
{
ATLASSERT(m_hFont != NULL);
return ::GetObject(m_hFont, sizeof(LOGFONT), pLogFont);
}
bool GetLogFont(LOGFONT& LogFont) const
{
ATLASSERT(m_hFont != NULL);
return (::GetObject(m_hFont, sizeof(LOGFONT), &LogFont) == sizeof(LOGFONT));
}
};
typedef CFontT<false> CFontHandle;
typedef CFontT<true> CFont;
///////////////////////////////////////////////////////////////////////////////
// CBitmap
template <bool t_bManaged>
class CBitmapT
{
public:
// Data members
HBITMAP m_hBitmap;
// Constructor/destructor/operators
CBitmapT(HBITMAP hBitmap = NULL) : m_hBitmap(hBitmap)
{ }
~CBitmapT()
{
if(t_bManaged && m_hBitmap != NULL)
DeleteObject();
}
CBitmapT<t_bManaged>& operator =(HBITMAP hBitmap)
{
Attach(hBitmap);
return *this;
}
void Attach(HBITMAP hBitmap)
{
if(t_bManaged && m_hBitmap != NULL&& m_hBitmap != hBitmap)
::DeleteObject(m_hBitmap);
m_hBitmap = hBitmap;
}
HBITMAP Detach()
{
HBITMAP hBitmap = m_hBitmap;
m_hBitmap = NULL;
return hBitmap;
}
operator HBITMAP() const { return m_hBitmap; }
bool IsNull() const { return (m_hBitmap == NULL); }
// Create and load methods
HBITMAP LoadBitmap(ATL::_U_STRINGorID bitmap)
{
ATLASSERT(m_hBitmap == NULL);
m_hBitmap = ::LoadBitmap(ModuleHelper::GetResourceInstance(), bitmap.m_lpstr);
return m_hBitmap;
}
HBITMAP LoadOEMBitmap(UINT nIDBitmap) // for OBM_/OCR_/OIC_
{
ATLASSERT(m_hBitmap == NULL);
m_hBitmap = ::LoadBitmap(NULL, MAKEINTRESOURCE(nIDBitmap));
return m_hBitmap;
}
#ifndef _WIN32_WCE
HBITMAP LoadMappedBitmap(UINT nIDBitmap, UINT nFlags = 0, LPCOLORMAP lpColorMap = NULL, int nMapSize = 0)
{
ATLASSERT(m_hBitmap == NULL);
m_hBitmap = ::CreateMappedBitmap(ModuleHelper::GetResourceInstance(), nIDBitmap, (WORD)nFlags, lpColorMap, nMapSize);
return m_hBitmap;
}
#endif // !_WIN32_WCE
HBITMAP CreateBitmap(int nWidth, int nHeight, UINT nPlanes, UINT nBitsPerPixel, const void* lpBits)
{
ATLASSERT(m_hBitmap == NULL);
m_hBitmap = ::CreateBitmap(nWidth, nHeight, nPlanes, nBitsPerPixel, lpBits);
return m_hBitmap;
}
#ifndef _WIN32_WCE
HBITMAP CreateBitmapIndirect(LPBITMAP lpBitmap)
{
ATLASSERT(m_hBitmap == NULL);
m_hBitmap = ::CreateBitmapIndirect(lpBitmap);
return m_hBitmap;
}
#endif // !_WIN32_WCE
HBITMAP CreateCompatibleBitmap(HDC hDC, int nWidth, int nHeight)
{
ATLASSERT(m_hBitmap == NULL);
m_hBitmap = ::CreateCompatibleBitmap(hDC, nWidth, nHeight);
return m_hBitmap;
}
#ifndef _WIN32_WCE
HBITMAP CreateDiscardableBitmap(HDC hDC, int nWidth, int nHeight)
{
ATLASSERT(m_hBitmap == NULL);
m_hBitmap = ::CreateDiscardableBitmap(hDC, nWidth, nHeight);
return m_hBitmap;
}
#endif // !_WIN32_WCE
BOOL DeleteObject()
{
ATLASSERT(m_hBitmap != NULL);
BOOL bRet = ::DeleteObject(m_hBitmap);
if(bRet)
m_hBitmap = NULL;
return bRet;
}
// Attributes
int GetBitmap(BITMAP* pBitMap) const
{
ATLASSERT(m_hBitmap != NULL);
return ::GetObject(m_hBitmap, sizeof(BITMAP), pBitMap);
}
bool GetBitmap(BITMAP& bm) const
{
ATLASSERT(m_hBitmap != NULL);
return (::GetObject(m_hBitmap, sizeof(BITMAP), &bm) == sizeof(BITMAP));
}
bool GetSize(SIZE& size) const
{
ATLASSERT(m_hBitmap != NULL);
BITMAP bm = { 0 };
if(!GetBitmap(&bm))
return false;
size.cx = bm.bmWidth;
size.cy = bm.bmHeight;
return true;
}
#ifndef _WIN32_WCE
DWORD GetBitmapBits(DWORD dwCount, LPVOID lpBits) const
{
ATLASSERT(m_hBitmap != NULL);
return ::GetBitmapBits(m_hBitmap, dwCount, lpBits);
}
#endif // !_WIN32_WCE
#if !defined(_WIN32_WCE) || (_WIN32_WCE >= 410)
DWORD SetBitmapBits(DWORD dwCount, const void* lpBits)
{
ATLASSERT(m_hBitmap != NULL);
return ::SetBitmapBits(m_hBitmap, dwCount, lpBits);
}
#endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 410)
#ifndef _WIN32_WCE
BOOL GetBitmapDimension(LPSIZE lpSize) const
{
ATLASSERT(m_hBitmap != NULL);
return ::GetBitmapDimensionEx(m_hBitmap, lpSize);
}
BOOL SetBitmapDimension(int nWidth, int nHeight, LPSIZE lpSize = NULL)
{
ATLASSERT(m_hBitmap != NULL);
return ::SetBitmapDimensionEx(m_hBitmap, nWidth, nHeight, lpSize);
}
// DIB support
HBITMAP CreateDIBitmap(HDC hDC, CONST BITMAPINFOHEADER* lpbmih, DWORD dwInit, CONST VOID* lpbInit, CONST BITMAPINFO* lpbmi, UINT uColorUse)
{
ATLASSERT(m_hBitmap == NULL);
m_hBitmap = ::CreateDIBitmap(hDC, lpbmih, dwInit, lpbInit, lpbmi, uColorUse);
return m_hBitmap;
}
#endif // !_WIN32_WCE
HBITMAP CreateDIBSection(HDC hDC, CONST BITMAPINFO* lpbmi, UINT uColorUse, VOID** ppvBits, HANDLE hSection, DWORD dwOffset)
{
ATLASSERT(m_hBitmap == NULL);
m_hBitmap = ::CreateDIBSection(hDC, lpbmi, uColorUse, ppvBits, hSection, dwOffset);
return m_hBitmap;
}
#ifndef _WIN32_WCE
int GetDIBits(HDC hDC, UINT uStartScan, UINT cScanLines, LPVOID lpvBits, LPBITMAPINFO lpbmi, UINT uColorUse) const
{
ATLASSERT(m_hBitmap != NULL);
return ::GetDIBits(hDC, m_hBitmap, uStartScan, cScanLines, lpvBits, lpbmi, uColorUse);
}
int SetDIBits(HDC hDC, UINT uStartScan, UINT cScanLines, CONST VOID* lpvBits, CONST BITMAPINFO* lpbmi, UINT uColorUse)
{
ATLASSERT(m_hBitmap != NULL);
return ::SetDIBits(hDC, m_hBitmap, uStartScan, cScanLines, lpvBits, lpbmi, uColorUse);
}
#endif // !_WIN32_WCE
};
typedef CBitmapT<false> CBitmapHandle;
typedef CBitmapT<true> CBitmap;
///////////////////////////////////////////////////////////////////////////////
// CPalette
template <bool t_bManaged>
class CPaletteT
{
public:
// Data members
HPALETTE m_hPalette;
// Constructor/destructor/operators
CPaletteT(HPALETTE hPalette = NULL) : m_hPalette(hPalette)
{ }
~CPaletteT()
{
if(t_bManaged && m_hPalette != NULL)
DeleteObject();
}
CPaletteT<t_bManaged>& operator =(HPALETTE hPalette)
{
Attach(hPalette);
return *this;
}
void Attach(HPALETTE hPalette)
{
if(t_bManaged && m_hPalette != NULL && m_hPalette != hPalette)
::DeleteObject(m_hPalette);
m_hPalette = hPalette;
}
HPALETTE Detach()
{
HPALETTE hPalette = m_hPalette;
m_hPalette = NULL;
return hPalette;
}
operator HPALETTE() const { return m_hPalette; }
bool IsNull() const { return (m_hPalette == NULL); }
// Create methods
HPALETTE CreatePalette(LPLOGPALETTE lpLogPalette)
{
ATLASSERT(m_hPalette == NULL);
m_hPalette = ::CreatePalette(lpLogPalette);
return m_hPalette;
}
#ifndef _WIN32_WCE
HPALETTE CreateHalftonePalette(HDC hDC)
{
ATLASSERT(m_hPalette == NULL);
ATLASSERT(hDC != NULL);
m_hPalette = ::CreateHalftonePalette(hDC);
return m_hPalette;
}
#endif // !_WIN32_WCE
BOOL DeleteObject()
{
ATLASSERT(m_hPalette != NULL);
BOOL bRet = ::DeleteObject(m_hPalette);
if(bRet)
m_hPalette = NULL;
return bRet;
}
// Attributes
int GetEntryCount() const
{
ATLASSERT(m_hPalette != NULL);
WORD nEntries = 0;
::GetObject(m_hPalette, sizeof(WORD), &nEntries);
return (int)nEntries;
}
UINT GetPaletteEntries(UINT nStartIndex, UINT nNumEntries, LPPALETTEENTRY lpPaletteColors) const
{
ATLASSERT(m_hPalette != NULL);
return ::GetPaletteEntries(m_hPalette, nStartIndex, nNumEntries, lpPaletteColors);
}
UINT SetPaletteEntries(UINT nStartIndex, UINT nNumEntries, LPPALETTEENTRY lpPaletteColors)
{
ATLASSERT(m_hPalette != NULL);
return ::SetPaletteEntries(m_hPalette, nStartIndex, nNumEntries, lpPaletteColors);
}
// Operations
#ifndef _WIN32_WCE
void AnimatePalette(UINT nStartIndex, UINT nNumEntries, LPPALETTEENTRY lpPaletteColors)
{
ATLASSERT(m_hPalette != NULL);
::AnimatePalette(m_hPalette, nStartIndex, nNumEntries, lpPaletteColors);
}
BOOL ResizePalette(UINT nNumEntries)
{
ATLASSERT(m_hPalette != NULL);
return ::ResizePalette(m_hPalette, nNumEntries);
}
#endif // !_WIN32_WCE
UINT GetNearestPaletteIndex(COLORREF crColor) const
{
ATLASSERT(m_hPalette != NULL);
return ::GetNearestPaletteIndex(m_hPalette, crColor);
}
};
typedef CPaletteT<false> CPaletteHandle;
typedef CPaletteT<true> CPalette;
///////////////////////////////////////////////////////////////////////////////
// CRgn
template <bool t_bManaged>
class CRgnT
{
public:
// Data members
HRGN m_hRgn;
// Constructor/destructor/operators
CRgnT(HRGN hRgn = NULL) : m_hRgn(hRgn)
{ }
~CRgnT()
{
if(t_bManaged && m_hRgn != NULL)
DeleteObject();
}
CRgnT<t_bManaged>& operator =(HRGN hRgn)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -