您的位置:首页 > 编程语言 > C语言/C++

Windows,C++编程创建窗口的过程详解

2015-07-10 17:31 357 查看
MFC创建窗口一般要经历以下四个操作步骤:

(1) 定义窗口类

主要指定窗口类的一些基本且必须指定的特征,窗口类的特征主要是由WNDCLASS结构体来定义的,

WNDCLASS的定义如下:

typedef struct _WNDCLASS {

UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HANDLE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
} WNDCLASS;

(2) 注册窗口类

窗口类经过第一步后,需要调用RegisterClass函数进行注册,注册成功后就可以创建此类型的窗口。函数原型如下:

[code]ATOM RegisterClass(

[code]  CONST WNDCLASS *lpWndClass   // address of structure with class

[code]                             // data

[code]);

(3) 创建窗口类实例

注册完窗口类过后,就可以创建窗口类的实例了,创建窗口类的实例了,函数原型如下:[code]HWND CreateWindow(

[code]  LPCTSTR lpClassName,  // pointer to registered class name

[code]  LPCTSTR lpWindowName, // pointer to window name

[code]  DWORD dwStyle,        // window style

[code]  int x,                // horizontal position of window

[code]  int y,                // vertical position of window

[code]  int nWidth,           // window width

[code]  int nHeight,          // window height

[code]  HWND hWndParent,      // handle to parent or owner window

[code]  HMENU hMenu,          // handle to menu or child-window identifier

[code]  HANDLE hInstance,     // handle to application instance

[code]  LPVOID lpParam        // pointer to window-creation data

[code]);

[code]

(4) 显示及更新窗口

当然创建窗口过后就可以调用
ShowWindow()
来显示窗口了。

函数原型如下:

[code]BOOL ShowWindow(

[code]  HWND hWnd,     // handle to window
处的句柄就是CreateWindow()函数的返回值[/code]
[code]  int nCmdShow   // show state of window

[code]);


显示窗口后紧接着要调用函数UpdateWindow()来刷新窗口,函数原型如下:

[code]BOOL UpdateWindow(

[code]  HWND hWnd   // handle of window ,此处的句柄就是CreateWindow()函数的返回值

[code]

[code]);

到此时窗口就算创建成功了。



下面我用一个具体的程序来举个例子,方便大家理解:

#include<windows.h> //包含windows.h头文件

LRESULT CALLBACK WindowProc( HWND , UINT ,WPARAM , LPARAM ); //声明窗口函数



int APIENTRY WinMain(HINSTANCE hinstance ,HINSTANCE hPrevinstance , LPSTR lpcmdLine , int nCmdShow) //MFC下的程序入口函数WinMain(),传统的dos程序是以main()作为程序入口的,这一点不同

{

WNDCLASSwndclass; //定义窗口类结构体变量

HWNDhwnd; //定义窗口类句柄

MSGmsg; //定义消息结构体变量



wndclass.style=CS_HREDRAW|| CS_VREDRAW; //改变窗口大小则重绘

wndclass.lpfnWndProc=WindowProc; //窗口函数为WindowProc()

wndclass.cbClsExtra=0; //窗口类无扩展

wndclass.cbWndExtra=0; //窗口实例无扩展

wndclass.hInstance=hinstance; //注册窗口类实例句柄

wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION); //使用光标箭头

wndclass.hCursor=LoadCursor(NULL, IDC_HELP); //指定鼠标箭头的样式

wndclass.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH); //窗口背景为黑色

wndclass.lpszMenuName=NULL; //窗口默认无菜单

wndclass.lpszClassName="Windows窗口创建"; //窗口类名为"Windows窗口创建"



if(!RegisterClass(&wndclass)) //此为注册类的函数

{

returnfalse; //注册不成功,返回false

}



//创建窗口的函数

hwnd=CreateWindow("Windows窗口创建" , //窗口类名为"Windows窗口创建"

"Windows窗口创建", //窗口的名称为“Windows窗口创建”,即窗口标题栏显示的窗口名称

WS_OVERLAPPEDWINDOW, //重叠式窗口

CW_USEDEFAULT,CW_USEDEFAULT, //窗口左上角在屏幕上的默认位置

CW_USEDEFAULT,CW_USEDEFAULT, //窗口的宽度和高度

NULL, //窗口无父类窗口

NULL, //窗口无主菜单

hinstance, //创建此窗口的实例句柄

NULL //此窗口无创建参数

);

ShowWindow(hwnd,nCmdShow); //显示窗口

UpdateWindow(hwnd); //不断的更新窗口的客户区



while(GetMessage(&msg,NULL,0,0)) //捕获消息

{

TranslateMessage(&msg); //键盘消息转换

DispatchMessage(&msg); //派送消息给窗口函数

}

returnmsg.wParam; //返回退出值

}



LRESULT CALLBACK WindowProc(HWND hwnd,UINTmessage,WPARAM wParam,LPARAM lParam) //窗口函数

{

switch(message)

{

caseWM_PAINT: //重画窗口客户区消息处理

HDChdc; //定义设备句柄

PAINTSTRUCTps; //定义绘图结构体变量

hdc=BeginPaint(hwnd,&ps); //获取要重画的窗口的设备描述表句柄

TextOut(hdc,15,20,"Windows窗口创建的过程!",22); //输出到窗口的文本

EndPaint(hwnd,&ps); //结束重画

return0;

caseWM_DESTROY: //撤销窗口消息处理

PostQuitMessage(0); //产生退出程序消息WM_QUIT

return0;

}

returnDefWindowProc(hwnd,message,wParam,lParam);

}

总结以下,MFC创建窗口的四个步骤

(1)定义窗口类

(2)注册窗口类

(3)创建窗口类的实例

(4)显示以及更新窗口

其实这四个步骤很好理解的,打个比方吧。不合适的话还请指教:

(A.)比如我们新生入学,肯定要按照学校的录取通知书要求填写档案,这就好比定义窗口类,MFC是属于微软的一个基础类,当然我们得准守微软的规则来定义窗口类,而录取通知书是学校发的,我们也得按照学校制定的格式填写录取通知书。

(B)填写录取通知书过后我们要将通知书拿到学校去注册个人信息,这就好比我们定义了窗口类,然后要在程序中去注册窗口类。

(C)在学校注册了个人档案后,我们就属于学校的学生了,就属于学校学生的类一个实例了,这就好比我们用注册的窗口类创建了一个窗口实例。

(D)在学校期间,我们的身体状况是不断变化的,所以学校会定期给学生体检,然后存入学校的档案。这就好比窗口的不断更新,我们不断的对窗口进行操作,而窗口要接收这些消息,就要不断的更新窗口。

不知道这个比方合不合适,由于本人水平所限,如有不妥还请指正,我怕误导了读者。

下面是程序中所用到的窗口类实例的资源下载链接:

MFC创建窗口实例 - 下载频道 - CSDN.NET
http://download.csdn.net/detail/rl529014/8888867
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: