MFC教材筆記整理_part01_基礎控制項Static Text,Edit Control,Button,彈跳視窗


Lab1.加總計算機
在vs2019 新增專案
選MFC應用程式

指定專案目錄位置與專案名稱





開啟後切換至資源視圖畫面
IDD_MFCAPPLICATION1_DIALOG 點選後即可顯示出視窗介面


可將預設的label,button三個控制項都刪除(選取按delete即可)


控制項這邊用到Static Text以及Edit Control皆可用拖曳至畫面方式來開發
其中Static Text就是單純顯示文字內容的Label可以在標題進行文字內容設定


對齊的處理方式
可以複選三個 Static Text
滑鼠左鍵拖拉複選


輸入框識別碼分別是:IDC_EDIT_ADD1,IDC_EDIT_ADD2,IDC_EDIT_Total
請記得設置後續程式存取有需用到!
還有多拖拉一個按鈕 IDC_BUTTON1


按鈕若要設置跟上面文字輸入框等寬可以
先CTRL按著不放先選

按鈕文字顯示也是在標題設置

按鈕事件註冊
可直接雙擊按鈕會自動註冊產生一個按鈕事件區塊



第一個被加數相應輸入框進行變數綁定及定義設置
針對輸入框右鍵添加相應變數

這邊我們不是控制項操作而是數值類的存取

下一頁還能設Min , Max可不設直接按完成

第二個加數相應輸入框進行變數綁定及定義設置
比照第一個的同樣步驟 ,變數名稱改為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





留言

這個網誌中的熱門文章

何謂淨重(Net Weight)、皮重(Tare Weight)與毛重(Gross Weight)

Architecture(架構) 和 Framework(框架) 有何不同?_軟體設計前的事前規劃的藍圖概念

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