VC权威剖析:MFC原理、机制与开发实例—-读后感

基础概念和消息映射

Image
窗口:
按级别分:
桌面窗口
     顶级窗口
          子窗口
     重叠或弹出窗口
CS_PARENTDC:
     有此属性(并不是窗口风格),它可以继承父窗口的显示设备上下文。edit,button都是如此的。
WS_CHILD:
     纯子窗口,只有客户区,并且客户区的显示界面要在WM_PAINT消息处理中进行绘制。edit,button都是如此的。
WS_OVERLAPPED:
     若不同时指定WS_CHILD那么它是顶级窗口,总有标题栏WS_CAPTION和边框,并且自动设置WS_CLIPSIBLINGS。创建重叠窗口时可以指定默认大小选项CW_USEDEFAULT。
WS_POPUP:
     弹出窗口创建时,也会自动设置WS_CLIPSIBLINGS。但其它风格必须专门指定,包括WS_CAPTION,也不能指定默认大小选项。
检索窗口:可以跨进程找到窗口的句柄,因为用的是CWnd的静态函数,如下:
FindWindow()
GetWindow()
以下相对来说是内部查找了。
用于找父窗口的:
CWnd::GetParent(),可以省略CWnd
但有可能父又是别人的子,所以
CWnd::GetParentOwner()
用于找子窗口的:
CWnd::GetTopWindow()
CWnd::GetDlgItem()
CWnd::GetDescendantWindow()——–通过ID号取得窗口指针
CWnd::GetWindowFromPoint(POINT)函数取得占用父窗口客户区指定点的子窗口。实参POINT是客户区坐标。
消息:
Image
窗口消息(区别于线程消息):
     窗口消息:除了WM_COMMAND外,所有WM_开关的消息。与某类窗口紧密相关。
1,系统自动生成的窗口消息映射
2,通过类向导来生成的消息映射
3,通过宏ON_MESSAGE(message,memberFxn)
主要讲解以下三类消息,原因是类向导不能自动帮助生成,也没有系统建立好,要手工添加。包括自定义消息。
     命令消息
          菜单(工具栏,加速键)、按钮向窗口发送,要求执行某个功能操作的消息,与程序动作相关。
          用宏ON_COMMAND(id,memberFxn)来建立消息映射。加入数组的第二参数为,CN_COMMAND(内容是0,而通知消息则是非零值)
     通知消息
          MFC为每个通知消息都定义了宏,如果控件的内容变化ON_EN_CHANGE,ON_EN_UPDATE,鼠标滚动等。
          通过ON_CONTROL(wNotifyCode,id,memberFxn)来生成消息映射。其实它是ON_COMAND的重载而己。新控件都使用专门的ON_NOTIFY来建立了。它能传递更多的附加信息。如:
         纯正,新式的通知消息使用如下:
          ON_NOTIFY(TVN_KEYDOWN,IDC_TREE,OnKeydown)
          注:在两层面变化了,通知代码和处理的函数原型上,后者有实参,并引入新的结构了。
          不通过ON_CONTROL来消息映射的特殊通知消息。WM_CTLCOLOR
     反射消息
          由主窗口通过CWnd::ReflectLastMsg()发给子窗口,此函数调用了子窗口的OnChildNotify()—-ReflectChildNotify()
          在其中,就是原始的switch了。
               对旧式通知消息的反射消息和通知消息的反射消息时
               —–OnCmdMsg()
Image
命令ID:
     [0x8000,0xF000)———–全局命令,可由不同对象处理。菜单项的的ID值都在此范围内。
     小于0x8000—————-局部命令,按钮
MFC应用程序角度—-CWndApp分析

接开发者地气的些设计。它的父和子,都是一个程序从生到死的维护者。在继承的应用类实例中,把这爷仨的属性都设置了,找到相应的归宿。
有三种主窗口:单选的。事实看看MFC应用程序向导即可。
单,多文档的主窗口都是CFrameWnd(后者派生的)。而基于对话框的就不用多说了。
Image
m_pszAppName
向导中填写的工程名称,可以在CWndApp构造时传参指定。如果没有指定,会使用字符串资源“AFX_IDS_APP_TITLE”,如果还没设置这个串,将由可执行文件名代替。
属于CWndApp类
m_pszExeName
属于CWndApp类
m_pszProfileName
应用程序的INI配置文件名,在继承应用类中设置自己的配置文件 。
GetProfileString()等系列函数来配合。
属于CWndApp类(默认是执行程序.ini)
m_hInstance
模块在进程中的装入地址
属于CWndApp类
m_pMainWnd
在CSingleDocTemplate或CMultiDocTemplate构造时,就把资源文件绑定和主窗口框架类,文档类,视图类全都实例化,同时设置了此指针。基于对话框的也按其方式会设置此指针。注:没有命令行参数时,默认执行ID_FILE_NEW
文档,视图,都是MFC管理的,实例在堆上,不用手动回收。
当设置好,别忘记
ShowWindow(SW_SHOW);
UpdateWindow();
SetWindowText(“XXX程序”);
这样这个主窗口的消息循环,在Run时触发。
属于CWinThread。设置了此指针的UI窗口,在销毁时,都是安全的。
用向导也好,自己个性化改造也好,反正重载的initInstance函数至少有有模有样了。
命令行参数功能,有时在不同进程启动的相互调用时很有用。

双系统搭建及ubuntu和CentOS下安装Qt5

把大象放冰箱里需要三步,同样,玩linux也需要。第一,制作USB启动盘,第二,安装系统,第三,安装Qt5。

第一篇,材料准备

有多种方式来制作USB启动盘。本人实验了两个,用vmware12和ultraISO.

虚机方式:

