對話框和控件
復選框
單選框
分組框
示例:三原色畫圖
一、建立名為Demo2的MFC工程,按照下圖添加控件
並修改2個Group Box Caption屬性分別為顏色、外觀
修改3個Check Box Caption和ID屬性分別為(紅色,IDC_CHK_RED)、(綠色,IDC_CHK_GREEN)、(藍色,IDC_CHK_BLUE)
修改2個Radio Box Caption和ID屬性分別為(矩形,IDC_RD_RECT)、(圓形,IDC_RD_ROUND)
注意:radio box 必須是連續的table鍵順序

radio 控件tab鍵順序查看方法

二、為check box 組件紅色、綠色、藍色添加變量關聯,分別為m_chk_red、m_chk_green、m_chk_blue


2、分別為3個check box 和2個 radio box 添加事件處理,方法如下(請注意函數處理名稱要對應):


3、進入Demo2Dlg.cpp添加
void CDemo2Dlg::OnBnClickedChkBlue() { // TODO: 在此添加控件通知處理程序代碼 Invalidate(); } void CDemo2Dlg::OnBnClickedChkGreen() { // TODO: 在此添加控件通知處理程序代碼 OnBnClickedChkBlue(); } void CDemo2Dlg::OnBnClickedChkRed() { // TODO: 在此添加控件通知處理程序代碼 OnBnClickedChkBlue(); } void CDemo2Dlg::OnBnClickedRdRound() { // TODO: 在此添加控件通知處理程序代碼 OnBnClickedChkBlue(); } void CDemo2Dlg::OnBnClickedRdRect() { // TODO: 在此添加控件通知處理程序代碼 OnBnClickedChkBlue(); }
4、為Demo2對話框添加消息處理函數,進入Demo2Dlg.cpp添加:

BOOL CDemo2Dlg::OnEraseBkgnd(CDC* pDC) { // TODO: 在此添加消息處理程序代碼和/或調用默認值 BOOL bRet = CDialogEx::OnEraseBkgnd(pDC); int nRed, nGreen, nBlue; nRed = m_chk_red.GetCheck() ? 255 : 0; //紅色復選框被選中,設置值為255,否則為0 nGreen = m_chk_green.GetCheck() ? 255 : 0; //同上 nBlue = m_chk_blue.GetCheck() ? 255 : 0; //同上 COLORREF crFore = RGB(nRed,nGreen,nBlue); //使用rgb組合新的顏色 CBrush brush; //創建刷子 brush.CreateSolidBrush(crFore); //實心,顏色為crFore CBrush *pOldBrush = pDC->SelectObject(&brush);//保留舊的刷子 RECT rc = {70,50,120,120}; if(m_rd_rect.GetCheck()) { pDC->Rectangle(&rc); //畫框 } else { pDC->Ellipse(&rc); //畫圓 } pDC->SelectObject(&pOldBrush); //還原舊的畫刷 return bRet; }
同時在BOOL CDemo2Dlg::OnInitDialog() 函數中添加:
// TODO: 在此添加額外的初始化代碼
CheckRadioButton(IDC_RD_RECT,IDC_RD_ROUND,IDC_RD_ROUND);//從IDC_RD_RECT,IDC_RD_ROUND范圍內選擇一個作為默認值
Demo2Dlg.cpp源碼:
// Demo2Dlg.cpp : 實現文件 // #include "stdafx.h" #include "Demo2.h" #include "Demo2Dlg.h" #include "afxdialogex.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // 用於應用程序“關於”菜單項的 CAboutDlg 對話框 class CAboutDlg : public CDialogEx { public: CAboutDlg(); // 對話框數據 enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 實現 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP() // CDemo2Dlg 對話框 CDemo2Dlg::CDemo2Dlg(CWnd* pParent /*=NULL*/) : CDialogEx(CDemo2Dlg::IDD, pParent) , m_rd_round(0) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CDemo2Dlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_CHK_RED, m_chk_red); DDX_Control(pDX, IDC_CHK_GREEN, m_chk_green); DDX_Control(pDX, IDC_CHK_BLUE, m_chk_blue); DDX_Control(pDX, IDC_RD_RECT, m_rd_rect); } BEGIN_MESSAGE_MAP(CDemo2Dlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() //ON_BN_CLICKED(IDC_CHECK2, &CDemo2Dlg::OnBnClickedCheck2) ON_BN_CLICKED(IDC_CHK_BLUE, &CDemo2Dlg::OnBnClickedChkBlue) ON_WM_ERASEBKGND() ON_BN_CLICKED(IDC_CHK_GREEN, &CDemo2Dlg::OnBnClickedChkGreen) ON_BN_CLICKED(IDC_CHK_RED, &CDemo2Dlg::OnBnClickedChkRed) ON_BN_CLICKED(IDC_RD_ROUND, &CDemo2Dlg::OnBnClickedRdRound) ON_BN_CLICKED(IDC_RD_RECT, &CDemo2Dlg::OnBnClickedRdRect) END_MESSAGE_MAP() // CDemo2Dlg 消息處理程序 BOOL CDemo2Dlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 將“關於...”菜單項添加到系統菜單中。 // IDM_ABOUTBOX 必須在系統命令范圍內。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { 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: 在此添加額外的初始化代碼 CheckRadioButton(IDC_RD_RECT,IDC_RD_ROUND,IDC_RD_ROUND);//從IDC_RD_RECT,IDC_RD_ROUND范圍內選擇一個作為默認值 return TRUE; // 除非將焦點設置到控件,否則返回 TRUE } void CDemo2Dlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); } } // 如果向對話框添加最小化按鈕,則需要下面的代碼 // 來繪制該圖標。對於使用文檔/視圖模型的 MFC 應用程序, // 這將由框架自動完成。 void CDemo2Dlg::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 CDemo2Dlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } void CDemo2Dlg::OnBnClickedCheck2() { // TODO: 在此添加控件通知處理程序代碼 } void CDemo2Dlg::OnBnClickedChkBlue() { // TODO: 在此添加控件通知處理程序代碼 Invalidate(); } BOOL CDemo2Dlg::OnEraseBkgnd(CDC* pDC) { // TODO: 在此添加消息處理程序代碼和/或調用默認值 BOOL bRet = CDialogEx::OnEraseBkgnd(pDC); int nRed, nGreen, nBlue; nRed = m_chk_red.GetCheck() ? 255 : 0; //紅色復選框被選中,設置值為255,否則為0 nGreen = m_chk_green.GetCheck() ? 255 : 0; //同上 nBlue = m_chk_blue.GetCheck() ? 255 : 0; //同上 COLORREF crFore = RGB(nRed,nGreen,nBlue); //使用rgb組合新的顏色 CBrush brush; //創建刷子 brush.CreateSolidBrush(crFore); //實心,顏色為crFore CBrush *pOldBrush = pDC->SelectObject(&brush);//保留舊的刷子 RECT rc = {70,50,120,120}; if(m_rd_rect.GetCheck()) { pDC->Rectangle(&rc); //畫框 } else { pDC->Ellipse(&rc); //畫圓 } pDC->SelectObject(&pOldBrush); //還原舊的畫刷 return bRet; } void CDemo2Dlg::OnBnClickedChkGreen() { // TODO: 在此添加控件通知處理程序代碼 OnBnClickedChkBlue(); } void CDemo2Dlg::OnBnClickedChkRed() { // TODO: 在此添加控件通知處理程序代碼 OnBnClickedChkBlue(); } void CDemo2Dlg::OnBnClickedRdRound() { // TODO: 在此添加控件通知處理程序代碼 OnBnClickedChkBlue(); } void CDemo2Dlg::OnBnClickedRdRect() { // TODO: 在此添加控件通知處理程序代碼 OnBnClickedChkBlue(); }
