|
MFC -
其他
|
|
作者:Administrator
|
|
周日, 20 7月 2008 09:38 |
|
构造函数在对象建立时调用,析构函数在对象销毁是被调用。它们之间肯定是成对的。这样,在你需要频繁执行成对的代码操作时,利用这个特性将特别的方便。MFC中CPaintDC就利用了这一点。
构造函数在对象建立时调用,析构函数在对象销毁是被调用。它们之间肯定是成对的。这样,在你需要频繁执行成对的代码操作时,利用这个特性将特别的方便。MFC中CPaintDC就利用了这一点。 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(); }
在Windows操作中BeginPaint和EndPaint必须是成对出现的,把这样的两个成对操作,封装到类CPaintDC的构造函数和析构函数中,恰好利用C++的特性了。使用的方法如下: … // some c++ code // { … CPaintDC dc; //local variable -> BeginPaint … } //局部变量在这里析构,强制EndPaint在这里调用 // more c++ code …
要注意上面{ }的用法。加上一对额外的{ }可以使局部变量的析构函数调用时机得到控制,想在哪里析构就在哪里析构,这也是一个技巧。否则,要到整个函数结束时析构,时机有可能不是你预期的。 MFC用了这个技巧,我们自己应该怎样用了?太多了,只要是成对的操作就行,比如修改字体/还原字体(需要用成员变量保存一些数据),打开com口/关闭com口,之类。
|