MFC教材筆記整理_part02_基礎控制項_GroupBox以及RadioButton,CheckBox使用





請參考part01進行專案創建
MFC教材筆記整理_part01_基礎控制項Static Text,Edit Control,Button

RadioButton->單選
CheckBox->複選



請依序產生
以下是地名對應的控制項識別碼變數名稱
台北: IDC_RADIO_TAIPAI , m_taipai
基隆: IDC_RADIO_Keelung , m_keelung
桃園: IDC_RADIO_Taoyuan , m_taoyuan

以台北為例(其餘兩個請比照辦理)




可加一個GroupBox利於群組版面好辨識性
把按鈕移置上面


新增8個縣市下相應的checkbox,並依序命名相應涵義的識別碼(ID)
以下是地名對應的控制項識別碼變數名稱

萬華:IDC_CHECK_Wanhuam_Wanhua
內湖:IDC_CHECK_Neihu , m_Neihu
七堵:IDC_CHECK_Qidu , m_Qidu
南港:IDC_CHECK_Nangang , m_Nangang
暖暖:IDC_CHECK_Nuanuan , m_Nuanuan
大溪:IDC_CHECK_Daxi , m_Daxi
八德:IDC_CHECK_Bade , m_Bade
蘆竹:IDC_CHECK_Luzhum_Luzhu


以及相應變數請依序添加8個
示範第一個萬華的作法

命名完且沿用預設的控制項即可按完成(其他剩下7個依序一致作法)

雙擊確定按鈕進行事件程式撰寫
第一版本.僅單純串複選checkbox選中後對應的資訊串接顯現至輸入文本框中
尚未跟radio button有邏輯串聯

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
void CMFCApplication2Dlg::OnBnClickedButton1()
{
	// TODO: 在此加入控制項告知處理常式程式碼
	CString strRegion;
	if (m_Wanhua.GetCheck() == 1) {
		strRegion += "萬華 ";
	}
	if (m_Neihu.GetCheck() == 1) {
		strRegion += "內湖 ";
	}
	if (m_Qidu.GetCheck() == 1) {
		strRegion += "七堵 ";
	}
	if (m_Nangang.GetCheck() == 1) {
		strRegion += "南港 ";
	}
	if (m_Nuanuan.GetCheck() == 1) {
		strRegion += "暖暖 ";
	}
	if (m_Daxi.GetCheck() == 1) {
		strRegion += "大溪 ";
	}
	if (m_Bade.GetCheck() == 1) {
		strRegion += "八德 ";
	}
	if (m_Luzhu.GetCheck() == 1) {
		strRegion += "蘆竹 ";
	}

	//將選中的地區顯示至UI輸入框中
	SetDlgItemText(IDC_EDIT_CITY, strRegion);


}

在part01中用的是夾UpdateData(true);跟UpdateData(false);的寫法
這邊改透過SetDlgItemText來實踐,介紹另種方式的UI存取。


針對各自三個RadioButton 台北,基隆 以及桃園各自都用雙擊進行相應程式撰寫
(可發現重複段出現)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
void CMFCApplication2Dlg::OnBnClickedRadioTaipai()
{
	// TODO: 在此加入控制項告知處理常式程式碼
	m_Wanhua.EnableWindow(false);//萬華->台北
	m_Neihu.EnableWindow(false);//內湖->台北
	m_Nangang.EnableWindow(false);//南港->台北
	m_Qidu.EnableWindow(false);//七堵->基隆
	m_Nuanuan.EnableWindow(false);//暖暖->基隆
	m_Daxi.EnableWindow(false);//大溪->桃園
	m_Bade.EnableWindow(false);//八德->桃園
	m_Luzhu.EnableWindow(false);//蘆竹->桃園

	m_Wanhua.SetCheck(0);//萬華
	m_Neihu.SetCheck(0);//內湖
	m_Nangang.SetCheck(0);//南港
	m_Qidu.SetCheck(0);//七堵
	m_Nuanuan.SetCheck(0);//暖暖
	m_Daxi.SetCheck(0);//大溪
	m_Bade.SetCheck(0);//八德
	m_Luzhu.SetCheck(0);//蘆竹

	//當選中台北時可以選的地區有 萬華 , 內湖 , 南港
	m_Wanhua.EnableWindow(true);//萬華->台北
	m_Neihu.EnableWindow(true);//內湖->台北
	m_Nangang.EnableWindow(true);//南港->台北
}


void CMFCApplication2Dlg::OnBnClickedRadioKeelung()
{
	// TODO: 在此加入控制項告知處理常式程式碼
	m_Wanhua.EnableWindow(false);//萬華->台北
	m_Neihu.EnableWindow(false);//內湖->台北
	m_Nangang.EnableWindow(false);//南港->台北
	m_Qidu.EnableWindow(false);//七堵->基隆
	m_Nuanuan.EnableWindow(false);//暖暖->基隆
	m_Daxi.EnableWindow(false);//大溪->桃園
	m_Bade.EnableWindow(false);//八德->桃園
	m_Luzhu.EnableWindow(false);//蘆竹->桃園

	m_Wanhua.SetCheck(0);//萬華
	m_Neihu.SetCheck(0);//內湖
	m_Nangang.SetCheck(0);//南港
	m_Qidu.SetCheck(0);//七堵
	m_Nuanuan.SetCheck(0);//暖暖
	m_Daxi.SetCheck(0);//大溪
	m_Bade.SetCheck(0);//八德
	m_Luzhu.SetCheck(0);//蘆竹

	//當選中基隆時可以選的地區有 七堵 , 暖暖 
	m_Qidu.EnableWindow(true);//七堵->基隆
	m_Nuanuan.EnableWindow(true);//暖暖->基隆
}


void CMFCApplication2Dlg::OnBnClickedRadioTaoyuan()
{
	// TODO: 在此加入控制項告知處理常式程式碼
	m_Wanhua.EnableWindow(false);//萬華->台北
	m_Neihu.EnableWindow(false);//內湖->台北
	m_Nangang.EnableWindow(false);//南港->台北
	m_Qidu.EnableWindow(false);//七堵->基隆
	m_Nuanuan.EnableWindow(false);//暖暖->基隆
	m_Daxi.EnableWindow(false);//大溪->桃園
	m_Bade.EnableWindow(false);//八德->桃園
	m_Luzhu.EnableWindow(false);//蘆竹->桃園

	m_Wanhua.SetCheck(0);//萬華
	m_Neihu.SetCheck(0);//內湖
	m_Nangang.SetCheck(0);//南港
	m_Qidu.SetCheck(0);//七堵
	m_Nuanuan.SetCheck(0);//暖暖
	m_Daxi.SetCheck(0);//大溪
	m_Bade.SetCheck(0);//八德
	m_Luzhu.SetCheck(0);//蘆竹

	//當選中桃園時可以選的地區有 大溪 , 八德 ,蘆竹
	m_Daxi.EnableWindow(true);//大溪->桃園
	m_Bade.EnableWindow(true);//八德->桃園
	m_Luzhu.EnableWindow(true);//蘆竹->桃園

}



優化上一版程式將其重構
到header檔案進行程式函數的原型宣告
再回到CPP檔案具體實作
也就是把重複段落封裝出來一個void函數做
完整Header程式
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
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
// MFCApplication2Dlg.h: 標頭檔
//

#pragma once


// CMFCApplication2Dlg 對話方塊
class CMFCApplication2Dlg : public CDialogEx
{
// 建構
public:
	CMFCApplication2Dlg(CWnd* pParent = nullptr);	// 標準建構函式

// 對話方塊資料
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_MFCAPPLICATION2_DIALOG };
#endif

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支援


