第1章 Hello MFC

╰半夏微凉° 2024-04-19 14:27 86阅读 0赞

微软 MFC 官方文档:https://docs.microsoft.com/zh-cn/cpp/mfc/mfc-desktop-applications?view=vs-2019

MFC 层次结构图以及下载地址:https://docs.microsoft.com/zh-cn/cpp/mfc/hierarchy-chart?view=vs-2019
VC6.0/VS2005/VS2010/VS2012/VS2013/VS2015的MFC类库继承图:
https://download.csdn.net/download/freeking101/11803983

微软 MSDN 帮助文档 :https://msdn.microsoft.com/library

MFC Widnows程序设计 第二版(带源码):https://pan.baidu.com/s/1SL6KEL0rv0KxktYEZnDATw 提取码:2c43

MFC 层次结构图

    1. 下图表示 派生自 MFC 类 CObject

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZyZWVraW5nMTAx_size_16_color_FFFFFF_t_70

    1. 下图表示 派生自 MFC 类 CWnd 和 CCmdTarget :

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZyZWVraW5nMTAx_size_16_color_FFFFFF_t_70 1

    1. 下图表示 不是 派生自 MFC 类CObject:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZyZWVraW5nMTAx_size_16_color_FFFFFF_t_70 2

1.1 Windows 编程模型

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZyZWVraW5nMTAx_size_16_color_FFFFFF_t_70 3

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZyZWVraW5nMTAx_size_16_color_FFFFFF_t_70 4

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZyZWVraW5nMTAx_size_16_color_FFFFFF_t_70 5

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZyZWVraW5nMTAx_size_16_color_FFFFFF_t_70 6

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZyZWVraW5nMTAx_size_16_color_FFFFFF_t_70 7

SDK应用程序 与 MFC应用程序 运行过程的 对比:

http://www.jizhuomi.com/software/145.html

实例代码:

  1. #include <windows.h>
  2. LONG WINAPI WndProc(HWND, UINT, WPARAM, LPARAM);
  3. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
  4. {
  5. WNDCLASS wc;
  6. HWND hwnd;
  7. MSG msg;
  8. wc.style = 0; //类样式
  9. wc.lpfnWndProc = (WNDPROC)WndProc; //window 程序地址
  10. wc.cbClsExtra = 0; //类 额外的字节
  11. wc.cbWndExtra = 0; //window 额外的字节
  12. wc.hInstance = hInstance; //实例句柄
  13. wc.hIcon = LoadIcon(NULL, IDI_WINLOGO); //图标句柄
  14. wc.hCursor = LoadIcon(NULL, IDC_ARROW); //鼠标句柄
  15. wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); // 背景颜色
  16. wc.lpszMenuName = NULL; //菜单名
  17. wc.lpszClassName = "MyWndClass"; //WNDCLASS 名
  18. RegisterClass(&wc);
  19. hwnd = CreateWindow(
  20. "MyWndClass", //WNDCLASS 名
  21. "SDK_Application", //window title
  22. WS_OVERLAPPEDWINDOW, //window style
  23. CW_USEDEFAULT, //水平位置
  24. CW_USEDEFAULT, //垂直位置
  25. CW_USEDEFAULT, //初始化宽度
  26. CW_USEDEFAULT, //初始化高度
  27. HWND_DESKTOP, //父窗口句柄
  28. NULL, //菜单句柄
  29. hInstance, //应用程序的 实例 句柄
  30. NULL //window 创建数据
  31. );
  32. ShowWindow(hwnd, nShowCmd);
  33. UpdateWindow(hwnd);
  34. while (GetMessage(&msg, NULL, 0, 0))
  35. {
  36. TranslateMessage(&msg);
  37. DispatchMessage(&msg);
  38. }
  39. return msg.wParam;
  40. }
  41. LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  42. {
  43. PAINTSTRUCT ps;
  44. HDC hdc;
  45. switch (message)
  46. {
  47. case WM_PAINT:
  48. hdc = BeginPaint(hwnd, &ps);
  49. Ellipse(hdc, 0, 0, 200, 100);
  50. EndPaint(hwnd, &ps);
  51. return 0;
  52. case WM_DESTROY:
  53. PostQuitMessage(0);
  54. return 0;
  55. }
  56. return DefWindowProc(hwnd, message, wParam, lParam);
  57. }

运行截图:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZyZWVraW5nMTAx_size_16_color_FFFFFF_t_70 8

程序解释:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZyZWVraW5nMTAx_size_16_color_FFFFFF_t_70 9

