Visual C++的程序设计技巧

                                    Visual C++的程序设计技巧

  杨在春 何明祥

Microsoft Visual C++是一种可视化编程语言,因功能强大而受到广大程序设计人员的青睐。但是,由于VC++的应用程序框架结构非常复杂,使得许多初学者望而却步。本文通过对设置视图背景颜色和改变对话框标题的几种实现方法的分析研究,揭示了VC++程序代码执行时的一些本质特征和有关的程序设计技巧,对理解MFC库的结构和Windows操作系统的内部工作方式提供了一定的帮助。

设置视图背景颜色
对于VC++文档、视结构中的视图,从用户的角度来看,只是可以改变大小、位置的普通窗口,同其他基于Windows应用程序的窗口是一样的;从程序员的角度来看,视图并不是普通的窗口,而是从MFC库中CView类派生的类对象。像任何VC++对象一样,视图对象的行为由类的成员函数(数据成员)决定,包括派生类中应用程序定义的函数和从基类继承来的函数。

提出问题
视图的背景一般来说是白色的,在缺省情况下,它和系统定义的颜色COLOR_WINDOW是一致的。设计者一般会希望自己的程序可以让用户轻松地改变窗口背景颜色,或是用漂亮的图片来充填背景。我们可以用Windows函数SetSysColors来重新指定COLOR_WINDOW所对应的实际颜色,来达到改变视图背景颜色的目的。但这样会同时改变其他应用程序的视图窗口背景,使得整个Windows系统的颜色设置产生混乱。另外,我们可能会用以下方法来设置视图的背景颜色,即在CView的OnDraw函数中添写如下一段程序代码:
void CTestView::OnDraw(CDC* pDC)
{
CTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CRect rectClient;
CBrush brushBkColor;
GetClientRect(rectClient);
brushBkColor.CreateSolidBrush(RGB(255,0,0));
pDC->DPtoLP(rectClient);
pDC->FillRect(rectClient,&brushBkColor);

}
这样可以达到改变当前应用程序的视图背景的目的,但同时也产生了一些不良影响,使得程序运行效果不尽如人意。

分析问题
我们知道,在VC++的文档、视结构中,CView的OnDraw函数用于实现绝大部分图形绘制的工作。如果用户改变窗口尺寸,或者显示隐藏的区域,OnDraw函数都将被调用来重画窗口。并且,当程序文档中的数据发生改变时,一般必须通过调用视图的Invalidate(或InvalidateRect)成员函数来通知Windows所发生的改变,对Invalidate的调用也会触发对OnDraw函数的调用。正因为OnDraw函数被频繁调用,所以在其执行时,每次都刷新填充一次视图客户区域,便会使屏幕不稳定,产生闪烁现象。
笔者通过对VC++应用程序框架结构和Windows消息映射系统的仔细研究,找到另外一种改变视图背景的方法,其执行效果比上述两种方法都好。其实在程序调用OnDraw函数之前,会触发一个Windows消息:WM_ERASEBKGND,以擦除视图刷新区域。在缺省情况下,Windows系统使用视图窗口注册时窗口类中的成员hbrBackground所描述的画刷来擦除屏幕,这一般会将屏幕刷新成COLOR_WINDOW所对应的颜色。因此,在OnDraw函数中设置背景颜色的执行过程是这样的:先将屏幕刷新成COLOR_WINDOW所对应的颜色,接着又在OnDraw函数中填充其他颜色,这正是产生屏幕闪烁的根本原因。

解决问题
通过上述分析,我们应将视图背景颜色填充移到Windows消息:WM_ERASEBKGND所对应的消息映射函数中,而不是在OnDraw函数中。我们可以通过下列步骤实现这一过程:在文档类中增加一成员变量m_viewBkColor保存当前背景颜色,同时增加两个成员函数GetViewBkColor和SetViewBkColor对其进行读写操作。这样做的好处是可以对m_viewBkColor成员进行序列化,将其和文档联系在一起,打开某一文档时,其背景将和上一次程序操作该文档时的背景保持一致。在视图类中为视图的Windows消息WM_ERASEBKGND增加消息映射函数OnEraseBkgnd,代码如下:
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++的一个非常重要的方面,是影响其程序执行效率和性能的关键。

阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Visual C++ 6.0 是一款在编程界非常著名的集成开发环境(IDE),它提供了强大的工具和功能,用于开发 Windows 平台的应用程序。 CSDN 是中国最大的编程技术社区之一,它为开发者提供了丰富的技术文章、源代码、问答平台等资源,旨在帮助开发者学习和交流编程技术。 Visual C++ 6.0 可以和 CSDN 进行很好的结合。首先,Visual C++ 6.0 自带了编辑器和调试器,可以方便地编写和调试 C++ 程序。可以使用 Visual C++ 6.0 编写的程序,例如图形界面应用程序、控制台应用程序、动态链接库等,都可以上传到 CSDN 平台上进行分享和交流。 在 CSDN 上,开发者可以搜索并阅读有关 Visual C++ 6.0 的教程、技术文章和开发经验。这些资源可以帮助开发者快速入门 Visual C++ 6.0,并掌握开发 Windows 应用程序的基础知识和技巧。 此外,CSDN 还提供了一个活跃的问答社区,开发者可以在这里提问和回答问题。如果在使用 Visual C++ 6.0 过程中遇到问题,可以在 CSDN 上寻求帮助。众多热心的开发者会给出解答和建议,帮助解决各种技术难题。 总之,Visual C++ 6.0 和 CSDN 是开发者在学习和掌握 Visual C++ 6.0 方面非常有用的资源。通过学习和参与 CSDN 社区,开发者能够不断提升自己在 Visual C++ 6.0 开发方面的技术水平和经验。 ### 回答2: Visual C++ 6.0是一款由微软公司开发的集成开发环境(IDE),用于开发C++程序。根据题目中的问题,我们将主要关注以CSDN为主题的Visual C++ 6.0程序。 在Visual C++ 6.0中,我们可以使用CSDN作为程序的主题来开发各种应用程序。CSDN是一个面向IT技术人员的在线社区,提供技术资讯、技术问答、博客、开源项目等服务。我们可以在程序中利用CSDN提供的API,实现与CSDN平台的交互。 首先,我们需要注册为CSDN开发者,获取开发者账号和密钥。然后,我们可以使用Visual C++中的网络编程库,如WinINet或HTTPClient,来与CSDN的API进行通信。通过发送HTTP请求,我们可以实现获取和发布文章、获取用户信息、订阅技术主题等功能。 具体而言,我们可以使用Visual C++ 6.0提供的GUI(图形用户界面)设计工具,如MFC(Microsoft Foundation Classes)和Windows API,来创建程序的用户界面。通过界面,用户可以输入CSDN账号和密码进行登录,浏览、搜索和阅读文章,并将自己的文章发布到CSDN上。 此外,我们可以利用CSDN提供的认证机制,确保用户在使用我们的程序时具有权限。我们可以使用CSDN的登录API,通过用户提供的账号和密码获取访问令牌,将令牌保存到程序中的某个地方,以供后续请求使用。 综上所述,使用Visual C++ 6.0开发CSDN主题的程序,可以实现与CSDN平台的交互,包括登录、浏览和发布文章等功能。这样的程序可以方便技术人员使用CSDN的各种服务,提升他们的技术水平,获得信息和资源,与技术社区互动。 ### 回答3: Visual C++ 6.0是一个著名的集成开发环境(IDE),用于开发C++程序。它由Microsoft公司开发并于1998年发布。Visual C++ 6.0在当时非常流行,被广泛应用于Windows平台的C++程序开发。 Visual C++ 6.0具有用户友好的图形用户界面,可以方便地编写、调试和部署C++程序。它集成了许多开发工具,如编译器、调试器和可视化设计器等。用户可以通过图形化界面进行代码编辑、构建和调试,并可选择使用自己喜欢的视图和布局。 CSDN(中文版Stack Overflow)是中国最大的IT技术社区之一,提供程序开发、技术问答、博客文章等平台。在CSDN上,用户可以分享和交流自己的编程经验,解决技术问题,并学习其他人的经验和解决方案。 在CSDN上,用户常常会发表关于Visual C++ 6.0的文章和教程,包括如何使用该IDE进行开发、调试和优化。同时,CSDN还提供了与其他开发者的互动交流平台,用户可以在论坛上提问,找到解决问题的方法。 总之,Visual C++ 6.0是一个功能强大的C++开发工具,而CSDN则是一个与其他开发者分享和交流技术经验的平台,对于使用Visual C++ 6.0进行程序开发的开发者来说,CSDN是一个宝贵的资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iBreathe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值