初始化
窗口类定义——定义窗口的形式和功能
窗口类注册——必须先注册后使用
创建窗口实例——create window
显示窗口——show window,update window
一 窗口类的定义:
窗口类的数据结构 WNDCLASS
HICONLoadIcon(HINSTANCE hlnstance,LPCTSTR lpIconName)
返回值是一个窗口的句柄
HCURSORLoadCursor(HINSTANCE hlnstance, LPCTSTR lpCursorName)
在应用程序中加载一个窗口光标
hlnstance光标资源所在的模块句柄,NULL则使用系统预定义的光标
GetStockObject函数返回一个刷子的数据类型,函数获取系统提供的北京刷
HBRUSH GetStockObject(intnBrush);
二 注册窗口类
由函数RegisterClass()实现
RegisterClass(&wndclass);
返回值为bool,true则是注册成功
三创建窗口实例//一个参数表超级长的函数
HWNDCreateWindow
(
LPCTSTRlpszClassName, //窗口类名
LPCTSTRlpszTitle, //窗口标题名
DWORDdwStyle, //创建窗口的样式
int x,y, //窗口左上角的坐标
intnWidth, nHeight//窗口的宽度和高度
HWND hwndParent//窗口的父窗口句柄
HMENU hMenu//窗口主菜单句柄
LPVOIDlpParam /指向传递给窗口的参数值的指针
)
常用窗口样式,见课件
四 显示窗口
窗口类的显示由ShowWindow和UpdateWindow函数实现
窗口显示形式标识ShowWindow(hwnd, nCmdshow);?
调用ShowWindow函数在屏幕上显示窗口
SW_HIDE
SW_SHOWNORMAL
SW_SHOWMINIMIZE
SW_SHOWMAXMIZE
SW_SHOWNOACTIVE
SW_RESTORE
显示窗口后-应用程序调用UpdateWindwo更新并绘制用户区并发出WM_PAINT 消息
UpdateWindow(hwnd)
消息循环系统——队列
MSG Msg;
…
while(GetMessage(&Msg,NULL,0,0))
{
TranslateMessage(&Msg)//将虚拟键转换为字符信息
DispatchMessage(&Msg)//执行指令
}
函数GetMessage的形式
GetMessage
(
IpMSG,//指向MSG结构的指针
hwnd,
nMsgFilteMin,//用于消息过滤的最小消息号值
nMsgFilteMax//最大消息号值
)
消息响应机制
1、消息的组成:一个消息由一个消息名称(UINT),和两个参数(WPARAM,LPARAM)构成。当用户进行了输入或是窗口的状态发生改变时系统都会发送消息到某一个窗口。例如当菜单选中之后会有WM_COMMAND消息发送,WPARAM的高字中(HIWORD(wParam))是命令的ID号,对菜单来讲就是菜单ID。当然用户也可以定义自己的消息名称,也可以利用自定义消息来发送通知和传送数据。
2、谁将收到消息:一个消息必须由一个窗口接收。在窗口的过程(WNDPROC)中可以对消息进行分析,对自己感兴趣的消息进行处理。例如你希望对菜单选择进行处理那么你可以定义对WM_COMMAND进行处理的代码,如果希望在窗口中进行图形输出就必须对WM_PAINT进行处理。
3、未处理的消息到那里去了:M$为窗口编写了默认的窗口过程,这个窗口过程将负责处理那些你不处理消息。正因为有了这个默认窗口过程我们才可以利用Windows的窗口进行开发而不必过多关注窗口各种消息的处理。例如窗口在被拖动时会有很多消息发送,而我们都可以不予理睬让系统自己去处理。
4、窗口句柄:说到消息就不能不说窗口句柄,系统通过窗口句柄来在整个系统中唯一标识一个窗口,发送一个消息时必须指定一个窗口句柄表明该消息由那个窗口接收。而每个窗口都会有自己的窗口过程,所以用户的输入就会被正确的处理。例如有两个窗口共用一个窗口过程代码,你在窗口一上按下鼠标时消息就会通过窗口一的句柄被发送到窗口一而不是窗口二。
2-2窗口函数WinProc
定义了应用程序对接收到的不同消息的响应
包含了对各种可能接受到的消息的处理过程
实际上,是一个大型的switch-case构架
窗口函数的一般形式
LRESULTCALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM, lParam)
{
switch(message)//switch语句仅支持整形作为变量,因此msg名称转换为UINT
{
case…
…
break;
case WM_DESTROY;
PostQuitMessage(0);//退出窗口
default: returnDefWindowProc(hwnd,message,wParam,IParam);//就是不处理
}
return(0);
}
两个新的数据类型
LRESUILT:消息处理的结果的返回值的数据类型,实际上是long
CALLBAK:表示这个函数是给系统调用的,也称作“回调“
windows有很多自定义的数据类型
WORD==unsignedshort
LONG==long
DWORD==unsignedlong
UINT==unsignedint
BOOL==bool
LPTSTR==指向字符串的32位指针
LPCTSTR==指向字符串常量的32位指针
三个比较重要的数据结构
1MSG 包含消息的全部信息
MSG结构体
typedefstruct tagMSG
{
HWND hwnd;
UINT message;//UINT 为unsigned int
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
} MSG;
2WNDCLASSEX 包含一个窗口类的全部信息及属性
typedefstruct
{
UINTcbsize;//窗口类的结构的大小,通常取sizeof(WNDCLASSEX)
UINTstyle;//窗口类的样式,一般设置为0
WNDPROClpfnWndProc;//指向窗口函数的指针
intcbClsExtra;//分配在窗口类结构后的字节数
intcbWndExtra;//分配在窗口实例后的字节数HANDLE
hlnstance;//定于窗口类的应用程序的实例句柄HICON
hIcon;//窗口类的图标
HCURSORhCursor;//窗口类的光标
HBRUSHhbrBackground;//窗口类的背景刷
LPCTSTRlpszMenuName;//窗口类的菜单资源名
LPCTSTRlpszClassName;//窗口类名
HICONhIconSm;//窗口类的小图标
}WNDCLASSEX;
3RECT 定义了一个矩形区域及其左上角和右下角的坐标
矩形结构比较简单
typedefstruct_RECT
{
LONGleft;//左上
LONGtop;//左下
LONGright;//右上
LONGbottom;//右下
}RECT;
Windows应用程序的常用消息
A·鼠标左键点击:WM_LBUTTONDOWN
IParam
低字节X=LOWORD(IPARAM)光标x坐标
高字节Y=HIWORD(IPRARM)y坐标
wParam
一个整数值,用来表示鼠标键的按下状态
MK_LBUTTON
MK_MBUTTON
MK_RBUTTON
MK_SHIFT
MK_CONTROL
这些都是按下相应键产生的消息
e.g:
caseWM_LBUTTONDOWN:
if(wparam&MK_SHIFT)
相应的还有这些消息(WM==Windows Message)
WM_LBUTTONUP
WM_LBUTTONDOWN
WM_RBUTTONUP
WM_RBUTTONDOWN
WM_MOUSEMOVE
WM_MBUTTONUP
WM_MBUTTONDOWN
B·WM_KEYDOWN 按下一个非系统键产生的消息
什么事系统键?
实现系统操作的组合键,比如ALT+F4
其中的WPARAM包含一个虚拟码
虚拟码:用来标识按下或释放的键位
格式为VK_ + 键位名称 + UP/DOWN或者没有
IParam记录了按键的重复次数,扫描码,转移代码,先前键位的状态等信息
e.g
VK_SHIFT, VK_SPACEUP
其他的信息
WM_CHAR按下一个非系统键时产生的信息
wParam为按键的ASCII码,IParam与WM_KEYDOWN的相同
C· WM_CREATE 由CreateWindow函数发出的消息
wParam:NULL IParam包含一个指向CREATESTRUCT(这个东西后面会讲到)数据结构的指针
D· WM_CLOSE和WM_DESTROY,分别时关闭窗口和DestroyWindow函数发出来的信息,其中的IParam和wParam都没有被使用过
E·WM_QUIT 由PostQuitMessage函数发出的信息
wParam:含退出代码,表示程序退出运行时的有关信息
IParam:未用
F· WM_PAINT 窗口属性发生变化时,窗口更新时产生的消息
用户区移动或显示
程序通过滚动条滚动窗口
用户窗口改变大小
下拉式菜单关闭并需要恢复被覆盖的部分
Windows系统清除对话框等对象,并需要恢复被覆盖的对象
这些动作都会产生WM_PAINT消息
一些方便记忆的命名规则的说明
hwnd:窗口类句柄
句柄:handle
窗口:window
连起来缩写即为hwnd
cursor 光标
LPTSTR
Long Pointer Ti STRing
同理LPTCSTR代表conststring
LPSZ:长整形的指针指向以零结尾的字符串
L:long
P:Pointer
sz是指 ZeroTerminated String , 即以零("\0")结尾的字符串 (我在必应搜到的,应该正确了)
LRESUILT long result