WEB开发网
开发学院软件开发VC Visual C++的程序设计技巧 阅读

Visual C++的程序设计技巧

 2007-03-17 21:26:16 来源:WEB开发网   
核心提示: BOOL CTestView::OnEraseBkgnd(CDC* pDC){CRect rect;CBrush brush;brush.CreateSolidBrush(GetDocument()->GetViewBkColor());pDC->GetClipBox(rect
BOOL CTestView::OnEraseBkgnd(CDC* pDC)
{
CRect rect;
CBrush brush;
brush.CreateSolidBrush(GetDocument()->GetViewBkColor());
pDC->GetClipBox(rect);
pDC->FillRect(rect,&brush);
return true;
}

在该函数中不需要对客户区域矩形进行设备坐标到逻辑坐标的转换,并且Windows在调用该函数时会自动进行裁剪区域的计算,使得需要刷新的屏幕面积达到最小。这样我们可以在程序中通过设计下列菜单函数轻松地改变视图背景的颜色,而且运行效果相当令人满意。

void CTestView::OnChangeViewBkcolor()
{
CColorDialog cdlg;
if(cdlg.DoModal()==IDOK)
{
GetDocument()->SetViewBkColor
(cdlg.GetColor());
InvalidateRect(NULL);
}
}

改变对话框标题

提出问题

在VC++程序设计过程中经常会遇到这样的情况:执行程序的多个地方需要调用同一个对话框,但在不同的情况下希望给对话框加上不同的标题。开始我们可能会用下面的一段程序以达到这一目的:

CTestDialog dlg;
dlg.SetWindowText(“标题-1");
dlg.DoModal();

利用上述办法,我们本希望在程序不同的地方,通过设置函数SetWindowText不同的参数,以达到使同一对话框具有不同标题的目的,但这样做是行不通的。

分析问题

利用这种方法,当执行该段程序时,在一个可以忽略的错误之后,对话框的标题不会发生任何改变。这是因为,VC++程序设计中,大部分窗体是动态创建的。比如上述对话框,在对dlg.DoModal的调用之前,虽然已构造了对话框的VC++对象,但窗体对象还没有被创建,显然对一个没有创建窗体对象的对话框设置标题是行不通的。另外,dlg.DoModal的调用结束时,对话框窗体对象将立即被释放,因此在该函数之后设置对话框标题也是不行的。

解决问题

通过对VC++框架结构中函数的调用顺序的分析,我们发现在dlg.DoModal执行的开始时,程序会自动调用对话框的一系列初始化函数,其中包括对对话框成员函数OnInitDialog的调用,从这里入手,将找到改变对话框标题的办法。为此,首先为对话框引进一个类型为CString的公有成员变量m_strCaption,并将上述程序段改为:

CTestDialog dlg;
dlg.m_strCaption = “标题-1";
dlg.DoModal();

然后重载对话框的虚成员函数OnInitDialog如下:

BOOL CTestDialog::OnInitDialog()
{
CDialog::OnInitDialog();
SetWindowText(m_strCaption);

return TRUE;
}

通过这种办法,每次在打开对话框之前,只要将对话框公有成员变量m_strCaption设置为一个不同的值,就可使得对话框有不同的标题。

小 结

本文介绍的2个技巧有一个相似之处,就是用于解决问题的程序实现代码基本上是相同的,只是被放在了程序流程的不同地方。这正是学习和熟练掌握VC++的一个非常重要的方面,是影响其程序执行效率和性能的关键。

上一页  1 2 3 

Tags:Visual 程序设计 技巧

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接