//底层实现窗口//代码全部抄自黑马程序员学习教程 //时间18-08-21 //基本操作,选中函数或者结构体名称,按F1在线搜索MSDN文档 #include<Windows.h> //底层实现窗口 的头文件
//6.处理窗口过程 //CALLBACK 代表__stdcall 参数的传递顺序,从左往右依次入栈,并且在函数返回前清空堆栈 LRESULT CALLBACK WindowProc( HWND hwnd, //消息所属窗口句柄 UINT uMsg, //具体消息名称 WM_XXXX 消息名称 WPARAM wParam, //键盘附件消息 LPARAM lParam) //鼠标附加消息 { //返回值为默认处理方式 switch (uMsg) { case WM_CLOSE: { //注意:所有XXXWindows为结尾的方法,都不会进入消息队列,它直接执行。 DestroyWindow(hwnd); //DestoryWindow 发送另一个消息 WM_DESTROY break; } case WM_DESTROY: { PostQuitMessage(0); //真正退出进程 break; } case WM_LBUTTONDOWN: { int xPos = LOWORD(lParam); int yPos = HIWORD(lParam); char buf[1024]; //字符串拼接函数wsprintf(); wsprintf(buf,TEXT("x positon is %d,y postition is %d"), xPos, yPos); MessageBox(hwnd,buf, TEXT("鼠标左键按下"), MB_OK); break; } case WM_KEYDOWN: { MessageBox(hwnd, TEXT("键盘按下"), TEXT("键盘按下"), MB_OK); break; } case WM_PAINT: { PAINTSTRUCT ps;//绘图结构体 HDC hdc = BeginPaint(hwnd, &ps); TextOut(hdc, 100, 100, TEXT("Hello!"), strlen("Hello")); EndPaint(hwnd,&ps); break;
}
} return DefWindowProc(hwnd, uMsg, wParam, lParam); }
//程序入口函数 //WINAPI 代表__stdcall 参数的传递顺序,从左往右依次入栈,并且在函数返回前清空堆栈 int WINAPI WinMain( HINSTANCE hInstance, //h代表句柄,instance 实例 HINSTANCE hPrevInstance, //上一个应用程序句柄,一般为null LPSTR lpCmdLine, //char *agv[] int nShowCmd) //显示命令:最大化、最小化、正常 { //1.设计窗口 //2.注册窗口 //3.创建窗口 //4.显示和更新 //5.通过循环取消息 //6.处理消息(窗口过程)
//1.设计窗口 WNDCLASS wc; wc.cbClsExtra = 0;//类的额外内存 wc.cbWndExtra = 0;//窗口的额外内存 wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //设置背景色 wc.hCursor = LoadCursor(NULL, IDC_HAND);//设置光标 wc.hIcon = LoadIcon(NULL, IDI_ERROR); wc.hInstance = hInstance; //应用程序实例句柄 wc.lpfnWndProc = WindowProc; //回调函数、窗口过程 wc.lpszClassName = TEXT("WIN"); //指定窗口类名称 wc.lpszMenuName = NULL; //菜单名称 wc.style = 0;//显示风格,0代表默认风格
//2.注册窗口 RegisterClass(&wc);
//3.创建窗口 /* #define CreateWindowW(lpClassName, //类名 lpWindowName, //窗口名 dwStyle, //风格 x, //显示坐标,可以使用CW_USEDEFAULT y, nWidth, //宽高 nHeight, hWndParent, //父窗口句柄NULL hMenu, //菜单句柄NULL hInstance, //实例句柄 lpParam) //附加值NULL */ HWND hwnd=CreateWindow(wc.lpszClassName, TEXT("Windows"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance,NULL);
//4.显示和更新窗口 ShowWindow(hwnd, SW_SHOWNORMAL); UpdateWindow(hwnd);
//5.通过循环取消息 MSG msg; /* typedef struct tagMSG { HWND hwnd;//窗口句柄 UINT message;//具体的消息名称 WPARAM wParam;//键盘附加消息 LPARAM lParam;//鼠标附加消息,判断左右键 DWORD time;//消息产生时间 POINT pt; //附加消息,鼠标位置 } MSG, *PMSG, *LPMSG; */ while (TRUE) { /* BOOL WINAPI GetMessage( _Out_ LPMSG lpMsg, //MSG指针 _In_opt_ HWND hWnd, //捕获窗口,填NULL代表捕获所有窗口 _In_ UINT wMsgFilterMin, //最大最小过滤值,一般填0,填0代表捕获所有消息 _In_ UINT wMsgFilterMax ); */ if (GetMessage(&msg, NULL, 0, 0) == FALSE) { break; } //翻译消息 TranslateMessage(&msg); //分发消息 DispatchMessage(&msg); }
//6.处理窗口过程
return 0; }