请教有关初始化程序放置位置的问题

zenghui41 2008-04-17 10:16:49
本人初学MFC,对其中初始化程序的放置感到有点困惑。有一些初始化程序会放置在CWinapp的OnInitinstance()中,有一些会放置在CView的构造函数中,有一些会放置在CView的OnInitUpdate()中,有一些会放置在CView的PreCreateWindow()中,不知放置到这些不同位置的情况应该怎样辨别,又应该如何学习,请达人指教,不胜感激!
...全文
101 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zenghui41 2008-04-24
  • 打赏
  • 举报
回复
领教了,感谢各位高人的回答
lop5712 2008-04-20
  • 打赏
  • 举报
回复
OnInitinstance是全局性的初始化,一般编程习惯是所有的全局变量,如果有需要初始化的,应放在这里进行初始化。比如有一个全局字体CFont g_SystemFont,则这个字体的Create应该放在OnInitinstance中执行,并且失败时应返回FALSE以退出程序,表示它是程序运行的基本,失败则程序不可以执行。

CView的构造只应该放一些和视相关且独立于文档的初始化语句。所谓独立于文档,指每次打开新的文档时不会变化的属性。比如一个Windows自带的Notepad文本编辑器,里面有一个自动换行的选项,如果在这个.txt文件打开时用户将它打开了自动换行,则在打开下一个.txt时它都将继续保持为打开,不因为打开新的文档而变化。这个选项就应该在CView的构造中初始化。

OnInitUpdate只应该放一些和视相关且也相关于文档的初始化语句。比如Notepad中,每个文档打开时,都要自动根据.txt文件的前几个字节判断它的编码方式(是UTF8或是Unicode或是ANSI)。这个选项会因为不同的.txt的设置而不同,则应该在OnInitUpdate中检测文档的编码方式并记录起来(当然,编码方式这个选项在实际编写时很可能会作为文档类的属性而不是视的属性,在这里只是举例说明一下罢了)。

PreCreateWindow是CWnd的重载函数,特指当你需要新创建一种特性的窗口时(也就是子类化,不过MFC帮你封装了起来,使得使用从CWnd派生的形式来实现子类化一个新的特性的窗口,这也是为什么MFC会较其他窗口封装技术慢的主要原因之一,因为使用了虚函数),在创建之前调用PreCreateWindow以允许你设置一些这个新特性的窗口一些东西。比如窗口类(WNDCLASSEX)里的结构有指明此窗口是否需要接收鼠标双击消息,因此如果你的新特性的视需要接收鼠标双击消息,就应该在PreCreateWindow中设置。亦或者你的新特性的窗口不想有WS_BORDER风格(即不绘制边界,CView就会要求没有WS_BORDER)并且想强制说明此窗口只能作为子窗口创建,那么可以在PreCreateWindow中对cs.lStyle加上WS_BORDER和WS_CHILD风格。
cnzdgs 2008-04-19
  • 打赏
  • 举报
回复
一般情况下,属于哪个类的数据就在哪个类的初始化函数中初始化。
菜牛 2008-04-19
  • 打赏
  • 举报
回复
根据需要,根据变量的使用范围,没有定规。
BoXoft 2008-04-19
  • 打赏
  • 举报
回复
这个只有看书了。另外,建议你不要学MFC了。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