WINDOW窗口相关点
风格:Windows窗口风格三个典型风格:
重叠窗口,弹出窗口,子窗口
分别是:WS_OVERLAPPED WS_POPUP WS_CHILD
控件基础
控件时windows系统内置的窗口类,他们时某一个窗口的子窗口,所以
创建他们的风格必须是WS_CHILD
- 控件消息:
分为两大类
控件控制消息
自己的专属消息,我们只需要向控件发送这些消息就能控制他们的行为,不需要关注他们怎么被处理的...问题控件通知消息
子控件通知父窗口的一些事件,常见的由子控件被点击,子空间需要重绘这里分为两大类WM_COMMAND: 标准控件的通知消息,标准控件的通知消息比较简单,用它即可WM_NOTIFY: 附加通用控件通常会用此消息给父窗口发通知
这里说明下回调函数的wParam参数值
我们通常用两个变量去接收wParam的值,具体原因是因为wParam是16位的二进制数,高位保存的是控件通知码,即控件的句柄
而低位通常保存控件的ID,这里ID就尤为重要
具体代码:
WORD wHigh = HIWORD(wParam); //控件的窗口句柄
WORD wLow = LOWORD(wParam); //控件ID
- 对话框
模态对话框和非模态对话框模态窗口:用DialogBox()函数创建出来,自带消息循环,模态对话框可以理解为比较死板,要等这个窗口运行完毕后,父窗口才能被控制非模态窗口:用CreateWindow来创建,需要自己写一个消息循环,只在退出循环时,要用到EndDialog来退出内部消息循环
<wiz_code_mirror>
//新加非模态对话框
/*
hWnd = CreateDialog(gHIND,
MAKEINTRESOURCE(winid1),
NULL,
(DLGPROC)wProc);
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);*/
//加模态对话框
DialogBox(gHIND, MAKEINTRESOURCE(winid1), NULL, (DLGPROC)wProc);
EndDiaolog(); 关闭模态对话框,调用函数中关闭对话框,关闭后会有一个返回值给父窗口DestroyWindow(); 关闭非模态对话框,退出消息循环,结束进程,但不等于退出运行PostQuitMessage(); 退出运行,关闭程序
- 控件的使用
控件在使用之前,我们先看看他的创建,他的创建可以是CreateWindow创建出来的,也可以是我们用对话框资源一个一个创建出来,前者属于代码控制,更注重细节。后者是可视化的编程方式,能方便的控制各个控件的属性
我们如何去使用控件,首先要明白,我们使用的是哪一个控件,每个控件的句柄每次打开程序都和上次不同,但是ID是不变的,所以我们只能去控制它的ID,而去使用它 通过ID找句柄函数
GetDigItem(父窗口句柄,控件ID);
控件消息的接受过程:控件消息每次是由主窗口接受到,所以我们应该在父窗口的回调函数里面去处理控件消息,而控件消息主要分两种类型,
WM_COMMAND, WM_NOIFY
每个消息的消息参数是不同的,拿WM_COMMADN来举例
消息来源:WM_COMMAND
接受单位:控件
消息内容参数: WPARAM(高位):响应Code
WPARAM(低位):控件ID
LPARAM: 控件句柄
控件的使用套路:
根据ID找句柄,找到句柄发消息 具体怎么发,要看是什么控件
- 通用控件
通用控件通知消息的方式是WM_NOTIFY,创建的方式可以代码创建,也可以拖拽资源工具栏
动态创建通用控件的步骤:
1.包含<CommCtrl.h>头文件
2.载入ComCtrl132.lib
3.调用InitCommonControls初始化通用控件
4.使用CreateWindowEx函数创建通用控件
对话框资源直接拖拽直接使用即可
WM_NOTIFY消息:
他被创造出来的原因:我们使用控件的要求WM_COMMAND已经无法满足我们,所以WM_NOTIFY消息存放的信息比较多
基本结构为
WPARAM: 发生WM_NOTIFY消息的控件ID
LPARAM: NMHDR指针
现在我们要的一些附加信息都存放到了NMHDR的一个结构体里面,该结构体通过LPARAM通知到父窗口