|
我用win32创建窗口,窗口处于死循环,点击X无效,不知什么原因,请大家指点
- #include <windows.h>
- #include<TCHAR.h> //程序中使用了TCHAR类型,因此需要包含<TCHAR.h>
- HINSTANCE g_hInstance = 0;//当前程序的实例句柄
- static TCHAR szWindowClass[] = _T("WindowClass"); //窗口类名
- static TCHAR szTitle[] = _T("我的窗口程序"); //窗口标题
- // 2.定义窗口处理函数[自定义,用来处理消息的]
- LRESULT CALLBACK WndProc(HWND hWnd, UINT msgID, WPARAM wParam, LPARAM lParam)
- //WndProc 是函数名,可以自定义
- ///参数1:窗口句柄
- //参数2:消息ID
- //参数3和参数4:是消息附加数据
- {
- //7.消息处理
- switch (msgID)
- {
-
- case WM_DESTROY://接到DispatchMessage()发来WM_DESTROY消息
- PostQuitMessage(0);//通知系统进程中止退出
- default:
- return DefWindowProc(hWnd, msgID, wParam, lParam);//由系统默认处理的其它消息
- break;
- }
-
- }
- //3.注册窗口类
- void Register(LPSTR lpClassName, WNDPROC wndProc)
- //Register函数名自定义
- // 参数1:窗口类名
- //参数2:窗口处理函数
- {
- WNDCLASSEX wcs = { 0 };
- //WNDCLASSEX成员很多,先赋值0;
- //赋值0后,除下面必要的给成员赋值外,其余赋值0的均自动使用默认值。
- wcs.cbSize = sizeof(WNDCLASSEX); //因适应不同操作系统版本需要,必须如此赋值不能缺省
- wcs.cbClsExtra = 0;//窗口类扩展数据缓冲区
- //0 表示不需要缓冲区 4的整数倍
- wcs.cbWndExtra = 0; //窗口扩展数据缓冲区
- //0 表示不需要缓冲区 4的整数倍
- wcs.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);//指定窗口背景色-白色
- //是画刷
- wcs.hCursor = LoadCursor(NULL, IDC_ARROW); //为所有基于该窗口类的窗口设定一个鼠标指针
- //NULL表示使用系统默认鼠标指针
- wcs.hIcon = NULL; //为所有基于该窗口类的窗口设定一个图标
- //NULL表示使用系统默认图标
- wcs.hInstance = g_hInstance; //当前程序的实例句柄
- wcs.lpfnWndProc = wndProc; //窗口处理函数(必须是回调函数)
- //就是参数2 DefWindowProc系统默认处理函数
- wcs.lpszClassName = lpClassName; //指定窗口类名
- //就是参数1
- wcs.lpszMenuName = NULL; //指定窗口菜单
- //NULL表示没有菜单
- wcs.style = CS_HREDRAW | CS_VREDRAW; //指定窗口样式,各种样式可以使用按位或操作符组合起来
- //看:https://www.cnblogs.com/liming19680104/p/17004922.html//
- if (!RegisterClassEx(&wcs)) //注册窗口类
- //如果函数成功,则返回值是窗口类型的标识号。如果函数失败,则返回值为0
- {
- MessageBox(NULL, _T("注册窗口失败"), _T("Caption"), NULL);
- }
- }
- //4.创建窗口
- HWND CreateMain(LPSTR lpClassName, LPSTR lpWindowName)
- //参数1:窗口类名称
- //参数2:窗口标题栏字符串
- {
- HWND hWnd = CreateWindow(lpClassName, lpWindowName, WS_OVERLAPPEDWINDOW, 100, 100, 700, 500, NULL, NULL, g_hInstance, NULL);//创建窗口
- //参数1:窗口类名称
- //参数2:窗口标题栏字符串
- //参数3:窗口样式
- //参数4和参数5:窗口坐标
- //参数6和参数7:窗口宽和高
- //参数8:父窗口句柄
- //参数9:菜单句柄
- //参数10:当前程序实例句柄
- //参数11:附加数据,指向一个值的指针,该值传递给窗口 WM_CREATE 消息
- //返回值:窗口句柄,失败返回NULL
-
- if (!hWnd)
- {
- MessageBox(NULL, _T("创建窗口失败"), _T("Tip"), NULL);
-
- }
-
- return hWnd;
- }
- //5.显示窗口
- void Display(HWND hWnd, int nCmdShow)
- //函数名自定义
- {
- ShowWindow(hWnd, nCmdShow);
- //参数1:窗口句柄
- //参数2:显示方式
- }
- //6.消息循环
- int Message()
- {
- MSG nMsg = { 0 };
- BOOL bmsg = GetMessage(&nMsg, NULL, 0, 0);
- //作用:GetMessage是从调用线程的消息队列里取得一个消息并将其放于指定的结构
- // 此函数可取得与指定窗口联系的消息和由PostThreadMesssge寄送的线程消息
- // GetMessage不接收属于其他线程或应用程序的消息
- // 获取消息成功后,线程将从消息队列中删除该消息。函数会一直等待直到有消息到来才有返回值
- //参数1:指向MSG结构的指针,该结构从线程的消息队列里接收消息信息
- //参数2:取得其消息的窗口的句柄(HWND)。
- // 当其值取NULL时,GetMessage为任何属于调用线程的窗口检索消息
- // 线程消息通过PostThreadMessage寄送给调用线程
- //参数3:UINT wMsgFilterMin指定被检索的最小消息值的整数
- //参数4:UINT wMsgFilteMax指定被检索的最大消息值的整数
- // 如果参数3和参数4都为零,GetMessage获取所有可得的消息(即,无范围过滤)
- // 常数 WM_KEYFIRST和WM_KEYAST可作为过滤值取得与键盘输入相关的所有消息
- // 常数WM_MOUSEFIRST和WM_MOUSELST可用来接收所有的鼠标消息
- //返回值:如果函数取得WM_QUIT之外的其他消息,返回非零值;如果函数取得WM_QUIT消息,返回值是零
- // 如果出现了错误,返回值是-1
- //GetMessage不从队列里清除WM.PAINT消息。该消息将保留在队列里直到处理完毕
- while (bmsg)
- {
- BOOL bt = TranslateMessage(&nMsg);
- //作用:函数功能:该函数将虚拟键消息(快捷键消息)转换为字符消息。
- //参数:指向含有消息的MSG结构的指针,该结构里含有用函数GetMessage或PeekMessage从调用线程的消息队列里取得的消息信息
- // 返回值:如果消息被转换(即字符消息被寄送到调用线程的消息队列里),返回非零值。
- // 如果消息是WM_kEYDOWN,WM_KEYUP WM_SYSKEYDOWN或WM_SYSKEYUP,返回非零值,不考虑转换。
- // 如果消息没被转换(即字符消息没被寄送到调用线程的消息队列里),返回值是零。
- //说明:由于Windows对所有键盘编码都是采用虚拟键的定义,这样当按键按下时,并不得字符消息,需要键盘映射转换为字符的消息。
- // 字符消息被投递到调用线程的消息队列中,当下一次调用GetMessage函数时被取出。当我们敲击键盘上的某个字符键时,
- // 系统将产生WM_KEYDOWN和WM_KEYUP消息。这两个消息的附加参数( wParam和 lParam)包含的是 虚拟键代码和扫描码等信息,
- // 而我们在程序中往往需要得到某个字符的ASCII码,TranslateMessage这个函数就可以将WM_KEYDOWN和WM_ KEYUP消息的组合
- // 转换为一条WM_CHAR消息(该消息的wParam附加参数包含了字符的ASCII码),并将转换后的新消息投递到调用线程的消息队列中
- // 注意,TranslateMessage函数并不会修改原有的消息,它只是产生新的消息并投递到消息队列中。
- // 也就是说TranslateMessage会发现消息里是否有字符键的消息,如果有字符键的消息,就会产生WM_CHAR消息,如果没有就不会产生什么消息
- //备注:WM_KEYDOWN和WM_KEYUP组合产生一个WM_CHAR或WM_DEADCHAR消息
- // WM_SYSKEYDOWN和WM_SYSKEYUP组合产生一个WM_SYSCHAR或 WM_SYSDEADCHAR消息
- // TranslateMessage为那些由键盘驱动器映射为ASCll字符的键产生WM_CHAR消息
- // 如果应用程序为其他用途处理虚拟键消息,不应调用TranslateMessage。例如,如果调用TranslateAccelerator返回一个非零值,应用程序不应调用TranslateMessage
- // TranslateMessage只能用于转换调用GetMessage或PeekMessage接收的消息
- LONG nlong = DispatchMessage(&nMsg);
- //函数功能:该函数分发一个消息给窗口程序。通常消息从GetMessage函数获得或者TranslateMessage函数传递的
- // 它根据msg结构中的hWnd窗口句柄成员找到相应的窗口类 ,然后根据注册窗口时wndclass类结构找到相应的窗口函数WndPorc()。由消息传递函数将消息传递给窗口函数WndPorc()进行消息处理
- //参数:指向含有消息的MSG结构的指针
- //返回值:返回值是窗口程序返回的值。尽管返回值的含义依赖于被调度的消息,但返回值通常被忽略
- }
- return (int)nMsg.wParam;//通常是一个与消息有关的常量值,也可能是窗口或控件的句柄
- }
- // 1.定义WinMain函数
- int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevIns, LPSTR lpCmdLine, int nCmdShow)
- //参数1:当前程序实例句柄
- //参数2:前一个程序的实例句柄
- //参数3:命令行字符串
- //参数4:显示方式
- //CALLBACK是回调函数的意思,有系统调佣
- {
- g_hInstance = hInstance;
- Register(szWindowClass, WndProc); //调用注册函数
- //参数1:窗口类名--自定义
- HWND hWnd = CreateMain(szWindowClass, szTitle); //调用创建窗口函数
- Display(hWnd, nCmdShow); //调用显示窗口函数
- Message(); //调用消息循环函数
- return 0;
- }
复制代码 |
上一篇: 旋转3d图形,保持编辑框焦点
|