图形化基于视窗的应用程序里,窗口就是屏幕的一块区域。每一个GUI应用程序都需要至少创建一个窗口,称为主窗口。
在使用visual studio时要记得改为多字节字符集。
HWND窗口句柄(我目前理解的就是你想找的窗口对应的地址,在就对应到了该程序中去,该句柄唯一地标识该程序)
HWND hWnd=FindWindow(找窗口句柄)
SendMessage给句柄所指向的地方发送消息,例如关闭记事本消息,这个关闭并不是我们程序关闭的,而是我们向操作系统内核发送消息,操作系统调度关闭记事本。
int APIENTRY WinMain(HINSTANCE hInstance,//本模块的实例句柄
HINSTANCE hPrevInstance,//Win16时代句柄
LPSTR lpCmdLine,//命令行参数
int nCmdShow)//主窗口初始化的显示方式,可以是正常的或者是最大化地充满整个画面,或者是最小化显示在工作列中。
Windows 消息驱动:创建窗口后,操作系统会不断地向应用程序发送消息,通知发生了什么事件,发送消息是通过调用程序中的一个函数,这个函数的参数可以描述Windows发送的消息。这个函数叫做窗口函数或者消息处理函数,这是一个自定义的回调函数(这个函数并不是自己主动发起的,而是操作系统内核调用的),回调函数在函数初始要记得声明。
LRESULT CALLBACK MainWndProc(HWND hWnd,//对应的是哪个窗体
UINT message,//接收的消息,无符号的整型数,通过消息ID给窗口,例如鼠标键盘的消息
WPARAM wparam, //消息的高字节
LPARAM lparam)//消息的低字节
显示一个窗体
需要定义一个WNDCLASSEX类
SzClassName(每一个窗口除了拥有句柄,还有一个类名)
注册实例:
ATOM MyRegisterClass( HINSTANCE hInstance )
{
WNDCLASSEX wcex;//用于描述主窗口的参数填充WNDCLASSEX结构
wcex.cbSize = sizeof(wcex);//结构的大小
wcex.style = CS_HREDRAW | CS_VREDRAW;//指定如果大小改变就重画
wcex.lpfnWndProc = (WNDPROC) WndProc;//窗口函数指针
wcex.cbClsExtra = 0;//没有额外的类内存
wcex.cbWndExtra = 0;//没有额外的窗口内存
wcex.hInstance = hInstance;//实例句柄
wcex.hIcon = LoadIcon( NULL, IDI_APPLICATION );//使用预定义图标
wcex.hCursor = LoadCursor( NULL, IDC_ARROW );//使用预定义的光标
wcex.hbrBackground = (HBRUSH) GetStockObject( WHITE_BRUSH );//使用白色画刷
wcex.lpszMenuName = NULL;//不指定菜单
wcex.lpszClassName = "My Class";//窗口类的名称
wcex.hIconSm = LoadIcon( NULL, IDI_WINLOGO );//没有类的小图标
return RegisterClassEx( &wcex );//注册这个窗口类
}
hWnd=CreatWindowEx()
ShowWindow(hWnd, nCmdShow);//显示该窗口,nCmdShow同上主函数表述
UpdateWindow(hWnd)//更新消息
如果是WM_QUIT消息,getmessage返回FALSE,整个的消息停止
回调函数,参数hWnd,对应到创建窗口的hWnd,窗口的类名和注册的窗口类中的数据联系在一起联系在了一起(wcex.lpfnWndProc),最终主函数更够和回调函数的hWnd唯一联系起来
回调函数中不处理的消息一定要记得交给操作系统做默认处理