MFC学习笔记.day02-创建窗口全过程,MFC执行顺序,BUTTON控件,对象与窗口关系
2015-07-23 10:59
621 查看
创建一个窗口的全过程
#include <windows.h> //包含windows头文件 #include <stdio.h> //包含标准头文件 LRESULT CALLBACK WinSunProc( HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // first message parameter LPARAM lParam // second message parameter 回调函数的声明 ); int WINAPI WinMain( //定义主函数 HINSTANCE hInstance, // handle to current instance HINSTANCE hPrevInstance, // handle to previous instance LPSTR lpCmdLine, // command line int nCmdShow // show state ) { //设置一个窗口类 WNDCLASS wndcls; //定义一个全局变量 wndcls.cbClsExtra=0; //进行相关变量的赋值,即实现窗口的设计 wndcls.cbWndExtra=0; wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH); wndcls.hCursor=LoadCursor(NULL,IDC_CROSS); wndcls.hIcon=LoadIcon(NULL,IDI_ERROR); wndcls.hInstance=hInstance;// 应用程序的实例号 wndcls.lpfnWndProc=WinSunProc; wndcls.lpszClassName="weixin2003"; // 类名 wndcls.lpszMenuName=NULL; wndcls.style=CS_HREDRAW | CS_VREDRAW; //类的类型 RegisterClass(&wndcls); // 窗口的注册 HWND hwnd; //窗口创建 hwnd=CreateWindow("weixin2003","北京维新科学技术培训中心",WS_OVERLAPPEDWINDOW, 0,0,600,400,NULL,NULL,hInstance,NULL); ShowWindow(hwnd,SW_SHOWNORMAL); //显示窗口 UpdateWindow(hwnd); //更新窗口 MSG msg; //消息循环 while (GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } LRESULT CALLBACK WinSunProc( //回调函数的定义 HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ) { switch(uMsg) { case WM_CHAR: char szChar[20]; sprintf(szChar,"char is %d",wParam); MessageBox(hwnd,szChar,"weixin",0); break; case WM_LBUTTONDOWN: MessageBox(hwnd,"mouse click","weixin",0); HDC hdc; //dc是指设备驱动程序 hdc=GetDC(hwnd); //跟哪一个窗口相关的一个dc,相当于我们要将图画上去的那张画布 TextOut(hdc,0,50,"计算机编程语言培训",strlen("计算机编程语言培训")); ReleaseDC(hwnd,hdc); break; case WM_PAINT: //当窗口发生重绘的时候会发送这样一个消息,注意不能在这里设置断点,否则你的窗口永远无法正常显示 HDC hDc; PAINTSTRUCT ps; hDc=BeginPaint(hwnd,&ps); //获取dc TextOut(hDc,0,0,"培训",strlen("培训")); EndPaint(hwnd,&ps); break; case WM_CLOSE: //窗口关闭时会发送的消息 if (IDYES==MessageBox(hwnd,"是真的要结束吗?","weixin",MB_YESNO)) { DestroyWindow(hwnd); //销毁指定的窗口 } break; case WM_DESTROY: //在响应这个消息的时候窗口已经销毁了 PostQuitMessage(0); //通知系统线程请求退出 break; default: return DefWindowProc(hwnd,uMsg,wParam,lParam); // 由于每个消息产生必须要有一个归属,所以这个语句不能省 } return 0; }
MFC的执行顺序
全局变量、对象(CTestApp)→构造函数(先是基类后是子类)
→入口函数Winmain函数
→InitApplication
→类中的初始化函数(InitInstance)
→CTestApp中的初始化函数(InitInstance)
→注册窗口类(AfxEndDeferRegisterClass)预先定义好的窗口类的注册
→PreCreateWindow(这里会先调用CFramWnd:PreCreateWindow,会再次调用
AfxDeferRegisterClass注册窗口类)
→创建窗口类CFramWnd:Create(会调用CWnd中的成员函数CreateEx,在这里再次调用纯虚函数PreCreateWindow,目的是为了让我们还有机会再次对窗口的外观进行更改调整)
→显示窗口ShowWindow
→更新窗口UpDataWindow
→消息循环PumMessage(这里采用消息映射机制来实现)
框架类和view都是cwnd类(窗口类)的派生类,我们也可以将框架类认为是view是父类,view类窗口是覆盖在框架类窗口类之上的。
对象和窗口的关系
我们在来理解一下对象和窗口的关系,一开始我们会误以为这两者是等同的,但是显然不可以这样来理解的,窗口销毁了,对象不一定销毁,也就是他们的生命周期并不一定是一样长的,他们之间是通过一定的句柄联系起来的,而并非等同的关系。BUTTON控件的创建
virtual BOOL Create( LPCTSTR lpszCaption, //Specifies the button control's text. DWORD dwStyle, //Specifies the button control's style. ///Apply any combination of button styles to the button. const RECT& rect, //Specifies the button control's size and position. It can be either a CRect object or a RECT structure //--指定按钮控件的大小和位置。它可以是一个绘图用的矩形类对象或一个矩形结构。-- CWnd* pParentWnd, //Specifies the button control's parent window, usually a CDialog. //It must not be NULL. //--指定按钮控件的父窗口,通常CDialog。它不能为空。-- UINT nID ///Specifies the button control's ID. );
CButton btn;//这里看上去是局部变量,我们在编程时要采用全局变量,否则生命周期太短了 Btn.Createa ("维新",WS_CHILD | BD_DEFPUSHBUTTON,CRect(0,0,100,100),this,123); Btn.ShowWindow(SW_SHOWNORMAL);//如果想要不用这条语句,我们可以在Create中的类型中加上WS_Visible就可以了
相关文章推荐
- Problem G: 序列求和
- http中的Content-Type
- 是否以某字符串结尾 是否以某字符串开始 是否是整数 裁减字符串空格 是否是浮点数 是否所有字符为数字类型 是否为空 是否是EMAIL 是否是电话号码 身份证号码验证-支持新的带x身份证 日期验证
- 建造者模式
- 九度oj 1434
- iOS7 UITableView Row Height Estimation
- CSS清除浮动
- Ubntu 14.04 LTS 下编译安装R Source Code
- poj 2676Sudoku(DFS+回溯)
- 北京大学ACM/ICPC竞赛训练暑期课练习之怪盗基德的滑翔翼
- 安卓市场--框架搭建5
- 自己用到的vim常用命令
- 用脚本处理utf8的文本文件
- [转]Maven实现直接部署Web项目到Tomcat7
- db连接池
- iOS xmpp的使用
- 西瑞克斯机顶盒cy-jc1320安装APP
- Java 希尔排序
- 看看苹果官方对手机直播各种参数的建议
- 阿里内推面试经验总结