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指针啊!
{....
if(pWnd->GetDlgCtrlID()==IDC_EDIT1);//范围限制
//pDC->SetTextCharacterExtra(20);//正确
(edit.GetDC())->SetTextCharacterExtra(20);//不正确(edit为控件变量)
...
}
pDC和(edit.GetDC())为什么不同.应该相同CDC指针啊!
解决方案 »
- 这是一个什么错误?请高手帮我看看。
- 怎么屏蔽运行程序的错误窗口?
- 使用GDI+ 的Bitmap类打开位图之后,怎样把位图保存为原来的文件?
- 100分请教高手:TryEnterCriticalSection在98下不支持,有无替代的函数?
- 初学问题fatal error C1004: unexpected end of file found
- 关于发消息的简单问题
- 如何在对话框中实现控件的自动布局
- Webkit如何向Windows ce进行移植
- 纹理贴图不能显示(急急)
- 高手帮帮忙:vc编写的dll如何让他被vb,pb调用??
- 单文档程序中的View上弹出一个右键菜单,怎么样把其中的项灰化?
- 出钱请高手帮我做个小程序
HBRUSH CffffDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
中的pDC是CffffDlg的设备上下文
edit.GetDC()返回的是edit的设备上下文。
_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()成对出现
...
}
你在不同时候,找到的服务员可能是不一样的,但不同的服务员都能为你提供相同的服务,因为她们对应于同一个的厨师。如果你只招来服务员(GetDC)但不解雇她(ReleaseDC),那么你就会浪费资源,时间长了,你就要倒闭了。其实,GetDC这个函数的名字起得并不好,很容易使人误解成只是取得一个属性而已,很难想到是创建了一个对象,如果改成是CreateDC,那么就容易理解多了。
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最好是不同的日期分别做多次,本人不胜感谢。
而CDC是对HDC的一个封装,但一个HDC可以同时对应于多个CDC。
如果把HDC比作电视机,那么CDC就是遥控器,你可以直接操作电视机,也可以通过遥控器来操作电视机。但为了方便我安全,一般人喜欢使用遥控器。
如果你愿意,一台电视机可以同时适用于多个遥控器,每一个遥控器的每一个操作都可以影响到电机机的状态。控件,这里也就是一个窗口类(CWnd),它没有对应于某一固定的CDC类,只是对应于HDC,所有需要CDC的地方都是“动态”创建的(当然所有使用CDC的地方也可以直接使用HDC),也就是每一次得到的CDC都不尽相同的原因。