// 程式碼實作
protected:
	HICON m_hIcon;

	// 產生的訊息對應函式
	virtual BOOL OnInitDialog();
	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnBnClickedButton1();
	CButton m_Wanhua;
	CButton m_Neihu;
	CButton m_Qidu;
	CButton m_Nangang;
	CButton m_Nuanuan;
	CButton m_Daxi;
	CButton m_Bade;
	CButton m_Luzhu;
	CButton m_taipai;
	CButton m_keelung;
	CButton m_taoyuan;
	afx_msg void OnBnClickedRadioTaipai();
	afx_msg void OnBnClickedRadioKeelung();
	afx_msg void OnBnClickedRadioTaoyuan();

	void InitAllCheckBoxStatus();

};


完整CPP程式

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 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
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
// MFCApplication2Dlg.cpp: 實作檔案
//

#include "pch.h"
#include "framework.h"
#include "MFCApplication2.h"
#include "MFCApplication2Dlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// 對 App About 使用 CAboutDlg 對話方塊

class CAboutDlg : public CDialogEx
{
public:
	CAboutDlg();

	// 對話方塊資料
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_ABOUTBOX };
#endif

protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支援

// 程式碼實作
protected:
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()


// CMFCApplication2Dlg 對話方塊



CMFCApplication2Dlg::CMFCApplication2Dlg(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_MFCAPPLICATION2_DIALOG, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CMFCApplication2Dlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_CHECK_Wanhua, m_Wanhua);
	DDX_Control(pDX, IDC_CHECK_Neihu, m_Neihu);
	DDX_Control(pDX, IDC_CHECK_Qidu, m_Qidu);
	DDX_Control(pDX, IDC_CHECK_Nangang, m_Nangang);
	DDX_Control(pDX, IDC_CHECK_Nuanuan, m_Nuanuan);
	DDX_Control(pDX, IDC_CHECK_Daxi, m_Daxi);
	DDX_Control(pDX, IDC_CHECK_Bade, m_Bade);
	DDX_Control(pDX, IDC_CHECK_Luzhu, m_Luzhu);
	DDX_Control(pDX, IDC_RADIO_TAIPAI, m_taipai);
	DDX_Control(pDX, IDC_RADIO_Keelung, m_keelung);
	DDX_Control(pDX, IDC_RADIO_Taoyuan, m_taoyuan);
}

BEGIN_MESSAGE_MAP(CMFCApplication2Dlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON1, &CMFCApplication2Dlg::OnBnClickedButton1)
	ON_BN_CLICKED(IDC_RADIO_TAIPAI, &CMFCApplication2Dlg::OnBnClickedRadioTaipai)
	ON_BN_CLICKED(IDC_RADIO_Keelung, &CMFCApplication2Dlg::OnBnClickedRadioKeelung)
	ON_BN_CLICKED(IDC_RADIO_Taoyuan, &CMFCApplication2Dlg::OnBnClickedRadioTaoyuan)
END_MESSAGE_MAP()


// CMFCApplication2Dlg 訊息處理常式

BOOL CMFCApplication2Dlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 將 [關於...] 功能表加入系統功能表。

	// IDM_ABOUTBOX 必須在系統命令範圍之中。
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != nullptr)
	{
		BOOL bNameValid;
		CString strAboutMenu;
		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
		ASSERT(bNameValid);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// 設定此對話方塊的圖示。當應用程式的主視窗不是對話方塊時,
	// 框架會自動從事此作業
	SetIcon(m_hIcon, TRUE);			// 設定大圖示
	SetIcon(m_hIcon, FALSE);		// 設定小圖示

	// TODO: 在此加入額外的初始設定

	return TRUE;  // 傳回 TRUE,除非您對控制項設定焦點
}

void CMFCApplication2Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialogEx::OnSysCommand(nID, lParam);
	}
}

// 如果將最小化按鈕加入您的對話方塊,您需要下列的程式碼,
// 以便繪製圖示。對於使用文件/檢視模式的 MFC 應用程式,
// 框架會自動完成此作業。

void CMFCApplication2Dlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 繪製的裝置內容

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 將圖示置中於用戶端矩形
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// 描繪圖示
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialogEx::OnPaint();
	}
}

