服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - 如何使用visual studio2019创建简单的MFC窗口(使用C++)

如何使用visual studio2019创建简单的MFC窗口(使用C++)

2021-08-24 15:05BiliIT C/C++

这篇文章主要介绍了如何使用visual studio2019创建简单的MFC窗口(使用C++),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

本文介绍了如何使用visual studio2019创建简单的MFC窗口(使用C++)

如何使用visual studio2019创建简单的MFC窗口(使用C++)```cpp

使用visual studio 2019 创建过程请参考Bili的上一篇文章⬇⬇
→!使用visual studio 2019 创建简单的MFC窗口「使用底层的C语言」

  1. #include<windows.h> //底层实现窗口的头文件
  2.  
  3. //6.处理窗口过程
  4.  
  5. //CALLBACK 代表_stdcall 参数的传递顺序:从右到左依次入栈,并且函数返回前清空堆栈
  6.  
  7. LRESULT CALLBACK WindowProc(HWND hand, //消息所属窗口句柄
  8.  
  9. UINT uMsg, //具体消息名称 WM_XXXX消息名
  10.  
  11. WPARAM wParam, //键盘附加消息
  12.  
  13. LPARAM lParam) { //鼠标附加消息
  14.  
  15. switch (uMsg)
  16.  
  17. {
  18.  
  19. case WM_CLOSE:
  20.  
  21. //所有以XXXXWindow为结尾的方法,都不会进入到消息队列中,而是直接执行
  22.  
  23. DestroyWindow(hand);//发送另一个消息WM_DESTROY
  24.  
  25. break;
  26.  
  27. case WM_DESTROY:
  28.  
  29. PostQuitMessage(0);
  30.  
  31. break;
  32.  
  33. case WM_LBUTTONDOWN://鼠标左键按下
  34.  
  35. {
  36.  
  37. int xPos = LOWORD(lParam);
  38.  
  39. int yPos = HIWORD(lParam);
  40.  
  41. char buf[1024];
  42.  
  43. wsprintf(buf, TEXT("x = %d,y = %d"),xPos,yPos);
  44.  
  45. MessageBox(hand, buf, TEXT("按下鼠标左键"), MB_OK);
  46.  
  47. break;
  48.  
  49. }
  50.  
  51. case WM_KEYDOWN: //键盘
  52.  
  53. {
  54.  
  55. MessageBox(hand, TEXT("键盘"), TEXT("按下键盘"), MB_OK);
  56.  
  57. break;
  58.  
  59. }
  60.  
  61. case WM_PAINT: //画图
  62.  
  63. {
  64.  
  65. PAINTSTRUCT ps; //画图结构体
  66.  
  67. HDC hdc = BeginPaint(hand, &ps);
  68.  
  69. TextOut(hdc, 100, 100,TEXT("hello"), strlen("hello"));
  70.  
  71. EndPaint(hand, &ps);
  72.  
  73. break;
  74.  
  75. }
  76.  
  77. default:
  78.  
  79. break;
  80.  
  81. }
  82.  
  83. //返回值用默认处理方式
  84.  
  85. return DefWindowProc(hand, uMsg, wParam, lParam);
  86.  
  87. }
  88.  
  89. /*程序入口函数
  90.  
  91. _In_ HINSTANCE hInstance,//应用程序实例句柄
  92.  
  93. _In_opt_ HINSTANCE hPrevInstance,//上一个应用程序句柄,在WIN32环境下一般为NULL,不起作用了
  94.  
  95. _In_ LPSTR lpCmdLine,//char * argv[]
  96.  
  97. _In_ int nShowCmd//显示命令 最大化、最小化、正常
  98.  
  99. WINAPI 代表_stdcall 参数的传递顺序:从右到左依次入栈,并且函数返回前清空堆栈*/
  100.  
  101. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd
  102.  
  103. ) {
  104.  
  105. /*
  106.  
  107. 1.设计窗口
  108.  
  109. 2.注册窗口
  110.  
  111. 3.创建窗口
  112.  
  113. 4.显示和更新
  114.  
  115. 5.通过循环取消息
  116.  
  117. 6.处理消息(窗口过程)
  118.  
  119. */
  120.  
  121. //1.设计窗口
  122.  
  123. WNDCLASS wc;
  124.  
  125. wc.cbClsExtra = 0; //类的额外的内存
  126.  
  127. wc.cbWndExtra = 0; //窗口额外的内存
  128.  
  129. wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //设置背景
  130.  
  131. wc.hCursor = LoadCursor(NULL, IDC_HAND); //设置光标,如果第一个参数为null,代表使用系统提供的光标
  132.  
  133. wc.hIcon = LoadIcon(NULL, IDI_ERROR); //图标,如果第一个参数为null,代表使用系统提供的图标
  134.  
  135. wc.hInstance = hInstance; //应用程序的实例句柄,传入winmain的形参即可
  136.  
  137. wc.lpfnWndProc = WindowProc; //回调函数 窗口过程
  138.  
  139. wc.lpszClassName = TEXT("WIN"); //指定窗口名称
  140.  
  141. wc.lpszMenuName = NULL; //菜单名称
  142.  
  143. wc.style = 0; //显示风格,0代表默认
  144.  
  145. //2.注册窗口
  146.  
  147. RegisterClass(&wc);
  148.  
  149. //3.创建窗口
  150.  
  151. /*lpszClassName,//类名
  152.  
  153. lpWindowName, //标题名
  154.  
  155. dwStyle, //风格 WC_OVERLAPPEDWINDOW
  156.  
  157. x, //坐标 CW_USERDEFAULT
  158.  
  159. y, //坐标
  160.  
  161. nWidth, //宽
  162.  
  163. nHeight, //高
  164.  
  165. hWndParent, //父窗口 null
  166.  
  167. hMenu, //菜单 null
  168.  
  169. hInstance, //实例句柄
  170.  
  171. lpParam //附加值 鼠标附加值*/
  172.  
  173. HWND hwnd = CreateWindow(wc.lpszClassName, TEXT("WINDOWS"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
  174.  
  175. //4.显示和更新
  176.  
  177. ShowWindow(hwnd, SW_SHOWNORMAL);
  178.  
  179. UpdateWindow(hwnd);
  180.  
  181. /*HWND hwnd; //主窗口句柄
  182.  
  183. UINT message; //具体消息名称
  184.  
  185. WPARAM wParam; //附加消息 键盘消息
  186.  
  187. LPARAM lParam; //附加消息 鼠标消息
  188.  
  189. DWORD time; //消息产生时间
  190.  
  191. POINT pt;*/ //附加消息 鼠标消息 x,y
  192.  
  193. //5.通过循环取消息
  194.  
  195. MSG msg;
  196.  
  197. /*
  198.  
  199. _Out_ LPMSG lpMsg, //消息
  200.  
  201. _In_opt_ HWND hWnd, //捕获窗口 填null表示捕获所有窗口
  202.  
  203. _In_ UINT wMsgFilterMin, //最大和最小的过滤消息 一般填0
  204.  
  205. _In_ UINT wMsgFilterMax);*/
  206.  
  207. while (GetMessage(&msg, NULL, 0, 0))
  208.  
  209. {
  210.  
  211. /*if (GetMessage(&msg, NULL, 0, 0) == FALSE) {
  212.  
  213. break;
  214.  
  215. }*/
  216.  
  217. //翻译消息
  218.  
  219. TranslateMessage(&msg);
  220.  
  221. //不是false
  222.  
  223. //分发消息
  224.  
  225. DispatchMessage(&msg);
  226.  
  227. }
  228.  
  229. return 0;
  230.  
  231. }

划重点:项目->属性->常规->高级->将MFC的使用设置为在“共享dll中使用mfc”

头文件mfc.h

  1. #include <afxwin.h>//mfc头文件
  2.  
  3. class MyApp:public CWinApp{
  4.  
  5. public:
  6.  
  7. virtual BOOL InitInstance();
  8.  
  9. };
  10.  
  11. class MyFrame :public CFrameWnd {//窗口框架类
  12.  
  13. public:
  14.  
  15. MyFrame();
  16.  
  17. //声明宏 提示消息映射机制
  18.  
  19. DECLARE_MESSAGE_MAP();
  20.  
  21. afx_msg void OnLButtonDown(UINT,CPoint);
  22.  
  23. afx_msg void OnChar(UINT,UINT,UINT);
  24.  
  25. afx_msg void OnPaint();
  26.  
  27. };

源文件mfc.cpp

  1. #include mfc.h
  2.  
  3. MyApp app;
  4.  
  5. BOOL MyApp::InitInstance() {
  6.  
  7. //创建窗口
  8.  
  9. MyFrame* frame = new MyFrame;
  10.  
  11. //显示和更新
  12.  
  13. frame->ShowWindow(SW_SHOWNORMAL);
  14.  
  15. frame->UpdateWindow();
  16.  
  17. m_pMainWnd = frame;//保存指向应用程序的主窗口的指针
  18.  
  19. return TRUE;//返回正常初始化
  20.  
  21. }
  22.  
  23. //分界宏
  24.  
  25. BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd)
  26.  
  27. ON_WM_LBUTTONDOWN()//鼠标左键按下
  28.  
  29. ON_WM_CHAR()
  30.  
  31. ON_WM_PAINT()
  32.  
  33. END_MESSAGE_MAP()
  34.  
  35. MyFrame::MyFrame()
  36.  
  37. {
  38.  
  39. Create(NULL,TEXT(“windows”));
  40.  
  41. }
  42.  
  43. void MyFrame::OnLButtonDown(UINT, CPoint point)
  44.  
  45. {
  46.  
  47. //TCHAR buf[1024];
  48.  
  49. //wsprintf(buf, TEXT(“x = %d,y = %d”), point.x, point.y);
  50.  
  51. //MessageBox(buf);
  52.  
  53. CString str;
  54.  
  55. str.Format(TEXT(“x = %d,y = %d”),point.x,point.y);
  56.  
  57. MessageBox(str);
  58.  
  59. }
  60.  
  61. void MyFrame::OnChar(UINT key, UINT, UINT)
  62.  
  63. {
  64.  
  65. CString str;
  66.  
  67. str.Format(TEXT(“按下了%c键”),key);
  68.  
  69. MessageBox(str);
  70.  
  71. }
  72.  
  73. void MyFrame::OnPaint()
  74.  
  75. {
  76.  
  77. CPaintDC dc(this);
  78.  
  79. dc.TextOutW(100,100,TEXT(“为了部落”));
  80.  
  81. dc.Ellipse(10,10,100,100);
  82.  
  83. }

到此这篇关于如何使用visual studio2019创建简单的MFC窗口(使用C++)的文章就介绍到这了,更多相关vs2019创建MFC窗口内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_44756627/article/details/102173578

延伸 · 阅读

精彩推荐