├── DrawingSystem.sln ├── DrawingSystem ├── DrawingSystem.aps ├── DrawingSystem.cpp ├── DrawingSystem.h ├── DrawingSystem.rc ├── DrawingSystem.vcxproj ├── DrawingSystem.vcxproj.filters ├── DrawingSystem.vcxproj.user ├── DrawingSystemDlg.cpp ├── DrawingSystemDlg.h ├── framework.h ├── pch.cpp ├── pch.h ├── res │ ├── DrawingSystem.ico │ ├── DrawingSystem.rc2 │ ├── lena.png │ └── 照片.png ├── resource.h └── targetver.h └── README.md /DrawingSystem.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 16 4 | VisualStudioVersion = 16.0.33423.256 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DrawingSystem", "DrawingSystem\DrawingSystem.vcxproj", "{695CE0C3-5E0F-4A91-BD68-8A18249B34A6}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|x64 = Debug|x64 11 | Debug|x86 = Debug|x86 12 | Release|x64 = Release|x64 13 | Release|x86 = Release|x86 14 | EndGlobalSection 15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 16 | {695CE0C3-5E0F-4A91-BD68-8A18249B34A6}.Debug|x64.ActiveCfg = Debug|x64 17 | {695CE0C3-5E0F-4A91-BD68-8A18249B34A6}.Debug|x64.Build.0 = Debug|x64 18 | {695CE0C3-5E0F-4A91-BD68-8A18249B34A6}.Debug|x86.ActiveCfg = Debug|Win32 19 | {695CE0C3-5E0F-4A91-BD68-8A18249B34A6}.Debug|x86.Build.0 = Debug|Win32 20 | {695CE0C3-5E0F-4A91-BD68-8A18249B34A6}.Release|x64.ActiveCfg = Release|x64 21 | {695CE0C3-5E0F-4A91-BD68-8A18249B34A6}.Release|x64.Build.0 = Release|x64 22 | {695CE0C3-5E0F-4A91-BD68-8A18249B34A6}.Release|x86.ActiveCfg = Release|Win32 23 | {695CE0C3-5E0F-4A91-BD68-8A18249B34A6}.Release|x86.Build.0 = Release|Win32 24 | EndGlobalSection 25 | GlobalSection(SolutionProperties) = preSolution 26 | HideSolutionNode = FALSE 27 | EndGlobalSection 28 | GlobalSection(ExtensibilityGlobals) = postSolution 29 | SolutionGuid = {C82B619B-2734-4287-ADF9-53CE4EBDCB84} 30 | EndGlobalSection 31 | EndGlobal 32 | -------------------------------------------------------------------------------- /DrawingSystem/DrawingSystem.aps: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mouseminar/MFC-DrawingSystem/0daadb69e37a4ce533f321b3b36f1300b682c1f2/DrawingSystem/DrawingSystem.aps -------------------------------------------------------------------------------- /DrawingSystem/DrawingSystem.cpp: -------------------------------------------------------------------------------- 1 |  2 | // DrawingSystem.cpp: 定义应用程序的类行为。 3 | // 4 | 5 | #include "pch.h" 6 | #include "framework.h" 7 | #include "DrawingSystem.h" 8 | #include "DrawingSystemDlg.h" 9 | 10 | #ifdef _DEBUG 11 | #define new DEBUG_NEW 12 | #endif 13 | 14 | 15 | // CDrawingSystemApp 16 | 17 | BEGIN_MESSAGE_MAP(CDrawingSystemApp, CWinApp) 18 | ON_COMMAND(ID_HELP, &CWinApp::OnHelp) 19 | END_MESSAGE_MAP() 20 | 21 | 22 | // CDrawingSystemApp 构造 23 | 24 | CDrawingSystemApp::CDrawingSystemApp() 25 | { 26 | // 支持重新启动管理器 27 | m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_RESTART; 28 | 29 | // TODO: 在此处添加构造代码, 30 | // 将所有重要的初始化放置在 InitInstance 中 31 | } 32 | 33 | 34 | // 唯一的 CDrawingSystemApp 对象 35 | 36 | CDrawingSystemApp theApp; 37 | 38 | 39 | // CDrawingSystemApp 初始化 40 | 41 | BOOL CDrawingSystemApp::InitInstance() 42 | { 43 | // 如果一个运行在 Windows XP 上的应用程序清单指定要 44 | // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式, 45 | //则需要 InitCommonControlsEx()。 否则,将无法创建窗口。 46 | INITCOMMONCONTROLSEX InitCtrls; 47 | InitCtrls.dwSize = sizeof(InitCtrls); 48 | // 将它设置为包括所有要在应用程序中使用的 49 | // 公共控件类。 50 | InitCtrls.dwICC = ICC_WIN95_CLASSES; 51 | InitCommonControlsEx(&InitCtrls); 52 | 53 | CWinApp::InitInstance(); 54 | 55 | 56 | AfxEnableControlContainer(); 57 | 58 | // 创建 shell 管理器,以防对话框包含 59 | // 任何 shell 树视图控件或 shell 列表视图控件。 60 | CShellManager *pShellManager = new CShellManager; 61 | 62 | // 激活“Windows Native”视觉管理器,以便在 MFC 控件中启用主题 63 | CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows)); 64 | 65 | // 标准初始化 66 | // 如果未使用这些功能并希望减小 67 | // 最终可执行文件的大小,则应移除下列 68 | // 不需要的特定初始化例程 69 | // 更改用于存储设置的注册表项 70 | // TODO: 应适当修改该字符串, 71 | // 例如修改为公司或组织名 72 | SetRegistryKey(_T("应用程序向导生成的本地应用程序")); 73 | 74 | CDrawingSystemDlg dlg; 75 | m_pMainWnd = &dlg; 76 | INT_PTR nResponse = dlg.DoModal(); 77 | if (nResponse == IDOK) 78 | { 79 | // TODO: 在此放置处理何时用 80 | // “确定”来关闭对话框的代码 81 | } 82 | else if (nResponse == IDCANCEL) 83 | { 84 | // TODO: 在此放置处理何时用 85 | // “取消”来关闭对话框的代码 86 | } 87 | else if (nResponse == -1) 88 | { 89 | TRACE(traceAppMsg, 0, "警告: 对话框创建失败,应用程序将意外终止。\n"); 90 | TRACE(traceAppMsg, 0, "警告: 如果您在对话框上使用 MFC 控件,则无法 #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS。\n"); 91 | } 92 | 93 | // 删除上面创建的 shell 管理器。 94 | if (pShellManager != nullptr) 95 | { 96 | delete pShellManager; 97 | } 98 | 99 | #if !defined(_AFXDLL) && !defined(_AFX_NO_MFC_CONTROLS_IN_DIALOGS) 100 | ControlBarCleanUp(); 101 | #endif 102 | 103 | // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序, 104 | // 而不是启动应用程序的消息泵。 105 | return FALSE; 106 | } 107 | 108 | -------------------------------------------------------------------------------- /DrawingSystem/DrawingSystem.h: -------------------------------------------------------------------------------- 1 |  2 | // DrawingSystem.h: PROJECT_NAME 应用程序的主头文件 3 | // 4 | 5 | #pragma once 6 | 7 | #ifndef __AFXWIN_H__ 8 | #error "在包含此文件之前包含 'pch.h' 以生成 PCH" 9 | #endif 10 | 11 | #include "resource.h" // 主符号 12 | 13 | 14 | // CDrawingSystemApp: 15 | // 有关此类的实现,请参阅 DrawingSystem.cpp 16 | // 17 | 18 | class CDrawingSystemApp : public CWinApp 19 | { 20 | public: 21 | CDrawingSystemApp(); 22 | 23 | // 重写 24 | public: 25 | virtual BOOL InitInstance(); 26 | 27 | // 实现 28 | 29 | DECLARE_MESSAGE_MAP() 30 | }; 31 | 32 | extern CDrawingSystemApp theApp; 33 | -------------------------------------------------------------------------------- /DrawingSystem/DrawingSystem.rc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mouseminar/MFC-DrawingSystem/0daadb69e37a4ce533f321b3b36f1300b682c1f2/DrawingSystem/DrawingSystem.rc -------------------------------------------------------------------------------- /DrawingSystem/DrawingSystem.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Release 10 | Win32 11 | 12 | 13 | Debug 14 | x64 15 | 16 | 17 | Release 18 | x64 19 | 20 | 21 | 22 | 16.0 23 | {695CE0C3-5E0F-4A91-BD68-8A18249B34A6} 24 | MFCProj 25 | DrawingSystem 26 | 10.0 27 | 28 | 29 | 30 | Application 31 | true 32 | v142 33 | Unicode 34 | Dynamic 35 | 36 | 37 | Application 38 | false 39 | v142 40 | true 41 | Unicode 42 | Dynamic 43 | 44 | 45 | Application 46 | true 47 | v142 48 | Unicode 49 | Dynamic 50 | 51 | 52 | Application 53 | false 54 | v142 55 | true 56 | Unicode 57 | Dynamic 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | true 79 | 80 | 81 | true 82 | 83 | 84 | false 85 | 86 | 87 | false 88 | 89 | 90 | 91 | Use 92 | Level3 93 | true 94 | WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) 95 | pch.h 96 | 97 | 98 | Windows 99 | 100 | 101 | false 102 | true 103 | _DEBUG;%(PreprocessorDefinitions) 104 | 105 | 106 | 0x0804 107 | _DEBUG;%(PreprocessorDefinitions) 108 | $(IntDir);%(AdditionalIncludeDirectories) 109 | 110 | 111 | 112 | 113 | Use 114 | Level3 115 | true 116 | _WINDOWS;_DEBUG;%(PreprocessorDefinitions) 117 | pch.h 118 | 119 | 120 | Windows 121 | 122 | 123 | false 124 | true 125 | _DEBUG;%(PreprocessorDefinitions) 126 | 127 | 128 | 0x0804 129 | _DEBUG;%(PreprocessorDefinitions) 130 | $(IntDir);%(AdditionalIncludeDirectories) 131 | 132 | 133 | 134 | 135 | Use 136 | Level3 137 | true 138 | true 139 | true 140 | WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) 141 | pch.h 142 | 143 | 144 | Windows 145 | true 146 | true 147 | 148 | 149 | false 150 | true 151 | NDEBUG;%(PreprocessorDefinitions) 152 | 153 | 154 | 0x0804 155 | NDEBUG;%(PreprocessorDefinitions) 156 | $(IntDir);%(AdditionalIncludeDirectories) 157 | 158 | 159 | 160 | 161 | Use 162 | Level3 163 | true 164 | true 165 | true 166 | _WINDOWS;NDEBUG;%(PreprocessorDefinitions) 167 | pch.h 168 | 169 | 170 | Windows 171 | true 172 | true 173 | 174 | 175 | false 176 | true 177 | NDEBUG;%(PreprocessorDefinitions) 178 | 179 | 180 | 0x0804 181 | NDEBUG;%(PreprocessorDefinitions) 182 | $(IntDir);%(AdditionalIncludeDirectories) 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | Create 198 | Create 199 | Create 200 | Create 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | -------------------------------------------------------------------------------- /DrawingSystem/DrawingSystem.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | 头文件 20 | 21 | 22 | 头文件 23 | 24 | 25 | 头文件 26 | 27 | 28 | 头文件 29 | 30 | 31 | 头文件 32 | 33 | 34 | 头文件 35 | 36 | 37 | 38 | 39 | 源文件 40 | 41 | 42 | 源文件 43 | 44 | 45 | 源文件 46 | 47 | 48 | 49 | 50 | 资源文件 51 | 52 | 53 | 54 | 55 | 资源文件 56 | 57 | 58 | 59 | 60 | 资源文件 61 | 62 | 63 | -------------------------------------------------------------------------------- /DrawingSystem/DrawingSystem.vcxproj.user: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | DrawingSystem.rc 5 | 6 | -------------------------------------------------------------------------------- /DrawingSystem/DrawingSystemDlg.cpp: -------------------------------------------------------------------------------- 1 |  2 | // DrawingSystemDlg.cpp: 实现文件 3 | // 4 | 5 | #include "pch.h" 6 | #include "framework.h" 7 | #include "DrawingSystem.h" 8 | #include "DrawingSystemDlg.h" 9 | #include "afxdialogex.h" 10 | 11 | #ifdef _DEBUG 12 | #define new DEBUG_NEW 13 | #endif 14 | 15 | 16 | // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 17 | 18 | class CAboutDlg : public CDialogEx 19 | { 20 | public: 21 | CAboutDlg(); 22 | 23 | // 对话框数据 24 | #ifdef AFX_DESIGN_TIME 25 | enum { IDD = IDD_ABOUTBOX }; 26 | #endif 27 | 28 | protected: 29 | virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 30 | 31 | // 实现 32 | protected: 33 | DECLARE_MESSAGE_MAP() 34 | }; 35 | 36 | CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX) 37 | { 38 | } 39 | 40 | void CAboutDlg::DoDataExchange(CDataExchange* pDX) 41 | { 42 | CDialogEx::DoDataExchange(pDX); 43 | } 44 | 45 | BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) 46 | END_MESSAGE_MAP() 47 | 48 | 49 | // CDrawingSystemDlg 对话框 50 | 51 | 52 | 53 | CDrawingSystemDlg::CDrawingSystemDlg(CWnd* pParent /*=nullptr*/) 54 | : CDialogEx(IDD_DRAWINGSYSTEM_DIALOG, pParent) 55 | , LineWidth(0) 56 | , m_LineType(0) 57 | , m_text(_T("")) 58 | { 59 | m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 60 | } 61 | 62 | void CDrawingSystemDlg::DoDataExchange(CDataExchange* pDX) 63 | { 64 | CDialogEx::DoDataExchange(pDX); 65 | DDX_Text(pDX, IDC_EDIT1, LineWidth); 66 | DDV_MinMaxInt(pDX, LineWidth, 0, 20); 67 | DDX_Radio(pDX, IDC_RADIO1, m_LineType); 68 | DDX_Control(pDX, IDC_COMBO1, m_fill); 69 | DDX_Control(pDX, IDC_COMBO2, m_Mode); 70 | DDX_Text(pDX, IDC_EDIT2, m_text); 71 | } 72 | 73 | BEGIN_MESSAGE_MAP(CDrawingSystemDlg, CDialogEx) 74 | ON_WM_SYSCOMMAND() 75 | ON_WM_PAINT() 76 | ON_WM_QUERYDRAGICON() 77 | ON_BN_CLICKED(IDC_BUTTON1, &CDrawingSystemDlg::OnBnClickedButton1) 78 | ON_BN_CLICKED(IDC_BUTTON2, &CDrawingSystemDlg::OnBnClickedButton2) 79 | ON_EN_CHANGE(IDC_EDIT1, &CDrawingSystemDlg::OnEnChangeEdit1) 80 | ON_BN_CLICKED(IDC_RADIO1, &CDrawingSystemDlg::OnBnClickedRadio1) 81 | ON_BN_CLICKED(IDC_RADIO2, &CDrawingSystemDlg::OnBnClickedRadio2) 82 | ON_CBN_SELCHANGE(IDC_COMBO1, &CDrawingSystemDlg::OnCbnSelchangeCombo1) 83 | ON_WM_LBUTTONDOWN() 84 | ON_WM_LBUTTONUP() 85 | ON_CBN_SELCHANGE(IDC_COMBO2, &CDrawingSystemDlg::OnCbnSelchangeCombo2) 86 | ON_BN_CLICKED(IDC_BUTTON3, &CDrawingSystemDlg::OnBnClickedButton3) 87 | ON_WM_MOUSEMOVE() 88 | ON_BN_CLICKED(IDC_BUTTON4, &CDrawingSystemDlg::OnBnClickedButton4) 89 | ON_BN_CLICKED(IDC_BUTTON5, &CDrawingSystemDlg::OnBnClickedButton5) 90 | ON_BN_CLICKED(IDC_BUTTON6, &CDrawingSystemDlg::OnBnClickedButton6) 91 | END_MESSAGE_MAP() 92 | 93 | 94 | // CDrawingSystemDlg 消息处理程序 95 | 96 | BOOL CDrawingSystemDlg::OnInitDialog() 97 | { 98 | CDialogEx::OnInitDialog(); 99 | 100 | // 将“关于...”菜单项添加到系统菜单中。 101 | 102 | // IDM_ABOUTBOX 必须在系统命令范围内。 103 | ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); 104 | ASSERT(IDM_ABOUTBOX < 0xF000); 105 | 106 | CMenu* pSysMenu = GetSystemMenu(FALSE); 107 | if (pSysMenu != nullptr) 108 | { 109 | BOOL bNameValid; 110 | CString strAboutMenu; 111 | bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); 112 | ASSERT(bNameValid); 113 | if (!strAboutMenu.IsEmpty()) 114 | { 115 | pSysMenu->AppendMenu(MF_SEPARATOR); 116 | pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); 117 | } 118 | } 119 | 120 | // 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动 121 | // 执行此操作 122 | SetIcon(m_hIcon, TRUE); // 设置大图标 123 | SetIcon(m_hIcon, FALSE); // 设置小图标 124 | 125 | // TODO: 在此添加额外的初始化代码 126 | 127 | LineColor = RGB(0, 0, 255); 128 | ShapeColor = RGB(255, 0, 0); 129 | 130 | LineWidth = 5; 131 | 132 | m_fill.AddString(TEXT("有填充")); 133 | m_fill.AddString(TEXT("无填充")); 134 | m_fill.SetCurSel(1); 135 | 136 | m_Mode.AddString(TEXT("画点")); 137 | m_Mode.AddString(TEXT("画线")); 138 | m_Mode.AddString(TEXT("画椭圆")); 139 | m_Mode.AddString(TEXT("画矩形")); 140 | m_Mode.AddString(TEXT("自由绘制")); 141 | m_Mode.SetCurSel(1); 142 | 143 | UpdateData(FALSE); 144 | 145 | Mode = LineMode; 146 | 147 | startdrawing = false; 148 | 149 | return TRUE; // 除非将焦点设置到控件,否则返回 TRUE 150 | } 151 | 152 | void CDrawingSystemDlg::OnSysCommand(UINT nID, LPARAM lParam) 153 | { 154 | if ((nID & 0xFFF0) == IDM_ABOUTBOX) 155 | { 156 | CAboutDlg dlgAbout; 157 | dlgAbout.DoModal(); 158 | } 159 | else 160 | { 161 | CDialogEx::OnSysCommand(nID, lParam); 162 | } 163 | } 164 | 165 | // 如果向对话框添加最小化按钮,则需要下面的代码 166 | // 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序, 167 | // 这将由框架自动完成。 168 | 169 | void CDrawingSystemDlg::OnPaint() 170 | { 171 | if (IsIconic()) 172 | { 173 | CPaintDC dc(this); // 用于绘制的设备上下文 174 | 175 | SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0); 176 | 177 | // 使图标在工作区矩形中居中 178 | int cxIcon = GetSystemMetrics(SM_CXICON); 179 | int cyIcon = GetSystemMetrics(SM_CYICON); 180 | CRect rect; 181 | GetClientRect(&rect); 182 | int x = (rect.Width() - cxIcon + 1) / 2; 183 | int y = (rect.Height() - cyIcon + 1) / 2; 184 | 185 | // 绘制图标 186 | dc.DrawIcon(x, y, m_hIcon); 187 | } 188 | else 189 | { 190 | //CPaintDC dc(this); // 用于绘制的设备上下文 191 | //dc.SetPixel(50, 50, RGB(255, 0, 0)); 192 | CDialogEx::OnPaint(); 193 | } 194 | } 195 | 196 | //当用户拖动最小化窗口时系统调用此函数取得光标 197 | //显示。 198 | HCURSOR CDrawingSystemDlg::OnQueryDragIcon() 199 | { 200 | return static_cast(m_hIcon); 201 | } 202 | 203 | 204 | 205 | void CDrawingSystemDlg::OnBnClickedButton1() 206 | { 207 | // TODO: 在此添加控件通知处理程序代码 208 | 209 | CColorDialog colorDlg(LineColor); // 构造对话框,传入初始颜色值 210 | if (IDOK == colorDlg.DoModal()) // 显示对话框并判断是否点击“确定” 211 | { 212 | LineColor = colorDlg.GetColor(); // 获取颜色对话框中选择的颜色值 213 | 214 | } 215 | 216 | } 217 | 218 | 219 | void CDrawingSystemDlg::OnBnClickedButton2() 220 | { 221 | // TODO: 在此添加控件通知处理程序代码 222 | CColorDialog colorDlg(ShapeColor); // 构造对话框,传入初始颜色值 223 | if (IDOK == colorDlg.DoModal()) // 显示对话框并判断是否点击“确定” 224 | { 225 | ShapeColor = colorDlg.GetColor(); // 获取颜色对话框中选择的颜色值 226 | 227 | } 228 | } 229 | 230 | 231 | void CDrawingSystemDlg::OnEnChangeEdit1() 232 | { 233 | // TODO: 如果该控件是 RICHEDIT 控件,它将不 234 | // 发送此通知,除非重写 CDialogEx::OnInitDialog() 235 | // 函数并调用 CRichEditCtrl().SetEventMask(), 236 | // 同时将 ENM_CHANGE 标志“或”运算到掩码中。 237 | 238 | // TODO: 在此添加控件通知处理程序代码 239 | UpdateData(TRUE); 240 | //CString str; 241 | //str.Format(TEXT("%d"), LineWidth); 242 | //MessageBox(str); 243 | } 244 | 245 | 246 | void CDrawingSystemDlg::OnBnClickedRadio1() 247 | { 248 | // TODO: 在此添加控件通知处理程序代码 249 | LineType = false; 250 | } 251 | 252 | 253 | void CDrawingSystemDlg::OnBnClickedRadio2() 254 | { 255 | // TODO: 在此添加控件通知处理程序代码 256 | LineType = true; 257 | } 258 | 259 | 260 | void CDrawingSystemDlg::OnCbnSelchangeCombo1() 261 | { 262 | // TODO: 在此添加控件通知处理程序代码 263 | int index = m_fill.GetCurSel(); 264 | 265 | if(index == 0) isfilled = true; 266 | else isfilled = false; 267 | 268 | //CString str; 269 | //str.Format(TEXT("%d"), index); 270 | //MessageBox(str); 271 | } 272 | 273 | 274 | void CDrawingSystemDlg::OnLButtonDown(UINT nFlags, CPoint point) 275 | { 276 | // TODO: 在此添加消息处理程序代码和/或调用默认值 277 | 278 | 279 | 280 | DownPoint = point; 281 | 282 | if (Mode == PointMode) 283 | { 284 | CClientDC dc(this); // 用于绘制的设备上下文 285 | dc.SetPixel(point.x, point.y, LineColor); 286 | } 287 | else if (Mode == OwnerDrawingMode) 288 | { 289 | startdrawing = true; 290 | lastpoint = point; 291 | } 292 | else if (Mode == TextMode) 293 | { 294 | CClientDC dc(this); // 用于绘制的设备上下文 295 | dc.TextOut(point.x, point.y, m_text); 296 | OnCbnSelchangeCombo2(); //切换回原来的模式 297 | } 298 | 299 | OnCbnSelchangeCombo2(); //切换回原来的模式 300 | 301 | CDialogEx::OnLButtonDown(nFlags, point); 302 | } 303 | 304 | 305 | void CDrawingSystemDlg::OnLButtonUp(UINT nFlags, CPoint point) 306 | { 307 | // TODO: 在此添加消息处理程序代码和/或调用默认值 308 | 309 | UpPoint = point; 310 | 311 | switch (Mode) 312 | { 313 | case LineMode: 314 | DrawLine(); 315 | break; 316 | case EllipseMode: 317 | DrawEllipse(); 318 | break; 319 | case RectangleMode: 320 | DrawRectangle(); 321 | break; 322 | case OwnerDrawingMode: 323 | startdrawing = false; 324 | break; 325 | default: 326 | ; 327 | } 328 | 329 | CDialogEx::OnLButtonUp(nFlags, point); 330 | } 331 | 332 | void CDrawingSystemDlg::DrawLine() 333 | { 334 | CClientDC dc(this); // 用于绘制的设备上下文 335 | 336 | // 创建红色的画笔 337 | CPen pen(LineType, LineWidth, LineColor); 338 | 339 | // 选择画笔到设备上下文 340 | CPen* pOldPen = dc.SelectObject(&pen); 341 | 342 | // 绘制直线 343 | dc.MoveTo(DownPoint.x, DownPoint.y); // 起始点坐标 344 | dc.LineTo(UpPoint.x, UpPoint.y); // 终点坐标 345 | 346 | // 恢复原始的画笔 347 | dc.SelectObject(pOldPen); 348 | } 349 | 350 | void CDrawingSystemDlg::DrawEllipse() 351 | { 352 | CClientDC dc(this); // 用于绘制的设备上下文 353 | 354 | // 创建红色的轮廓画笔 355 | CPen outlinePen(LineType, LineWidth, LineColor); 356 | 357 | // 选择轮廓画笔到设备上下文 358 | CPen* pOldPen = dc.SelectObject(&outlinePen); 359 | CBrush* pOldBrush; 360 | 361 | // 创建蓝色的填充画刷 362 | CBrush fillBrush(ShapeColor); 363 | // 创建透明的画刷 364 | CBrush transparentBrush; 365 | transparentBrush.CreateStockObject(NULL_BRUSH); 366 | 367 | if (isfilled) 368 | { 369 | // 选择填充画刷到设备上下文 370 | pOldBrush = dc.SelectObject(&fillBrush); 371 | } 372 | else 373 | { 374 | // 选择透明画刷到设备上下文 375 | pOldBrush = dc.SelectObject(&transparentBrush); 376 | } 377 | 378 | 379 | // 绘制椭圆,左上角和右下角的矩形坐标确定椭圆的边界 380 | dc.Ellipse(DownPoint.x, DownPoint.y, UpPoint.x, UpPoint.y); 381 | 382 | // 恢复原始的画笔和画刷 383 | dc.SelectObject(pOldPen); 384 | dc.SelectObject(pOldBrush); 385 | } 386 | 387 | 388 | void CDrawingSystemDlg::OnCbnSelchangeCombo2() 389 | { 390 | // TODO: 在此添加控件通知处理程序代码 391 | int index = m_Mode.GetCurSel(); 392 | 393 | if (index == 0) Mode = PointMode; 394 | else if(index == 1) Mode = LineMode; 395 | else if (index == 2) Mode = EllipseMode; 396 | else if (index == 3) Mode = RectangleMode; 397 | else if (index == 4) Mode = OwnerDrawingMode; 398 | else Mode = LineMode; 399 | } 400 | 401 | void CDrawingSystemDlg::DrawRectangle() 402 | { 403 | CClientDC dc(this); // 用于绘制的设备上下文 404 | 405 | // 创建红色的轮廓画笔 406 | CPen outlinePen(LineType, LineWidth, LineColor); 407 | 408 | // 选择轮廓画笔到设备上下文 409 | CPen* pOldPen = dc.SelectObject(&outlinePen); 410 | CBrush* pOldBrush; 411 | 412 | // 创建蓝色的填充画刷 413 | CBrush fillBrush(ShapeColor); 414 | // 创建透明的画刷 415 | CBrush transparentBrush; 416 | transparentBrush.CreateStockObject(NULL_BRUSH); 417 | 418 | if (isfilled) 419 | { 420 | // 选择填充画刷到设备上下文 421 | pOldBrush = dc.SelectObject(&fillBrush); 422 | } 423 | else 424 | { 425 | // 选择透明画刷到设备上下文 426 | pOldBrush = dc.SelectObject(&transparentBrush); 427 | } 428 | 429 | 430 | // 绘制矩形 431 | dc.Rectangle(DownPoint.x, DownPoint.y, UpPoint.x, UpPoint.y); 432 | 433 | // 恢复原始的画笔和画刷 434 | dc.SelectObject(pOldPen); 435 | dc.SelectObject(pOldBrush); 436 | } 437 | 438 | 439 | 440 | void CDrawingSystemDlg::OnBnClickedButton3() 441 | { 442 | // TODO: 在此添加控件通知处理程序代码 443 | 444 | // 调用Invalidate函数来清空绘图内容并触发重绘 445 | Invalidate(); 446 | } 447 | 448 | 449 | 450 | void CDrawingSystemDlg::OnMouseMove(UINT nFlags, CPoint point) 451 | { 452 | // TODO: 在此添加消息处理程序代码和/或调用默认值 453 | 454 | if (Mode == OwnerDrawingMode && startdrawing) 455 | { 456 | //point:当前时刻的点(直线的终点) 457 | //lastpoint:上一时刻的点(直线的起点) 458 | 459 | CClientDC dc(this); // 用于绘制的设备上下文 460 | 461 | // 创建红色的画笔 462 | CPen pen(LineType, LineWidth, LineColor); 463 | 464 | // 选择画笔到设备上下文 465 | CPen* pOldPen = dc.SelectObject(&pen); 466 | 467 | // 绘制直线 468 | dc.MoveTo(lastpoint.x, lastpoint.y); // 起始点坐标 469 | dc.LineTo(point.x, point.y); // 终点坐标 470 | 471 | // 恢复原始的画笔 472 | dc.SelectObject(pOldPen); 473 | 474 | lastpoint = point; //画完以后,当前时刻的起点就会变为下一时刻的终点 475 | } 476 | CDialogEx::OnMouseMove(nFlags, point); 477 | } 478 | 479 | 480 | void CDrawingSystemDlg::OnBnClickedButton4() 481 | { 482 | // TODO: 在此添加控件通知处理程序代码 483 | Mode = TextMode; 484 | UpdateData(TRUE); 485 | MessageBox(TEXT("请左键点击对话框选择插入文字的位置"), TEXT("提示")); 486 | 487 | } 488 | 489 | 490 | void CDrawingSystemDlg::OnBnClickedButton5() 491 | { 492 | // TODO: 在此添加控件通知处理程序代码 493 | 494 | Mode = ImageMode; 495 | 496 | // TODO: Add your control notification handler code here 497 | // 设置过滤器 498 | TCHAR szFilter[] = _T("图片(*.png)|*.png|所有文件(*.*)|*.*||"); 499 | // 构造打开文件对话框 500 | CFileDialog fileDlg(TRUE, _T("png"), NULL, 0, szFilter, this); 501 | CString strFilePath; 502 | 503 | // 显示打开文件对话框 504 | if (IDOK == fileDlg.DoModal()) 505 | { 506 | // 如果点击了文件对话框上的“打开”按钮,则将选择的文件路径显示到编辑框里 507 | strFilePath = fileDlg.GetPathName(); 508 | 509 | CClientDC dc(this); // 用于绘制的设备上下文 510 | CRect rect; 511 | GetClientRect(&rect); 512 | CImage image; 513 | image.Load(strFilePath); 514 | image.BitBlt(dc, 0, 0, rect.Width(), rect.Height(), 0, 0); 515 | image.Destroy(); //没有Destroy()会有内存泄漏。Detach();不行的。 516 | } 517 | 518 | } 519 | 520 | 521 | void CDrawingSystemDlg::OnBnClickedButton6() 522 | { 523 | // TODO: 在此添加控件通知处理程序代码 524 | CClientDC dc(this); 525 | CRect rect; 526 | BOOL showMsgTag; //是否要弹出”图像保存成功对话框" 527 | GetClientRect(&rect); //获取画布大小 528 | HBITMAP hbitmap = CreateCompatibleBitmap(dc, rect.right - rect.left, rect.bottom - rect.top); 529 | 530 | //创建兼容位图 531 | HDC hdc = CreateCompatibleDC(dc); //创建兼容DC,以便将图像保存为不同的格式 532 | HBITMAP hOldMap = (HBITMAP)SelectObject(hdc, hbitmap); 533 | //将位图选入DC,并保存返回值 534 | BitBlt(hdc, 0, 0, rect.right - rect.left, rect.bottom - rect.top, dc, 0, 0, SRCCOPY); 535 | //将屏幕DC的图像复制到内存DC中 536 | CImage image; 537 | image.Attach(hbitmap); //将位图转化为一般图像 538 | 539 | showMsgTag = TRUE; 540 | CString strFilter = _T("位图文件(*.bmp)|*.bmp|JPEG 图像文件|*.jpg|GIF图像文件 | *.gif | PNG图像文件 | *.png |其他格式(*.*) | *.* || "); 541 | CFileDialog dlg(FALSE, _T("bmp"), _T("iPaint1.bmp"), NULL, strFilter); 542 | if (dlg.DoModal() != IDOK) 543 | return; 544 | 545 | CString strFileName; //如果用户没有指定文件扩展名,则为其添加一个 546 | CString strExtension; 547 | strFileName = dlg.m_ofn.lpstrFile; 548 | if (dlg.m_ofn.nFileExtension == 0) //扩展名项目为0 549 | { 550 | switch (dlg.m_ofn.nFilterIndex) 551 | { 552 | case 1: 553 | strExtension = "bmp"; break; 554 | case 2: 555 | strExtension = "jpg"; break; 556 | case 3: 557 | strExtension = "gif"; break; 558 | case 4: 559 | strExtension = "png"; break; 560 | default: 561 | break; 562 | } 563 | strFileName = strFileName + "." + strExtension; 564 | } 565 | 566 | CString saveFilePath = strFileName; //saveFilePath为视类中的全局变量,类型为CString 567 | 568 | HRESULT hResult = image.Save(saveFilePath); //保存图像 569 | if (FAILED(hResult)) 570 | { 571 | MessageBox(_T("保存图像文件失败!")); 572 | } 573 | else 574 | { 575 | if (showMsgTag) 576 | MessageBox(_T("文件保存成功!")); 577 | 578 | } 579 | image.Detach(); 580 | SelectObject(hdc, hOldMap); 581 | } 582 | -------------------------------------------------------------------------------- /DrawingSystem/DrawingSystemDlg.h: -------------------------------------------------------------------------------- 1 |  2 | // DrawingSystemDlg.h: 头文件 3 | // 4 | 5 | #pragma once 6 | 7 | enum DrawingMode 8 | { 9 | PointMode, 10 | LineMode, 11 | EllipseMode, 12 | RectangleMode, 13 | OwnerDrawingMode, 14 | TextMode, 15 | ImageMode 16 | }; 17 | 18 | // CDrawingSystemDlg 对话框 19 | class CDrawingSystemDlg : public CDialogEx 20 | { 21 | // 构造 22 | public: 23 | CDrawingSystemDlg(CWnd* pParent = nullptr); // 标准构造函数 24 | 25 | // 对话框数据 26 | #ifdef AFX_DESIGN_TIME 27 | enum { IDD = IDD_DRAWINGSYSTEM_DIALOG }; 28 | #endif 29 | 30 | protected: 31 | virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 32 | 33 | 34 | // 实现 35 | protected: 36 | HICON m_hIcon; 37 | 38 | // 生成的消息映射函数 39 | virtual BOOL OnInitDialog(); 40 | afx_msg void OnSysCommand(UINT nID, LPARAM lParam); 41 | afx_msg void OnPaint(); 42 | afx_msg HCURSOR OnQueryDragIcon(); 43 | DECLARE_MESSAGE_MAP() 44 | 45 | COLORREF LineColor; 46 | COLORREF ShapeColor; 47 | 48 | bool LineType; //false:实线 true:虚线 49 | bool isfilled; //false:无填充 true:有填充 50 | public: 51 | afx_msg void OnBnClickedButton1(); 52 | afx_msg void OnBnClickedButton2(); 53 | int LineWidth; 54 | afx_msg void OnEnChangeEdit1(); 55 | int m_LineType; 56 | afx_msg void OnBnClickedRadio1(); 57 | afx_msg void OnBnClickedRadio2(); 58 | CComboBox m_fill; 59 | afx_msg void OnCbnSelchangeCombo1(); 60 | afx_msg void OnLButtonDown(UINT nFlags, CPoint point); 61 | 62 | CPoint DownPoint; //鼠标左键按下时候的点 63 | CPoint UpPoint; //鼠标左键松开时候的点 64 | afx_msg void OnLButtonUp(UINT nFlags, CPoint point); 65 | 66 | int Mode; 67 | void DrawLine(); 68 | void DrawEllipse(); 69 | CComboBox m_Mode; 70 | afx_msg void OnCbnSelchangeCombo2(); 71 | 72 | void DrawRectangle(); 73 | afx_msg void OnBnClickedButton3(); 74 | afx_msg void OnMouseMove(UINT nFlags, CPoint point); 75 | 76 | bool startdrawing; 77 | CPoint lastpoint; 78 | CString m_text; 79 | afx_msg void OnBnClickedButton4(); 80 | afx_msg void OnBnClickedButton5(); 81 | afx_msg void OnBnClickedButton6(); 82 | }; 83 | -------------------------------------------------------------------------------- /DrawingSystem/framework.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #ifndef VC_EXTRALEAN 4 | #define VC_EXTRALEAN // 从 Windows 头中排除极少使用的资料 5 | #endif 6 | 7 | #include "targetver.h" 8 | 9 | #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // 某些 CString 构造函数将是显式的 10 | 11 | // 关闭 MFC 的一些常见且经常可放心忽略的隐藏警告消息 12 | #define _AFX_ALL_WARNINGS 13 | 14 | #include // MFC 核心组件和标准组件 15 | #include // MFC 扩展 16 | 17 | 18 | #include // MFC 自动化类 19 | 20 | 21 | 22 | #ifndef _AFX_NO_OLE_SUPPORT 23 | #include // MFC 对 Internet Explorer 4 公共控件的支持 24 | #endif 25 | #ifndef _AFX_NO_AFXCMN_SUPPORT 26 | #include // MFC 对 Windows 公共控件的支持 27 | #endif // _AFX_NO_AFXCMN_SUPPORT 28 | 29 | #include // MFC 支持功能区和控制条 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | #ifdef _UNICODE 40 | #if defined _M_IX86 41 | #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"") 42 | #elif defined _M_X64 43 | #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"") 44 | #else 45 | #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") 46 | #endif 47 | #endif 48 | 49 | 50 | -------------------------------------------------------------------------------- /DrawingSystem/pch.cpp: -------------------------------------------------------------------------------- 1 | // pch.cpp: 与预编译标头对应的源文件 2 | 3 | #include "pch.h" 4 | 5 | // 当使用预编译的头时,需要使用此源文件,编译才能成功。 6 | -------------------------------------------------------------------------------- /DrawingSystem/pch.h: -------------------------------------------------------------------------------- 1 | // pch.h: 这是预编译标头文件。 2 | // 下方列出的文件仅编译一次,提高了将来生成的生成性能。 3 | // 这还将影响 IntelliSense 性能,包括代码完成和许多代码浏览功能。 4 | // 但是,如果此处列出的文件中的任何一个在生成之间有更新,它们全部都将被重新编译。 5 | // 请勿在此处添加要频繁更新的文件,这将使得性能优势无效。 6 | 7 | #ifndef PCH_H 8 | #define PCH_H 9 | 10 | // 添加要在此处预编译的标头 11 | #include "framework.h" 12 | 13 | #endif //PCH_H 14 | -------------------------------------------------------------------------------- /DrawingSystem/res/DrawingSystem.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mouseminar/MFC-DrawingSystem/0daadb69e37a4ce533f321b3b36f1300b682c1f2/DrawingSystem/res/DrawingSystem.ico -------------------------------------------------------------------------------- /DrawingSystem/res/DrawingSystem.rc2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mouseminar/MFC-DrawingSystem/0daadb69e37a4ce533f321b3b36f1300b682c1f2/DrawingSystem/res/DrawingSystem.rc2 -------------------------------------------------------------------------------- /DrawingSystem/res/lena.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mouseminar/MFC-DrawingSystem/0daadb69e37a4ce533f321b3b36f1300b682c1f2/DrawingSystem/res/lena.png -------------------------------------------------------------------------------- /DrawingSystem/res/照片.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mouseminar/MFC-DrawingSystem/0daadb69e37a4ce533f321b3b36f1300b682c1f2/DrawingSystem/res/照片.png -------------------------------------------------------------------------------- /DrawingSystem/resource.h: -------------------------------------------------------------------------------- 1 | //{{NO_DEPENDENCIES}} 2 | // Microsoft Visual C++ 生成的包含文件。 3 | // 供 DrawingSystem.rc 使用 4 | // 5 | #define IDM_ABOUTBOX 0x0010 6 | #define IDD_ABOUTBOX 100 7 | #define IDS_ABOUTBOX 101 8 | #define IDD_DRAWINGSYSTEM_DIALOG 102 9 | #define IDR_MAINFRAME 128 10 | #define IDC_BUTTON1 1000 11 | #define IDC_BUTTON2 1001 12 | #define IDC_EDIT1 1002 13 | #define IDC_RADIO1 1003 14 | #define IDC_RADIO2 1004 15 | #define IDC_COMBO1 1005 16 | #define IDC_COMBO2 1006 17 | #define IDC_BUTTON3 1007 18 | #define IDC_EDIT2 1010 19 | #define IDC_BUTTON4 1011 20 | #define IDC_BUTTON5 1012 21 | #define IDC_BUTTON6 1013 22 | 23 | // Next default values for new objects 24 | // 25 | #ifdef APSTUDIO_INVOKED 26 | #ifndef APSTUDIO_READONLY_SYMBOLS 27 | #define _APS_NEXT_RESOURCE_VALUE 130 28 | #define _APS_NEXT_COMMAND_VALUE 32771 29 | #define _APS_NEXT_CONTROL_VALUE 1008 30 | #define _APS_NEXT_SYMED_VALUE 101 31 | #endif 32 | #endif 33 | -------------------------------------------------------------------------------- /DrawingSystem/targetver.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | // 包括 SDKDDKVer.h 将定义可用的最高版本的 Windows 平台。 4 | 5 | //如果要为以前的 Windows 平台生成应用程序,请包括 WinSDKVer.h,并 6 | // 将 _WIN32_WINNT 宏设置为要支持的平台,然后再包括 SDKDDKVer.h。 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MFC-DrawingSystem 2 | MFC简单绘图系统分享,可以绘制基本图形,画笔自由绘制,绘制文字,插入图片,保存图片等 3 | 4 | 观看完整的开发视频:https://www.bilibili.com/video/BV1Dp4y1E7Wd/?spm_id_from=333.999.0.0&vd_source=07c44be34f0e73ec66347ccd7aa3908e 5 | --------------------------------------------------------------------------------