首页 MFC 其他 MFC中一个巧妙的利用构造函数特性的方法
MFC中一个巧妙的利用构造函数特性的方法 PDF 打印 E-mail
用户评价: / 0
好 
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口,之类。