📄 wingdi.cpp
字号:
return 1;
}
BOOL CDC::PlayMetaFile(HMETAFILE hMF)
{
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, AfxEnumMetaFileProc, (LPARAM)this);
}
/////////////////////////////////////////////////////////////////////////////
// Coordinate transforms
void CDC::LPtoDP(LPSIZE lpSize) const
{
ASSERT(AfxIsValidAddress(lpSize, sizeof(SIZE)));
CSize sizeWinExt = GetWindowExt();
CSize sizeVpExt = GetViewportExt();
lpSize->cx = MulDiv(lpSize->cx, abs(sizeVpExt.cx), abs(sizeWinExt.cx));
lpSize->cy = MulDiv(lpSize->cy, abs(sizeVpExt.cy), abs(sizeWinExt.cy));
}
void CDC::DPtoLP(LPSIZE lpSize) const
{
ASSERT(AfxIsValidAddress(lpSize, sizeof(SIZE)));
CSize sizeWinExt = GetWindowExt();
CSize sizeVpExt = GetViewportExt();
lpSize->cx = MulDiv(lpSize->cx, abs(sizeWinExt.cx), abs(sizeVpExt.cx));
lpSize->cy = MulDiv(lpSize->cy, abs(sizeWinExt.cy), abs(sizeVpExt.cy));
}
/////////////////////////////////////////////////////////////////////////////
// Helper DCs
#ifdef _DEBUG
void CClientDC::AssertValid() const
{
CDC::AssertValid();
ASSERT(m_hWnd == NULL || ::IsWindow(m_hWnd));
}
void CClientDC::Dump(CDumpContext& dc) const
{
CDC::Dump(dc);
dc << "m_hWnd = " << (UINT)m_hWnd;
dc << "\n";
}
#endif
CClientDC::CClientDC(CWnd* pWnd)
{
ASSERT(pWnd == NULL || ::IsWindow(pWnd->m_hWnd));
if (!Attach(::GetDC(m_hWnd = pWnd->GetSafeHwnd())))
AfxThrowResourceException();
}
CClientDC::~CClientDC()
{
ASSERT(m_hDC != NULL);
::ReleaseDC(m_hWnd, Detach());
}
#ifdef _DEBUG
void CWindowDC::AssertValid() const
{
CDC::AssertValid();
ASSERT(m_hWnd == NULL || ::IsWindow(m_hWnd));
}
void CWindowDC::Dump(CDumpContext& dc) const
{
CDC::Dump(dc);
dc << "m_hWnd = " << (UINT)m_hWnd;
dc << "\n";
}
#endif
CWindowDC::CWindowDC(CWnd* pWnd)
{
ASSERT(pWnd == NULL || ::IsWindow(pWnd->m_hWnd));
if (!Attach(::GetWindowDC(m_hWnd = pWnd->GetSafeHwnd())))
AfxThrowResourceException();
}
CWindowDC::~CWindowDC()
{
ASSERT(m_hDC != NULL);
::ReleaseDC(m_hWnd, Detach());
}
#ifdef _DEBUG
void CPaintDC::AssertValid() const
{
CDC::AssertValid();
ASSERT(::IsWindow(m_hWnd));
}
void CPaintDC::Dump(CDumpContext& dc) const
{
CDC::Dump(dc);
dc << "m_hWnd = " << (UINT)m_hWnd;
dc << "\nm_ps.hdc = " << (UINT)m_ps.hdc;
dc << "\nm_ps.fErase = " << m_ps.fErase;
dc << "\nm_ps.rcPaint = " << (CRect)m_ps.rcPaint;
dc << "\n";
}
#endif
CPaintDC::CPaintDC(CWnd* pWnd)
{
ASSERT_VALID(pWnd);
ASSERT(::IsWindow(pWnd->m_hWnd));
if (!Attach(::BeginPaint(m_hWnd = pWnd->m_hWnd, &m_ps)))
AfxThrowResourceException();
}
CPaintDC::~CPaintDC()
{
ASSERT(m_hDC != NULL);
ASSERT(::IsWindow(m_hWnd));
::EndPaint(m_hWnd, &m_ps);
Detach();
}
/////////////////////////////////////////////////////////////////////////////
// CGdiObject
#ifdef _DEBUG
void CGdiObject::Dump(CDumpContext& dc) const
{
CObject::Dump(dc);
dc << "m_hObject = " << (UINT)m_hObject;
dc << "\n";
}
void CGdiObject::AssertValid() const
{
CObject::AssertValid();
ASSERT(m_hObject == NULL ||
(afxData.bWin95 || ::GetObjectType(m_hObject) != 0));
}
#endif
#include "fixalloc.h"
class CTempGdiObject : public CGdiObject
{
DECLARE_DYNCREATE(CTempGdiObject)
DECLARE_FIXED_ALLOC(CTempGdiObject);
};
CHandleMap* PASCAL afxMapHGDIOBJ(BOOL bCreate)
{
AFX_MODULE_THREAD_STATE* pState = AfxGetModuleThreadState();
if (pState->m_pmapHGDIOBJ == NULL && bCreate)
{
BOOL bEnable = AfxEnableMemoryTracking(FALSE);
#ifndef _AFX_PORTABLE
_PNH pnhOldHandler = AfxSetNewHandler(&AfxCriticalNewHandler);
#endif
pState->m_pmapHGDIOBJ = new CHandleMap(RUNTIME_CLASS(CTempGdiObject),
offsetof(CGdiObject, m_hObject));
#ifndef _AFX_PORTABLE
AfxSetNewHandler(pnhOldHandler);
#endif
AfxEnableMemoryTracking(bEnable);
}
return pState->m_pmapHGDIOBJ;
}
CGdiObject* PASCAL CGdiObject::FromHandle(HGDIOBJ h)
{
CHandleMap* pMap = afxMapHGDIOBJ(TRUE); //create map if not exist
ASSERT(pMap != NULL);
CGdiObject* pObject = (CGdiObject*)pMap->FromHandle(h);
ASSERT(pObject == NULL || pObject->m_hObject == h);
return pObject;
}
BOOL CGdiObject::Attach(HGDIOBJ hObject)
{
ASSERT(m_hObject == NULL); // only attach once, detach on destroy
if (hObject == NULL)
return FALSE;
CHandleMap* pMap = afxMapHGDIOBJ(TRUE); // create map if not exist
ASSERT(pMap != NULL);
pMap->SetPermanent(m_hObject = hObject, this);
return TRUE;
}
HGDIOBJ CGdiObject::Detach()
{
HGDIOBJ hObject = m_hObject;
if (hObject != NULL)
{
CHandleMap* pMap = afxMapHGDIOBJ(); // don't create if not exist
if (pMap != NULL)
pMap->RemoveHandle(m_hObject);
}
m_hObject = NULL;
return hObject;
}
BOOL CGdiObject::DeleteObject()
{
if (m_hObject == NULL)
return FALSE;
return ::DeleteObject(Detach());
}
/////////////////////////////////////////////////////////////////////////////
// Standard GDI objects
/////////////////////////////////////////////////////////////////////////////
// CPen
CPen::CPen(int nPenStyle, int nWidth, COLORREF crColor)
{
if (!Attach(::CreatePen(nPenStyle, nWidth, crColor)))
AfxThrowResourceException();
}
CPen::CPen(int nPenStyle, int nWidth, const LOGBRUSH* pLogBrush,
int nStyleCount, const DWORD* lpStyle)
{
if (!Attach(::ExtCreatePen(nPenStyle, nWidth, pLogBrush, nStyleCount,
lpStyle)))
AfxThrowResourceException();
}
/////////////////////////////////////////////////////////////////////////////
#ifdef _DEBUG
void CPen::Dump(CDumpContext& dc) const
{
CGdiObject::Dump(dc);
if (m_hObject == NULL)
return;
if (!afxData.bWin95 && ::GetObjectType(m_hObject) != OBJ_PEN)
{
// not a valid object
dc << "has ILLEGAL HPEN!";
return;
}
LOGPEN lp;
VERIFY(GetObject(sizeof(lp), &lp));
dc << "lgpn.lopnStyle = " << lp.lopnStyle;
dc << "\nlgpn.lopnWidth.x (width) = " << lp.lopnWidth.x;
dc << "\nlgpn.lopnColor = " << (void*)lp.lopnColor;
dc << "\n";
}
#endif
/////////////////////////////////////////////////////////////////////////////
// CBrush
CBrush::CBrush(COLORREF crColor)
{
if (!Attach(::CreateSolidBrush(crColor)))
AfxThrowResourceException();
}
CBrush::CBrush(int nIndex, COLORREF crColor)
{
if (!Attach(::CreateHatchBrush(nIndex, crColor)))
AfxThrowResourceException();
}
CBrush::CBrush(CBitmap* pBitmap)
{
ASSERT_VALID(pBitmap);
if (!Attach(::CreatePatternBrush((HBITMAP)pBitmap->m_hObject)))
AfxThrowResourceException();
}
BOOL CBrush::CreateDIBPatternBrush(HGLOBAL hPackedDIB, UINT nUsage)
{
ASSERT(hPackedDIB != NULL);
const void* lpPackedDIB = ::GlobalLock(hPackedDIB);
ASSERT(lpPackedDIB != NULL);
BOOL bResult = Attach(::CreateDIBPatternBrushPt(lpPackedDIB, nUsage));
::GlobalUnlock(hPackedDIB);
return bResult;
}
#ifdef _DEBUG
void CBrush::Dump(CDumpContext& dc) const
{
CGdiObject::Dump(dc);
if (m_hObject == NULL)
return;
if (!afxData.bWin95 && ::GetObjectType(m_hObject) != OBJ_BRUSH)
{
// not a valid window
dc << "has ILLEGAL HBRUSH!";
return;
}
LOGBRUSH lb;
VERIFY(GetObject(sizeof(lb), &lb));
dc << "lb.lbStyle = " << lb.lbStyle;
dc << "\nlb.lbHatch = " << lb.lbHatch;
dc << "\nlb.lbColor = " << (void*)lb.lbColor;
dc << "\n";
}
#endif
/////////////////////////////////////////////////////////////////////////////
#ifdef _DEBUG
void CFont::Dump(CDumpContext& dc) const
{
CGdiObject::Dump(dc);
if (m_hObject == NULL)
return;
if (!afxData.bWin95 && ::GetObjectType(m_hObject) != OBJ_FONT)
{
// not a valid GDI object
dc << "has ILLEGAL HFONT!";
return;
}
LOGFONT lf;
VERIFY(GetObject(sizeof(lf), &lf));
dc << "lf.lfHeight = " << lf.lfHeight;
dc << "\nlf.lfWidth = " << lf.lfWidth;
dc << "\nlf.lfEscapement = " << lf.lfEscapement;
dc << "\nlf.lfOrientation = " << lf.lfOrientation;
dc << "\nlf.lfWeight = " << lf.lfWeight;
dc << "\nlf.lfItalic = " << (int)lf.lfItalic;
dc << "\nlf.lfUnderline = " << (int)lf.lfUnderline;
dc << "\nlf.lfStrikeOut = " << (int)lf.lfStrikeOut;
dc << "\nlf.lfCharSet = " << (int)lf.lfCharSet;
dc << "\nlf.lfOutPrecision = " << (int)lf.lfOutPrecision;
dc << "\nlf.lfClipPrecision = " << (int)lf.lfClipPrecision;
dc << "\nlf.lfQuality = " << (int)lf.lfQuality;
dc << "\nlf.lfPitchAndFamily = " << (int)lf.lfPitchAndFamily;
dc << "\nlf.lfFaceName = " << (LPCTSTR)lf.lfFaceName;
dc << "\n";
}
#endif
/////////////////////////////////////////////////////////////////////////////
#ifdef _DEBUG
void CBitmap::Dump(CDumpContext& dc) const
{
CGdiObject::Dump(dc);
if (m_hObject == NULL)
return;
if (!afxData.bWin95 && ::GetObjectType(m_hObject) != OBJ_BITMAP)
{
// not a valid object
dc << "has ILLEGAL HBITMAP!";
return;
}
BITMAP bm;
VERIFY(GetObject(sizeof(bm), &bm));
dc << "bm.bmType = " << bm.bmType;
dc << "\nbm.bmHeight = " << bm.bmHeight;
dc << "\nbm.bmWidth = " << bm.bmWidth;
dc << "\nbm.bmWidthBytes = " << bm.bmWidthBytes;
dc << "\nbm.bmPlanes = " << bm.bmPlanes;
dc << "\nbm.bmBitsPixel = " << bm.bmBitsPixel;
dc << "\n";
}
#endif
#ifdef AFX_INIT_SEG
#pragma code_seg(AFX_INIT_SEG)
#endif
IMPLEMENT_DYNAMIC(CResourceException, CException)
CResourceException _simpleResourceException(FALSE, AFX_IDS_RESOURCE_EXCEPTION);
IMPLEMENT_DYNAMIC(CUserException, CException)
CUserException _simpleUserException(FALSE, AFX_IDS_USER_EXCEPTION);
IMPLEMENT_DYNCREATE(CDC, CObject)
IMPLEMENT_DYNAMIC(CClientDC, CDC)
IMPLEMENT_DYNAMIC(CWindowDC, CDC)
IMPLEMENT_DYNAMIC(CPaintDC, CDC)
IMPLEMENT_DYNCREATE(CGdiObject, CObject)
IMPLEMENT_DYNAMIC(CPen, CGdiObject)
IMPLEMENT_DYNAMIC(CBrush, CGdiObject)
IMPLEMENT_DYNAMIC(CFont, CGdiObject)
IMPLEMENT_DYNAMIC(CBitmap, CGdiObject)
IMPLEMENT_DYNAMIC(CPalette, CGdiObject)
IMPLEMENT_DYNAMIC(CRgn, CGdiObject)
IMPLEMENT_DYNCREATE(CTempDC, CDC);
IMPLEMENT_DYNCREATE(CTempGdiObject, CGdiObject);
/////////////////////////////////////////////////////////////////////////////
// Standard exception processing
#ifdef AFX_CORE2_SEG
#pragma code_seg(AFX_CORE2_SEG)
#endif
// resource failure
void AFXAPI AfxThrowResourceException()
{
THROW((CResourceException*)&_simpleResourceException);
}
// user alert
void AFXAPI AfxThrowUserException()
{
THROW((CUserException*)&_simpleUserException);
}
#ifdef AFX_INIT_SEG
#pragma code_seg(AFX_INIT_SEG)
#endif
#pragma warning(disable: 4074)
#pragma init_seg(compiler)
IMPLEMENT_FIXED_ALLOC(CTempDC, 64);
IMPLEMENT_FIXED_ALLOC(CTempGdiObject, 64);
/////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -