您的位置:首页 > 其它

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就可以了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: