有没有知道 啊!都发了9个帖了!CDC

fanqing 2004-12-20 09:04:15
HBRUSH CffffDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{....
if(pWnd->GetDlgCtrlID()==IDC_EDIT1);//范围限制
//pDC->SetTextCharacterExtra(20);//正确
(edit.GetDC())->SetTextCharacterExtra(20);//不正确(edit为控件变量)
...
}
pDC和(edit.GetDC())为什么不同.应该相同CDC指针啊!


...全文
149 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
StockViews 2004-12-21
  • 打赏
  • 举报
回复
再打一个比方说,CWnd可以比作是酒店,CDC可以比作是暂时招来的并随时可以走人的服务员,而HDC就是厨师(我们假设这里的厨师是永久的并且只有唯一一位)。
你在不同时候,找到的服务员可能是不一样的,但不同的服务员都能为你提供相同的服务,因为她们对应于同一个的厨师。如果你只招来服务员(GetDC)但不解雇她(ReleaseDC),那么你就会浪费资源,时间长了,你就要倒闭了。

其实,GetDC这个函数的名字起得并不好,很容易使人误解成只是取得一个属性而已,很难想到是创建了一个对象,如果改成是CreateDC,那么就容易理解多了。
StockViews 2004-12-21
  • 打赏
  • 举报
回复
看看其源程序,
_AFXWIN_INLINE CDC* CWnd::GetDC()
{ ASSERT(::IsWindow(m_hWnd)); return CDC::FromHandle(::GetDC(m_hWnd)); }
_AFXWIN_INLINE int CWnd::ReleaseDC(CDC* pDC)
{ ASSERT(::IsWindow(m_hWnd)); return ::ReleaseDC(m_hWnd, pDC->m_hDC); }

不难发现,对于同一个CWnd来说,多次调用GetDC()得到的CDC应该是不同的。也就是说,在每次调用GetDC时,系统都重新生成了一个CDC对象(这里虽同属于CDC类,但是完全不同的对象,地址当然不同了),但不同的CDC对象其对应的HDC是相同的(这里的HDC是由::GetDC(m_hWnd)得到的,而只要m_hWnd相同,那么其HDC也相同,这是一一对应的),如果楼主还不明白,请认真学习一下CDC::FromHandle(HDC hdc)函数。

可能楼主还未注意到另一个现象,就是你的代码存在资源泄漏。原因见上面的描述。
正确的用法是,GetDC()与ReleaseDC(CDC* pDC)成对出现。上面的代码应该写成:

if(pWnd->GetDlgCtrlID()==IDC_EDIT1);//范围限制
{
CDC *pEditDC=edit.GetDC();
pEditDC->SetTextCharacterExtra(20);
edit.ReleaseDC(pEditDC);//与edit.GetDC()成对出现
...
}
StockViews 2004-12-21
  • 打赏
  • 举报
回复
另,我想请你帮助的,是把那三个论坛上的内容转贴到 http://bm.m118.com 中。
StockViews 2004-12-21
  • 打赏
  • 举报
回复
可以这么说,一个HWND 对于应一个 HDC.
而CDC是对HDC的一个封装,但一个HDC可以同时对应于多个CDC。
如果把HDC比作电视机,那么CDC就是遥控器,你可以直接操作电视机,也可以通过遥控器来操作电视机。但为了方便我安全,一般人喜欢使用遥控器。
如果你愿意,一台电视机可以同时适用于多个遥控器,每一个遥控器的每一个操作都可以影响到电机机的状态。

控件,这里也就是一个窗口类(CWnd),它没有对应于某一固定的CDC类,只是对应于HDC,所有需要CDC的地方都是“动态”创建的(当然所有使用CDC的地方也可以直接使用HDC),也就是每一次得到的CDC都不尽相同的原因。
fanqing 2004-12-21
  • 打赏
  • 举报
回复
楼上网页我去过了(介绍所吗).不知道你发现吗?pwnd和HDC的却是一一对应的.但是我的问题主要还是在于.pdc到底是不是对应控件的cdc*.如果是的话他为什么和控件变量得到的HDC 不同;如果不是的话为什么msdn说是呢?而且有部分功能执行效果一样.
fanqing 2004-12-21
  • 打赏
  • 举报
回复
up
StockViews 2004-12-21
  • 打赏
  • 举报
回复
如果你认为我的回答对你有用,请帮我做一件事。

到 http://bm.m118.com 注册一个用户,并把下面三个地址中相关内容转到上面。
http://bbs.szhome.com/commentdetail.asp?id=6165014&projectid=72100
http://bbs.szhome.com/commentdetail.asp?id=5844309&projectid=110000
http://bbs.szhome.com/commentdetail.asp?id=5743257&projectid=100200

最好是不同的日期分别做多次,本人不胜感谢。
I_Love_CPP 2004-12-20
  • 打赏
  • 举报
回复
(看来上次是给你讲错了,此时getdc返回的并不是HANDLE。)

它们并不是相同的指针:
HBRUSH CffffDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
中的pDC是CffffDlg的设备上下文
edit.GetDC()返回的是edit的设备上下文。

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

试试用AI创作助手写篇文章吧