关闭

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

标签: WindowsC++编程创建窗口过程详解
9053人阅读 评论(0) 收藏 举报
分类:

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函数进行注册,注册成功后就可以创建此类型的窗口。函数原型如下:

ATOM RegisterClass(
  CONST WNDCLASS *lpWndClass   // address of structure with class 
                               // data
);

(3)   创建窗口类实例

注册完窗口类过后,就可以创建窗口类的实例了,创建窗口类的实例了,函数原型如下:HWND CreateWindow(
  LPCTSTR lpClassName// pointer to registered class name
  LPCTSTR lpWindowName, // pointer to window name
  DWORD dwStyle,        // window style
  int x,                // horizontal position of window
  int y,                // vertical position of window
  int nWidth,           // window width
  int nHeight,          // window height
  HWND hWndParent,      // handle to parent or owner window
  HMENU hMenu,          // handle to menu or child-window identifier  
  HANDLE hInstance,     // handle to application instance
  LPVOID lpParam        // pointer to window-creation data
);
 

(4)   显示及更新窗口

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

函数原型如下:

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


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

BOOL UpdateWindow(
  HWND hWnd   // handle of window ,此处的句柄就是CreateWindow()函数的返回值
 
);

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

 

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

#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

3
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    我的简介:
    专注:C++、Qt软件开发
    Qt、C++编程交流群:
    302558294


    可以扫描下面微信,打赏我哦
    个人资料
    • 访问:667980次
    • 积分:9424
    • 等级:
    • 排名:第2181名
    • 原创:239篇
    • 转载:53篇
    • 译文:0篇
    • 评论:291条
    博客专栏
    最新评论