// 當使用者拖曳最小化視窗時,
// 系統呼叫這個功能取得游標顯示。
HCURSOR CMFCApplication2Dlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}



void CMFCApplication2Dlg::OnBnClickedButton1()
{
	// TODO: 在此加入控制項告知處理常式程式碼
	CString strRegion;
	if (m_Wanhua.GetCheck() == 1) {
		strRegion += "萬華 ";
	}
	if (m_Neihu.GetCheck() == 1) {
		strRegion += "內湖 ";
	}
	if (m_Qidu.GetCheck() == 1) {
		strRegion += "七堵 ";
	}
	if (m_Nangang.GetCheck() == 1) {
		strRegion += "南港 ";
	}
	if (m_Nuanuan.GetCheck() == 1) {
		strRegion += "暖暖 ";
	}
	if (m_Daxi.GetCheck() == 1) {
		strRegion += "大溪 ";
	}
	if (m_Bade.GetCheck() == 1) {
		strRegion += "八德 ";
	}
	if (m_Luzhu.GetCheck() == 1) {
		strRegion += "蘆竹 ";
	}

	//將選中的地區顯示至UI輸入框中
	SetDlgItemText(IDC_EDIT_CITY, strRegion);


}
void CMFCApplication2Dlg::InitAllCheckBoxStatus() {
	m_Wanhua.EnableWindow(false);//萬華->台北
	m_Neihu.EnableWindow(false);//內湖->台北
	m_Nangang.EnableWindow(false);//南港->台北
	m_Qidu.EnableWindow(false);//七堵->基隆
	m_Nuanuan.EnableWindow(false);//暖暖->基隆
	m_Daxi.EnableWindow(false);//大溪->桃園
	m_Bade.EnableWindow(false);//八德->桃園
	m_Luzhu.EnableWindow(false);//蘆竹->桃園

	m_Wanhua.SetCheck(0);//萬華
	m_Neihu.SetCheck(0);//內湖
	m_Nangang.SetCheck(0);//南港
	m_Qidu.SetCheck(0);//七堵
	m_Nuanuan.SetCheck(0);//暖暖
	m_Daxi.SetCheck(0);//大溪
	m_Bade.SetCheck(0);//八德
	m_Luzhu.SetCheck(0);//蘆竹
}

void CMFCApplication2Dlg::OnBnClickedRadioTaipai()
{
	// TODO: 在此加入控制項告知處理常式程式碼
	InitAllCheckBoxStatus();

	//當選中台北時可以選的地區有 萬華 , 內湖 , 南港
	m_Wanhua.EnableWindow(true);//萬華->台北
	m_Neihu.EnableWindow(true);//內湖->台北
	m_Nangang.EnableWindow(true);//南港->台北
}


void CMFCApplication2Dlg::OnBnClickedRadioKeelung()
{
	// TODO: 在此加入控制項告知處理常式程式碼
	InitAllCheckBoxStatus();

	//當選中基隆時可以選的地區有 七堵 , 暖暖 
	m_Qidu.EnableWindow(true);//七堵->基隆
	m_Nuanuan.EnableWindow(true);//暖暖->基隆
}


void CMFCApplication2Dlg::OnBnClickedRadioTaoyuan()
{
	// TODO: 在此加入控制項告知處理常式程式碼
	InitAllCheckBoxStatus();

	//當選中桃園時可以選的地區有 大溪 , 八德 ,蘆竹
	m_Daxi.EnableWindow(true);//大溪->桃園
	m_Bade.EnableWindow(true);//八德->桃園
	m_Luzhu.EnableWindow(true);//蘆竹->桃園

}
















留言

這個網誌中的熱門文章

經得起原始碼資安弱點掃描的程式設計習慣培養(五)_Missing HSTS Header

經得起原始碼資安弱點掃描的程式設計習慣培養(三)_7.Cross Site Scripting(XSS)_Stored XSS_Reflected XSS All Clients

(2021年度)駕訓學科筆試準備題庫歸納分析_法規是非題