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
以台北為例(其餘兩個請比照辦理)
以下是地名對應的控制項識別碼與變數名稱
萬華:IDC_CHECK_Wanhua , m_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_Luzhu , m_Luzhu
以及相應變數請依序添加8個
示範第一個萬華的作法
雙擊確定按鈕進行事件程式撰寫
第一版本.僅單純串複選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 台北,基隆 以及桃園各自都用雙擊進行相應程式撰寫
(可發現重複段出現)
優化上一版程式將其重構
到header檔案進行程式函數的原型宣告
再回到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 | 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程式
完整CPP程式
完整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);//蘆竹->桃園 } |
留言
張貼留言