导航
  • 主页
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

CDC的实现

xzhxjpu 2004-04-11 09:06:03
上次在C:\Program Files\Microsoft Visual Studio\VC98\MFC\SRC
目录下找到CWND类的实现(WndCore.cpp),兴奋不已,
但是CDC的实现应该在哪儿?
(我考虑CDC的实现应该在C:\Program Files\Microsoft Visual Studio\VC98\MFC\LIB目录下,请问该如何浏览呢?)
...全文
88 点赞 收藏 4
写回复
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
bhut 2004-04-11
Lib目录下都是Lib文件吧,
源代码都在Microsoft Visual Studio\VC98\MFC\SRC目录下,
只要搜索一下特征字符,比如CDC::CDC,就能找到了
回复
wsh_yao 2004-04-11
学习
回复
simouse 2004-04-11
gz
回复
_foo 2004-04-11
可以这样。
定义CDC dc;并在该行设置断点,f5运行程序,在该断点处跟进,我发现是在mfc\src\wingdi.cpp这个文件里。




CDC::CDC()
{
m_hDC = NULL;
m_hAttribDC = NULL;
m_bPrinting = FALSE;
}

#ifdef _DEBUG
void CDC::AssertValid() const
{
CObject::AssertValid();
}

void CDC::Dump(CDumpContext& dc) const
{
CObject::Dump(dc);

dc << "m_hDC = " << (UINT)m_hDC;
dc << "\nm_hAttribDC = " << (UINT)m_hAttribDC;
dc << "\nm_bPrinting = " << m_bPrinting;

dc << "\n";
}
#endif //_DEBUG

#include "fixalloc.h"

class CTempDC : public CDC
{
DECLARE_DYNCREATE(CTempDC)
DECLARE_FIXED_ALLOC(CTempDC);
};

CHandleMap* PASCAL afxMapHDC(BOOL bCreate)
{
AFX_MODULE_THREAD_STATE* pState = AfxGetModuleThreadState();
if (pState->m_pmapHDC == NULL && bCreate)
{
BOOL bEnable = AfxEnableMemoryTracking(FALSE);
#ifndef _AFX_PORTABLE
_PNH pnhOldHandler = AfxSetNewHandler(&AfxCriticalNewHandler);
#endif
pState->m_pmapHDC = new CHandleMap(RUNTIME_CLASS(CTempDC),
offsetof(CDC, m_hDC), 2);

#ifndef _AFX_PORTABLE
AfxSetNewHandler(pnhOldHandler);
#endif
AfxEnableMemoryTracking(bEnable);
}
return pState->m_pmapHDC;
}

CDC* PASCAL CDC::FromHandle(HDC hDC)
{
CHandleMap* pMap = afxMapHDC(TRUE); //create map if not exist
ASSERT(pMap != NULL);
CDC* pDC = (CDC*)pMap->FromHandle(hDC);
ASSERT(pDC == NULL || pDC->m_hDC == hDC);
return pDC;
}

BOOL CDC::Attach(HDC hDC)
{
ASSERT(m_hDC == NULL); // only attach once, detach on destroy
ASSERT(m_hAttribDC == NULL); // only attach to an empty DC

if (hDC == NULL)
return FALSE;
CHandleMap* pMap = afxMapHDC(TRUE); // create map if not exist
ASSERT(pMap != NULL);
pMap->SetPermanent(m_hDC = hDC, this);

SetAttribDC(m_hDC); // Default to same as output
return TRUE;
}

HDC CDC::Detach()
{
HDC hDC = m_hDC;
if (hDC != NULL)
{
CHandleMap* pMap = afxMapHDC(); // don't create if not exist
if (pMap != NULL)
pMap->RemoveHandle(m_hDC);
}

ReleaseAttribDC();
m_hDC = NULL;
return hDC;
}

BOOL CDC::DeleteDC()
{
if (m_hDC == NULL)
return FALSE;

return ::DeleteDC(Detach());
}

CDC::~CDC()
{
if (m_hDC != NULL)
::DeleteDC(Detach());
}


void CDC::SetAttribDC(HDC hDC) // Set the Attribute DC
{
m_hAttribDC = hDC;
}

void CDC::SetOutputDC(HDC hDC) // Set the Output DC
{
#ifdef _DEBUG
CHandleMap* pMap = afxMapHDC();
if (pMap != NULL && pMap->LookupPermanent(m_hDC) == this)
{
TRACE0("Cannot Set Output hDC on Attached CDC.\n");
ASSERT(FALSE);
}
#endif
m_hDC = hDC;
}

void CDC::ReleaseAttribDC() // Release the Attribute DC
{
m_hAttribDC = NULL;
}
。。。
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……