├── 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 |
--------------------------------------------------------------------------------