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

原创 2015年07月10日 17:31:55

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

C++两种方式创建窗口

第一种: CreateWindow #include LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinM...
  • love3s
  • love3s
  • 2012-09-03 11:30
  • 1814

C++Windows编程之创建窗口

Windows编程之注册窗口类介绍了注册窗口类。接下来就是创建窗体。     我们用Visual Studio创建一个win32项目上会自动生成一个创建窗体函数。如下: [cpp]...

Windows编程-创建窗口

窗口创建的基本步骤是: 设计窗口类 注册窗口类 创建窗口 显示更新窗口 消息循环 编写回调函数——————————帅气的分割线—————————– 下面我们一步一步进行讲解: 1.设计窗口类WNDC...

深入解析Windows窗口创建和消息分发

在纯粹的Window32 SDK编程时代,人们还可以搞懂整个Windows窗体创建和消息的流通过程,但是在现在各种框架的包装下很多在Window32 SDK下很明显易懂的东西显得不是那么简单了。本文力...

不能将"constchar*"类型的值分配到"LPCWSTR"类型的实体错误解决方法

鼠标右击项目—>属性—常规—字符集把使用 Unicode 字符集改为使用多字节字符集

不能将 "const char *" 类型的值分配到 "LPCWSTR" 类型的实体 错误解决方法

转自 cnblog    no13bus IntelliSense: 不能将 "const char *" 类型的值分配到 "LPCWSTR" 类型的实体 错误解决方法 把项目—属性—常规...

C++界面库

开源C++界面库    1.RingSdk     Ringsdk是CSDN上一个前辈自己写的界面库,这个界面库很轻而易举实现QQ2009的界面效果。链接见    http://blog.csdn.n...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)