示例代码 2:

  1. #include <windows.h>
  2. LRESULT CALLBACK myWndProc(HWND hWindow, UINT msg, WPARAM wParam, LPARAM lParam);
  3. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
  4. {
  5. const static TCHAR appName[] = TEXT("Hello world");
  6. WNDCLASSEX myWin;
  7. myWin.cbSize = sizeof(myWin);
  8. myWin.style = CS_HREDRAW | CS_VREDRAW;
  9. myWin.lpfnWndProc = myWndProc;
  10. myWin.cbClsExtra = 0;
  11. myWin.cbWndExtra = 0;
  12. myWin.hInstance = hInstance;
  13. myWin.hIcon = 0;
  14. myWin.hIconSm = 0;
  15. myWin.hCursor = 0;
  16. myWin.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
  17. myWin.lpszMenuName = 0;
  18. myWin.lpszClassName = appName;
  19. //Register
  20. if (!RegisterClassEx(&myWin)) return 0;
  21. const HWND hWindow = CreateWindow(
  22. appName,
  23. appName,
  24. WS_OVERLAPPEDWINDOW,
  25. CW_USEDEFAULT,
  26. CW_USEDEFAULT,
  27. CW_USEDEFAULT,
  28. CW_USEDEFAULT,
  29. 0,
  30. 0,
  31. hInstance,
  32. 0);
  33. ShowWindow(hWindow, iCmdShow);
  34. UpdateWindow(hWindow);
  35. {
  36. MSG msg;
  37. while (GetMessage(&msg, 0, 0, 0))
  38. {
  39. TranslateMessage(&msg);
  40. DispatchMessage(&msg);
  41. }
  42. return (int)msg.wParam;
  43. }
  44. }
  45. LRESULT CALLBACK myWndProc(HWND hWindow, UINT msg, WPARAM wParam, LPARAM lParam)
  46. {
  47. if (msg == WM_PAINT)
  48. {
  49. PAINTSTRUCT ps;
  50. const HDC hDC = BeginPaint(hWindow, &ps);
  51. RECT rect;
  52. GetClientRect(hWindow, &rect);
  53. DrawText(hDC, TEXT("HELLO WORLD"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
  54. EndPaint(hWindow, &ps);
  55. return 0;
  56. }
  57. else if (msg == WM_DESTROY)
  58. {
  59. PostQuitMessage(0);
  60. return 0;
  61. }
  62. return DefWindowProc(hWindow, msg, wParam, lParam);
  63. }

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZyZWVraW5nMTAx_size_16_color_FFFFFF_t_70 10

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZyZWVraW5nMTAx_size_16_color_FFFFFF_t_70 11

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZyZWVraW5nMTAx_size_16_color_FFFFFF_t_70 12

1.3 第一个 MFC 程序

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZyZWVraW5nMTAx_size_16_color_FFFFFF_t_70 13

源代码:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZyZWVraW5nMTAx_size_16_color_FFFFFF_t_70 14

hello.h

  1. class CMyApp : public CWinApp
  2. {
  3. public:
  4. virtual BOOL InitInstance ();
  5. };
  6. class CMainWindow : public CFrameWnd
  7. {
  8. public:
  9. CMainWindow ();
  10. protected:
  11. afx_msg void OnPaint ();
  12. DECLARE_MESSAGE_MAP ()
  13. };

MFC 中 afx_msg 是什么,afx_msg void function() 是什么意思:https://www.cnblogs.com/linkzijun/p/6196165.html

hello.cpp

  1. #include <afxwin.h>
  2. #include "Hello.h"
  3. CMyApp myApp;
  4. /
  5. // CMyApp member functions
  6. BOOL CMyApp::InitInstance ()
  7. {
  8. m_pMainWnd = new CMainWindow;
  9. m_pMainWnd->ShowWindow (m_nCmdShow);
  10. m_pMainWnd->UpdateWindow ();
  11. return TRUE;
  12. }
  13. /
  14. // CMainWindow message map and member functions
  15. BEGIN_MESSAGE_MAP (CMainWindow, CFrameWnd)
  16. ON_WM_PAINT ()
  17. END_MESSAGE_MAP ()
  18. CMainWindow::CMainWindow ()
  19. {
  20. Create (NULL, _T ("The Hello Application"));
  21. }
  22. void CMainWindow::OnPaint ()
  23. {
  24. CPaintDC dc (this);
  25. CRect rect;
  26. GetClientRect (&rect);
  27. dc.DrawText (_T ("Hello, MFC"), -1, &rect,
  28. DT_SINGLELINE | DT_CENTER | DT_VCENTER);
  29. }

运行结果截图:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZyZWVraW5nMTAx_size_16_color_FFFFFF_t_70 15

1.3.1 应用程序对象

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZyZWVraW5nMTAx_size_16_color_FFFFFF_t_70 16

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZyZWVraW5nMTAx_size_16_color_FFFFFF_t_70 17

1.3.2 MFC 如何使用应用程序对象

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZyZWVraW5nMTAx_size_16_color_FFFFFF_t_70 18

1.3.3 框架窗口对象

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZyZWVraW5nMTAx_size_16_color_FFFFFF_t_70 19

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZyZWVraW5nMTAx_size_16_color_FFFFFF_t_70 20

1.3.4 绘制窗口

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZyZWVraW5nMTAx_size_16_color_FFFFFF_t_70 21

1.3.5 消息映射

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZyZWVraW5nMTAx_size_16_color_FFFFFF_t_70 22

1.3.6 消息映射的工作方式

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZyZWVraW5nMTAx_size_16_color_FFFFFF_t_70 23

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZyZWVraW5nMTAx_size_16_color_FFFFFF_t_70 24

1.3.7 Windows、字符集 和 _T 宏

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZyZWVraW5nMTAx_size_16_color_FFFFFF_t_70 25

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZyZWVraW5nMTAx_size_16_color_FFFFFF_t_70 26

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZyZWVraW5nMTAx_size_16_color_FFFFFF_t_70 27

发表评论

表情:
评论列表 (有 0 条评论,86人围观)

还没有评论,来说两句吧...

相关阅读

    相关 1 Readme

    第 1 章 Readme 1、参考资料 [尚硅谷Java设计模式(图解+框架源码剖析)][Java] 2、笔记地址 [老韩设计模式][Link 1] [

    相关 1 导论

    这系列博客主要记录自己学习《算法:c语言实现》的过程。 学习方法有二: 1、Robert Sedgewick普林斯顿大学公开课,[课程链接见B站,带有中文字幕高大上][

    相关 1 继承

    1.1 继承的概述 在现实生活中,继承一般指的是子女继承父辈的财产。在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系。 1.2 继承