windows 窗体建立过程

一.       先要定义自己将要使用WNDCALSS 的基本样式。
 
typedef struct tagWNDCLASS {
  UINT      style;
  WNDPROC   lpfnWndProc;
  int       cbClsExtra;
  int       cbWndExtra;
  HINSTANCE hInstance;
  HICON     hIcon;
  HCURSOR   hCursor;
  HBRUSH    hbrBackground;
  LPCTSTR   lpszMenuName;
  LPCTSTR   lpszClassName;
} WNDCLASS, *PWNDCLASS;

参数按顺序解释

  1. UINT style : 字面意思可以设置我们将要建立窗体的的类型,

http://msdn.microsoft.com/en-us/library/windows/desktop/ff729176(v=vs.85).aspx详细解释了每一个参数的意义。通过与运算可以设置多个。

补充1.双击事件如果需要定义是在这里定义

wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS ; 

只有定义这个才能在后面的消息拦截中拦截到doubleClick事件。

2.WNDPROC lpfnWndProc 处理窗体的消息的函数

3.int cbClsExtra 为在内存中放置的窗体设置一些额外空间

4.int cbWndExtra 同上

5.HINSTANCE hInstance 程序执行的实体代号,但是这里理解有点问题,这个玩意到底是进程线程的,理论上每一个窗体应该维护在线程中,但是这里只有一个主线程,而且没有明确的句柄,这里放置的是进程句柄这是个问题。      

 A handle to the instance of the module to be associated with the window.只有这么一句解释。

  1. HICON hIncon; 窗体的图标。

LoadIcon (NULL, IDI_APPLICATION) ; 顺便记忆下这个函数,当使用系统提供的图标的时候第一个参数设置为NULL,如果要使用自己设置的资源图标,要将第一个参数设置为图标所在的进程中。第一个参数为资源所在进程的句柄,第二个为名称,如果使用默认则第一个为NULL

6.HCURSOR hCursor;同上,原理类似。资源代表的应该是鼠标的图形。可以再这里更换。

7.HBRSH hbrBackground ;可以看出来背景的颜色。

8.LPCTSTR lpszMenuName;  菜单列的设置地方

9.LPCTSTR lpszClassName  窗体名字设置、

二.         注册

书上的校验好像只是为了和WIN98兼容,一般register好像不太容易失败。

三 ,  建立窗体

 

视窗类别定义了视窗的一般特徵,因此可以使用同一视窗类别建立许多不

同的视窗。实际呼叫CreateWindow 建立视窗时,可能指定有关视窗的更详细的

资讯。

Windows程式设计新手有时会混淆视窗类别和视窗之间的区别,以及为什么

一个视窗的所有特徵不能被一次设定好。实际上,以这种方式分开这些样式资

讯是非常方便的。例如,所有的按钮视窗都可以依据同样的视窗类别来建立,

与这个视窗类别相关的视窗讯息处理程式位於Windows 内部。由视窗类别来负

责处理按钮的键盘和滑鼠输入,并定义按钮在萤幕上的外观形象。从这一点看

来,所有的按钮都是以同样的方式工作的。但是并非所有的按钮都是一样的。

它们可以有不同的大小,不同的萤幕位置,以及不同的字串。後面的这样一些

特徵是视窗定义的一部分,而不是视窗类别定义的。

HWND WINAPI CreateWindow(
  __in_opt  LPCTSTR lpClassName,
  __in_opt  LPCTSTR lpWindowName,
  __in      DWORD dwStyle,
  __in      int x,
  __in      int y,
  __in      int nWidth,
  __in      int nHeight,
  __in_opt  HWND hWndParent,
  __in_opt  HMENU hMenu,
  __in_opt  HINSTANCE hInstance,
  __in_opt  LPVOID lpParam
);

参数一个一个解释。

LPCTSTR lpClassName 和wndclass中最后一个参数对应。如果是建立特殊的控件,这里可体现的是控件上的字符。

LPCTSTR lpWindowName 普通窗体的话就是标题列。

DWORD dwStyle    标题列就是右边放大缩小这些的一些控制。

Int x      初始化坐标,窗体的大小

Int Y         初始化坐标,窗体的大小

Int nWidth初始化坐标,窗体的大小

Int nHeight初始化坐标,窗体的大小

HWND hWndParent 父窗体的句柄,一般如果有子窗体的时候,子窗体默认总是在父窗体的上面。

HMENU 菜单栏  设置菜单的一些特殊属性。

HISNTANCE hInstance 貌似还是跟上面那个注册时候相同,实例是相同的。但是还是不知道到底是哪一个,进程还是线程的。

LPVOID lpParem 特殊的参数

显示窗体

ShowWindow (hwnd, iCmdShow) ;

第一个参数是刚刚用CreateWindow 建立的视窗代号。第二个参数是作为参

数传给WinMain 的iCmdShow。它确定最初如何在萤幕上显示视窗,是一般大小、

最小化还是最大化。

五.更新窗体

UpdateWindow (hwnd) ;

会重画显示区域。它经由发送给视窗讯息处理程式(即HELLOWIN.C 中的WndProc 函式)一个WM_PAINT 讯息做到这一点。

 

六.信息回圈

 

程式通过执行一块称之为「讯息回圈」的程式码从讯息伫列中取出讯息:

while (GetMessage (&msg, NULL, 0, 0))

{

TranslateMessage (&msg) ;

DispatchMessage (&msg) ;

}

Msg 结构


原文地址:https://www.cnblogs.com/hatreds/p/2317853.html