当Window是向程序发送消息时,它调用程序中的一个函数,这个函数用来描述Windows发送的消息,成为窗口函数或消息处理函数。他是一个自定义的回调函数:
LRESULT CALLBACK WindowProc(HWND hwnd, UNIT uMsg, WPARAM wParam, LPARAM lParam);
- CALLBACK 宏是_stdcall的意思,说明采用WIndows标准方式传递参数。 详见:https://blog.****.net/lionghua/article/details/38415655
- uMsg:是一个消息ID号,它指定了所发的消息,当窗口函数接受到消息时,它使用消息ID号来决定如何处理这个消息;后面两个参数wParam和lParam的值也取决于uMsg。
例:关闭一个记事本程序,即向它的主窗口发送WM_CLOSE消息:
int main(int argc,char* argv[])
{
//查找标题为“无标题-记事本“的窗口
HWND hWnd = ::FindWindow(NULL,"无标题-记事本");
//也可以使用类名查找,如 FindWindow("Notepad",NULL); if(hWnd != NULL)
::SendMessage(hWnd,WM_CLOSE,,);
return ;
}
- FindWindow函数:查找窗口类名称和窗口标题与指定字符串相匹配的窗口。
- SendMessage函数: 向窗口发送消息,直到目标窗口处理完这个消息才返回。参数与WindowProc函数相同。
以下是Windows程序的基本框架,win32程序都是在这个框架的基础上扩充而来:
#include <windows.h> LRESULT CALLBACK MainWndProc(HWND,UINT,WPARAM,LPARAM);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
char szClassName[] = "MainWClass";
WNDCLASSEX wndclass;
//用描述主窗口的参数来填充WNDCLASSEX结构
wndclass.cbSize=sizeof(wndclass); //结构大小
wndclass.style=CS_HREDRAW | CS_VREDRAW; //指定如果大小改变就重画
wndclass.lpfnWndProc=MainWndProc; //窗口指针函数
wndclass.cbClsExtra=; //没有额外的类内存
wndclass.cbWndExtra=; //没有额外窗口内存
wndclass.hInstance = hInstance; //实例句柄
wndclass.hIcon=::LoadIcon(NULL, IDI_APPLICATION); //使用预定义图标
wndclass.hCursor=::LoadCursor(NULL, IDC_ARROW); //使用预定义光标
wndclass.hbrBackground=(HBRUSH)::GetStockObject(WHITE_BRUSH); //使用白色背景画刷
wndclass.lpszMenuName=NULL; //不指定菜单
wndclass.lpszClassName=szClassName; //窗口类名称
wndclass.hIconSm=NULL; //没有类的小图标 //注册这个窗口类
::RegisterClassEx(&wndclass);
//创建主窗口
HWND hWnd=::CreateWindowEx(
, //dwExStyle,扩展样式
szClassName, //lpClassName,类名
"My First Window!", //lpWindowName,窗口标题
WS_OVERLAPPEDWINDOW, //swStyle,窗口风格
CW_USEDEFAULT, //X,初始x坐标
CW_USEDEFAULT, //Y,初始y坐标
CW_USEDEFAULT, //nWidth,宽度
CW_USEDEFAULT, //nHeight,高度
NULL, //hWndParent,父窗口句柄
NULL, //hMenu,菜单句柄
hInstance, //hInstance,程序实例句柄
NULL); //lpParam,用户数据 if(hWnd == NULL)
{
::MessageBox(NULL,"创建窗口出错!","error",MB_OK);
return -;
}
//显示窗口,刷新窗口客户区
::ShowWindow(hWnd,nCmdShow);
::UpdateWindow(hWnd);
//从消息队列中取出消息,交给窗口函数处理,直到GetMessage返回FALSE,结束消息循环
MSG msg;
while(::GetMessage(&msg,NULL,,))
{
//转化键盘消息
::TranslateMessage(&msg);
//将消息发送到相应的窗口函数
::DispatchMessage(&msg);
}
return msg.wParam;
} LRESULT CALLBACK MainWndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
char szText[]="Hello World!";
switch(message)
{
case WM_PAINT: //窗口客户区重绘
{
HDC hdc;
PAINTSTRUCT ps;
//使无效的客户区变得有效,并取得设备环境句柄
hdc=::BeginPaint(hWnd,&ps);
//显示文字
::TextOut(hdc,,,szText,strlen(szText));
::EndPaint(hWnd,&ps);
return ;
}
case WM_DESTROY: //销毁窗口
::PostQuitMessage();
return ;
}
//将不处理的消息交给系统默认处理
return ::DefWindowProc(hWnd,message,wParam,lParam);
}
简单Win窗口