一. 先要定义自己将要使用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;
参数按顺序解释
- 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.只有这么一句解释。
- 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 结构