win32-创建界面
1.创建空工程
2.设为启动项目
3.设置字符集
右击工程-->属性
4.添加新建项
右击工程-->新建项
5.代码
#include<windows.h> //win32程序需要包含<windows.h> #include<TCHAR.h> //程序中使用了TCHAR类型,因此需要包含<TCHAR.h> static TCHAR szWindowClass[] = _T("WindowClass"); //窗口类名 static TCHAR szTitle[] = _T("我的窗口程序"); //窗口标题 //2.定义窗口处理函数[自定义,用来处理消息的] LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) //CALLBACK代表这个函数是回调函数,也就是作为主函数的参数(这里是在注册窗口时作为WNDCLASSEX声明的wcex的成员被主函数调用 //WindowProc 是函数名,可以自定义 //参数1:窗口句柄 //参数2:消息ID //参数3和参数4:是消息附加数据 { switch (uMsg) //接收第四步DispatchMessage()发出得消息或者系统直接发出的消息 { case WM_DESTROY://接到DispatchMessage()发来WM_DESTROY消息 PostQuitMessage(0);//通知系统进程中止退出 default: return DefWindowProc(hWnd, uMsg, wParam, lParam);//由系统默认处理的其它消息 break; } } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow) //入口函数 //参数1:当前程序实例句柄 //参数2:前一个程序的实例句柄 //参数3:命令行字符串 //参数4:显示方式 { //第一步:注册窗口类 WNDCLASSEX wx = { 0 }; //注意:1.注册的窗口类并不直接显示; // 2.WNDCLASSEX成员很多,先赋值0; // 3.赋值0后,除下面必要的给成员赋值外,其余赋值0的 // 均自动使用默认值。 wx.cbSize = sizeof(WNDCLASSEX); //因适应不同操作系统版本需要,必须如此赋值不能缺省。 wx.lpfnWndProc = WindowProc; //回调函数(在第五步实现),我们的显示内容在回调函数中实现 wx.lpszClassName = szWindowClass;//窗口类名 if (!RegisterClassEx(&wx)) //向系统注册 { MessageBox(NULL, _T("注册窗口失败"), _T("Caption"), NULL); } //第二步:创建窗口 HWND hWnd = CreateWindow(szWindowClass,szTitle, WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,500, 300,NULL,NULL,hInstance,NULL); //创建窗口 //参数1:窗口类名 //参数2:窗口标题 //参数3:窗口样式 //参数4和参数5:窗口坐标;CW_USEDEFAULT是缺省值 //参数6和参数7:窗口宽和高 //参数8:父窗口句柄 //参数9:菜单句柄 //参数10:当前程序实例句柄 //参数11:附加数据;指向一个值的指针,该值传递给窗口 WM_CREATE 消息 //返回值:窗口句柄,失败返回NULL if (!hWnd) { MessageBox(NULL, _T("创建窗口失败"), _T("Tip"), NULL); return 1; } //第三步:显示窗口 ShowWindow(hWnd, nCmdShow);//将窗口在屏幕上显示出来 //参数1:窗口句柄 //参数2:显示方式 //第四步:开始消息循环 MSG msg = { 0 };//声明一个 while (GetMessage(&msg, 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消息。该消息将保留在队列里直到处理完毕 { TranslateMessage(&msg); //作用:函数功能:该函数将虚拟键消息(快捷键消息)转换为字符消息。 //参数:指向含有消息的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接收的消息 DispatchMessage(&msg); //分发消息 //函数功能:该函数分发一个消息给窗口程序。通常消息从GetMessage函数获得或者TranslateMessage函数传递的 // 它根据msg结构中的hWnd窗口句柄成员找到相应的窗口类 ,然后根据注册窗口时wndclass类结构找到相应的窗口函数WndPorc()。由消息传递函数将消息传递给窗口函数WndPorc()进行消息处理 //参数:指向含有消息的MSG结构的指针 //返回值:返回值是窗口程序返回的值。尽管返回值的含义依赖于被调度的消息,但返回值通常被忽略 } return (int)msg.wParam;//通常是一个与消息有关的常量值,也可能是窗口或控件的句柄。 }
示例工程:
链接:https://pan.baidu.com/s/1mmqoNcK7CFVGxGf5MCqljQ 提取码:6666
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
2021-12-13 opencv-getStructuringElement结构元素(内核矩阵)
2021-12-13 opencv-inpainting图像修复