建立好空白虚机后,就是提示第一坑。
第一个坑,就是开启intel VT-x.从bios中设置。
重启,再来,可以了,不要装vmware-tool先,不然就在抢占CD-rom。
在我本机S1 yoga的bios上设置两处:
一,sercurity中的安全引导去掉
二,startup中的boot中选择both,即允许传统模式。
用烧录方式:
当然就是把ISO用ultraISO来烧录到USB中了。这个方式不用过多介绍。
当做好USB启用盘后,你F12引导从U盘进入系统,你会看到try和安装两个大按键的情况。我们即可进入第二篇章了。
第二篇章,系统安家
你是租房还是要买房?系统放到你的U盘上还是,想系统在你的硬盘上?这个问题赶快想,尤其是安装步骤到了分区时。但不管如何,选择安装到硬盘是入口。
如果是想在USB上玩linux,那当然安全,不会破环原来的系统。但是磁盘空间,硬件支持和使用体验必须是要慢被理解的。分区方法如下:(我的U盘就16G)
要在U盘上/dev/sdb建立新分支,一个主15G,一个交换分区9百M。
安装不必细说,当出现提示重启时,拔出U盘即可。
当你是个老司机,硬盘富余,且酷的话,来吧,装在硬盘上。并且让windows来当房东。这个意义深远了,因为,如果你想linux撤出,只要格式下那个分区即可。方便的代价就是要懂得原理并实现,还有找到利器,比如easybcd。
原理其实就是:
MBR—-grub2—-bootmgr(由grub来接管系统,在它的分支中选择windows还是linux)
现在:
MBR—-bootmgr—-grub(由windows提供的引导菜单,它当房东,grub就只管引导linux即可,不用去学习grub命令行,好主意)
那个利器就是编辑bootmgr的。所以,我用后面的引导模式了。
用windows的磁盘管理,压缩卷,把最后一个分区给缩小,然后就会多出一个空闲分区,这个就是给硬盘linux的“新房”。
然后,重启用U盘引导,这次同样选择安装到硬盘选项。在分区时,需要充分小心了。
先看看前人的指导:http://blog.csdn.net/pop_rain/article/details/70477085
在我的环境中最终分三个,/,/boot,/home分别为10G,200M,50G,注意引导要放在与/boot同映射的分区上。注意没有/swap区。
因为据说17.04后的版本不需要分交换分区了,而变成了交换文件的方式。
并且,如果你把引导装在了/boot对应的分区,grub2不会跑出来作怪,这是让windows来引导的前提。不然,得用工具修复MBR,所以,装完ubuntu,再重启应该是熟悉的wiondows不是grub。如果是后者,你分区错了。
当你再重启发现进入了熟悉的windows了,没有错,因为,房东管理着客户linux。此时,搬家已经完成,linux入住了,但房东没有给配好钥匙。进系统后,找那个利器吧。easybcd中加一个引导条目,分区选择为/boot那个系统分区。
再重启,windows给你选择权了,让你进linux去吧。不过,我碰到了问题。
最大的坑是:ext4 superblock checksum 。没错,这个是硬盘格式的错误。卡了我一下午。
一个国外帖子搞定了。
先用USB安装盘,启动进去,用root修复好挂载/的那个分区/dev/sda7.
然后,重启硬盘引导后发现可以有root的命令行,看来修复硬盘格式有戏。
然后,就是把其它的两个linux分区修复。之后,ubuntu17.04的用户登陆界面出现。
但最后,反朴归真了,发现在busybox的initramfs的命令提示符下,用 (sudo) fsck.ext4 /dev/sda7,8,9,三次命令后,reboot即可。
终于是躺在我硬盘里的,与win7同床的,让微软引导的小弟系统呀。
第一件事,开启root。
技巧把$变成#,sudo -s.或sudo su
此时安装东东已经够了,但如果你想用root来登陆系统。继续下面操作。
然后执行: vi /etc/lightdm/lightdm.conf.
增加 greeter-show-manual-login=true  allow-guest=false  . 修改完的整个配置文件是
[SetDefaults]
greeter-session=unity-greeter
user-session=ubuntu
greeter-show-manual-login=true #手工输入登陆系统的用户名和密码
allow-guest=false   #不允许guest登录
然后我们启动root帐号:
sudo passwd root
根据提示输入root帐号密码。
重启ubuntu,登录窗口会有“登录”选项,这时候我们就可以通过root登录了。
第三篇章 系统装修
与房东win7磨合得不错,但linux下没啥好玩的就有些寒酸了。装个Qt5来。
如果你是CentOS,这可以这么玩了。
{
一,编译器准备:
yum check-update
yum -y install gcc
yum -y install gcc-c++
—–解释
gcc: yum install gcc
g++: yum install gcc-c++
此外还有以下方法:
yum install make
— 或者
yum groupinstall “Development Tools”
— 或者(这个省事,把系列工具全搞定)
yum install gcc gcc-c++ kernel-devel
二,Qt5依赖库准备:
#yum install mesa-libGL-devel mesa-libGLU-devel
#yum install freeglut-devel

}//end CentOS

ubuntu:
{
首先不可或缺的就是编译器与基本的函式库,如果系统没有安装的话,依照下面的方式安装:
  $ sudo apt-get install build-essential
安装OpenGL Library
  $ sudo apt-get install libgl1-mesa-dev
安装OpenGL Utilities
  $ sudo apt-get install libglu1-mesa-dev
  OpenGL Utilities 是一组建构于 OpenGL Library 之上的工具组,提供许多很方便的函式,使 OpenGL 更强大且更容易使用。
安装OpenGL Utility Toolkit
如果不行就把,sudo apt-get install libglut-dev命令改成
$ sudo apt-get install freeglut3-dev
}//end ubuntu
三.直接运行安装包
#sh qt-opensource-linux-x64-5.5.1.run
四.安装好之后,需要添加环境变量
#vim /etc/profile
在最后一行,添加以下内容:
export PATH=”/opt/Qt5.5.1/5.5/gcc_64/bin:$PATH”
export PATH=”/opt/Qt5.5.1/Tools/QtCreator/bin:$PATH”
如果第四步没有搞好,编译好的测试项目不能运行执行文件。本人就碰到了xcb的插件要求报错。原来在5.5以上的高级Qt版本中,引用了platform的概念。所以,要使用LD_LIBRARY_PATH来找那些库。当然,你找那个qtcreator.sh执行,里面有自动配置好系统环境的处理。
until now,enjoy!