MFC教材筆記整理_part01_基礎控制項Static Text,Edit Control,Button,彈跳視窗
Lab1.加總計算機
在vs2019 新增專案
選MFC應用程式
IDD_MFCAPPLICATION1_DIALOG 點選後即可顯示出視窗介面
可將預設的label,button三個控制項都刪除(選取按delete即可)
其中Static Text就是單純顯示文字內容的Label可以在標題進行文字內容設定
對齊的處理方式
可以複選三個 Static Text
滑鼠左鍵拖拉複選
請記得設置後續程式存取有需用到!
還有多拖拉一個按鈕 IDC_BUTTON1
先CTRL按著不放先選
可直接雙擊按鈕會自動註冊產生一個按鈕事件區塊
針對輸入框右鍵添加相應變數
這邊我們不是控制項操作而是數值類的存取
比照第一個的同樣步驟 ,變數名稱改為m_add2
第三個總和相應輸入框進行變數綁定及定義設置
比照第一個的同樣步驟 ,變數名稱改為m_sum
完善按鈕事件中的程式碼
完整程式碼\MFCApplication1\MFCApplication1Dlg.h
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 | // MFCApplication1Dlg.h: 標頭檔 // #pragma once // CMFCApplication1Dlg 對話方塊 class CMFCApplication1Dlg : public CDialogEx { // 建構 public: CMFCApplication1Dlg(CWnd* pParent = nullptr); // 標準建構函式 // 對話方塊資料 #ifdef AFX_DESIGN_TIME enum { IDD = IDD_MFCAPPLICATION1_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 OnEnChangeEditAdd2(); afx_msg void OnBnClickedButton1(); INT m_add1; INT m_add2; INT m_sum; }; |
\MFCApplication1\MFCApplication1Dlg.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 | // MFCApplication1Dlg.cpp: 實作檔案 // #include "pch.h" #include "framework.h" #include "MFCApplication1.h" #include "MFCApplication1Dlg.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() // CMFCApplication1Dlg 對話方塊 CMFCApplication1Dlg::CMFCApplication1Dlg(CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_MFCAPPLICATION1_DIALOG, pParent) , m_add1(0) , m_add2(0) , m_sum(0) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CMFCApplication1Dlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT_ADD1, m_add1); DDX_Text(pDX, IDC_EDIT_ADD2, m_add2); DDX_Text(pDX, IDC_EDIT_Total, m_sum); } BEGIN_MESSAGE_MAP(CMFCApplication1Dlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON1, &CMFCApplication1Dlg::OnBnClickedButton1) END_MESSAGE_MAP() // CMFCApplication1Dlg 訊息處理常式 BOOL CMFCApplication1Dlg::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 CMFCApplication1Dlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); } } // 如果將最小化按鈕加入您的對話方塊,您需要下列的程式碼, // 以便繪製圖示。對於使用文件/檢視模式的 MFC 應用程式, // 框架會自動完成此作業。 void CMFCApplication1Dlg::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 CMFCApplication1Dlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } void CMFCApplication1Dlg::OnBnClickedButton1() { // TODO: 在此加入控制項告知處理常式程式碼 //Step1.將控制項中輸入的內容更新存入到指定的變數中 UpdateData(true); //Step2.計算 m_sum = m_add1 + m_add2; //Step3.將變數值更新回控制項中進行顯示 UpdateData(false); } |
運行效果
在UI操作上通常會須有一些警示或是彈跳視窗回饋
計算按鈕的局部程式(添加確認彈跳視窗回饋接收防呆)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | void CMFCApplication1Dlg::OnBnClickedButton1() { // TODO: 在此加入控制項告知處理常式程式碼 int ret = MessageBox(_T("你確定要進行運算嗎?"), _T("加總計算"), MB_OKCANCEL | MB_ICONHAND); if (ret == IDCANCEL) { return; } //Step1.將控制項中輸入的內容更新存入到指定的變數中 UpdateData(true); //Step2.計算 m_sum = m_add1 + m_add2; //Step3.將變數值更新回控制項中進行顯示 UpdateData(false); } |
補充MFC參考資源
https://slideplayer.com/slide/5158623/
https://slidesplayer.com/slide/14636277/
https://www.tutorialspoint.com/mfc/mfc_dialog_boxes.htm
留言
張貼留言