在绘图程序中,我把所有的绘图操作都封装进自己编写的类CPage中,其中一个绘图操作是用来改变光标的形状,因为改变光标形状的函数需要引用绘图区的窗口句柄,为此我在类CPage中声明了一个窗口句柄变量 HWND m_hwndView,通过类初始化函数Init(HWND hwndView)对它进行赋值,供类中其他函数调用。我想在程序启动的时候,就把窗口句柄保存起来,为此我产生了如下调用:
CTestView::CTestView()
{
m_page.Init(this->GetSafeHwnd());
TRACE1("CTestView = %d\n",this->GetSafeHwnd());
}
但是随后,发现在用鼠标绘图的时候,整个窗口闪烁非常厉害,包括工具栏和菜单栏。随后跟踪调试发现,m_hwndView的值一直为0.
实际上,在CTestView类构造的时候,CTestView对应的窗口并没有创建完毕,所以this->GetSafeHwnd( )返回0,即无效的窗口句柄。CTestView对应的窗口创建过程在CTestView( )之后,在OnInitUpdate( )之前。因此正确的获取视图窗口句柄如下:
void CTestView::OnInitialUpdate()
{
CView::OnInitialUpdate();
m_page.Init(this->GetSafeHwnd());
TRACE1("OnInitialUpdate = %d\n",this->GetSafeHwnd());
}
调试结果如下: