(七)对话框,单选框(radiobox),复选框(checkbox),列表框(ListBox),组合框(CComboBox),水平滚动条(Horizontal scroll bar),微调(旋转)spincontrol,列表视图控件CListCtrl,静态控件static
1,模态对话框和非模态对话框
// 模态对话框 void CMainFrame::OnDialogExec() { // TODO: 在此添加命令处理程序代码 // 创建对话框对象 CDialog dlg(IDD_DIALOG1); // 阻塞 // 运行 dlg.DoModal(); } // 非模态对话框 void CMainFrame::OnDialogShow() { // TODO: 在此添加命令处理程序代码 dlg2.ShowWindow(SW_SHOWNORMAL); }
非模态对话框在OnCreate()中 create
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) { TRACE0("未能创建工具栏\n"); return -1; // 未能创建 } if (!m_wndStatusBar.Create(this)) { TRACE0("未能创建状态栏\n"); return -1; // 未能创建 } m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT)); // TODO: 如果不需要可停靠工具栏,则删除这三行 m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar); dlg2.Create(IDD_DIALOG2); return 0; }
设为成员变量
private: CDialog dlg2;
自定义对话框
创建完成之后自动生成如下内容
添加处理函数
基于对话框的编程
添加MFC 类
类似于Qt 的提升为
为自定义控件添加鼠标移动事件处理函数,当鼠标移动到Button 上时按钮会逃跑
// MyButton 消息处理程序 void MyButton::OnMouseMove(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 int x = rand() % 400; int y = rand() % 400; this->MoveWindow(x, y, 100, 50); CButton::OnMouseMove(nFlags, point); }
// MyButton class MyButton : public CButton { DECLARE_DYNAMIC(MyButton) public: MyButton(); virtual ~MyButton(); protected: DECLARE_MESSAGE_MAP() public: afx_msg void OnMouseMove(UINT nFlags, CPoint point); };
给Button 设置位图
// CpartsDlg 消息处理程序 BOOL CpartsDlg::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: 在此添加额外的初始化代码 m_button.SetWindowTextW(TEXT("逃跑的按钮")); CBitmap bitmap; bitmap.LoadBitmapW(IDB_BITMAP1); // 获取位图大小 BITMAP bmp; bitmap.GetBitmap(&bmp); // 给按钮设置位图 m_button.SetBitmap(bitmap); // 图片有多大,按钮就设置多大 m_button.MoveWindow(20, 20, bmp.bmWidth, bmp.bmHeight); return TRUE; // 除非将焦点设置到控件,否则返回 TRUE }
关联变量
void CpartsDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_BUTTON2, m_button); DDX_Text(pDX, IDC_EDIT1, m_str); }
// CpartsDlg 消息处理程序 BOOL CpartsDlg::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: 在此添加额外的初始化代码 m_button.SetWindowTextW(TEXT("逃跑的按钮")); CBitmap bitmap; bitmap.LoadBitmapW(IDB_BITMAP1); // 获取位图大小 BITMAP bmp; bitmap.GetBitmap(&bmp); // 给按钮设置位图 m_button.SetBitmap(bitmap); // 图片有多大,按钮就设置多大 m_button.MoveWindow(20, 20, bmp.bmWidth, bmp.bmHeight); m_str = TEXT("123456"); // 把 m_str 内容更新到对应的编辑区 UpdateData(FALSE); return TRUE; // 除非将焦点设置到控件,否则返回 TRUE }
void CpartsDlg::OnBnClickedButton3() { // TODO: 在此添加控件通知处理程序代码 // 把编辑区的内容更新到m_str UpdateData(TRUE); MessageBox(m_str); }
Edit 控件
单选框,复选框
单选框
CheckRadioButton(IDC_RADIO1, IDC_RADIO3, IDC_RADIO1);
void CCheckBoxDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 CString str; if (IsDlgButtonChecked(IDC_RADIO1)) { str = TEXT("男"); } if (IsDlgButtonChecked(IDC_RADIO3)) { str = TEXT("女"); } MessageBox(str); }
复选框
m_check1.SetWindowTextW(TEXT("测试")); m_check1.SetCheck(1);
void CCheckBoxDlg::OnBnClickedButton2() { // TODO: 在此添加控件通知处理程序代码 CString str; if (IsDlgButtonChecked(IDC_CHECK1)) { str += TEXT("第一个\r\n"); } if (IsDlgButtonChecked(IDC_CHECK2)) { str += TEXT("第二个\r\n"); } if (IsDlgButtonChecked(IDC_CHECK3)) { str += TEXT("第三个\r\n"); } if (IsDlgButtonChecked(IDC_CHECK4)) { str += TEXT("第四个\r\n"); } MessageBox(str); }
列表框ListBox
// 添加 void CListBoxDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 // 获取编辑区内容 UpdateData(TRUE); if (m_str.GetLength() == 0) { MessageBox(TEXT("内容不能为空")); return; } // 给列表框添加内容 m_listBox.AddString(m_str); m_str.Empty(); // 把内容更新到编辑区 UpdateData(FALSE); } // 删除 void CListBoxDlg::OnBnClickedButton2() { // TODO: 在此添加控件通知处理程序代码 // 获取当前选中的行 int i = m_listBox.GetCurSel(); // 删除 m_listBox.DeleteString(i); } // 点击选中的内容触发 void CListBoxDlg::OnLbnSelchangeList1() { // TODO: 在此添加控件通知处理程序代码 // 获取选中内容 int i = m_listBox.GetCurSel(); m_listBox.GetText(i, m_str); // 更新到编辑区 UpdateData(FALSE); } void CListBoxDlg::OnBnClickedButton3() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); if (m_str.GetLength() == 0) { MessageBox(TEXT("内容不能为空")); return; } int i = m_listBox.GetCurSel(); m_listBox.DeleteString(i); //m_listBox.AddString(m_str); m_listBox.InsertString(i, m_str); m_str.Empty(); UpdateData(FALSE); }
组合框(CComboBox)
基于对话框
运行:
添加类变量
选择在组合框的列表框中的字符串。 int SetCurSel( int nSelect );
在初始化函数中对组合框进行初始化操作,其中对条目的操作与listbox 的函数是一致的
// CCComboBoxDlg 消息处理程序 BOOL CCComboBoxDlg::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: 在此添加额外的初始化代码 m_comboBox.SetCurSel(2); //设置默认显示 CString str; m_comboBox.GetLBText(0,str); // 获取第0行的内容 //MessageBox(str); // 添加内容 m_comboBox.AddString(TEXT("KOBE")); //m_comboBox.InsertString(); //m_comboBox.DeleteString(); //m_comboBox.GetCurSel(); return TRUE; // 除非将焦点设置到控件,否则返回 TRUE }
水平滚动条(Horizontal scroll bar)
添加关联变量
添加事件控件,去父类属性中寻找 消息 WM_HSCROLL
Edit Control 添加关联变量
void CCComboBoxDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_COMBO1, m_comboBox); DDX_Control(pDX, IDC_SCROLLBAR1, m_scroll); DDX_Text(pDX, IDC_EDIT1, m_pos); }
BEGIN_MESSAGE_MAP(CCComboBoxDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_HSCROLL()
END_MESSAGE_MAP()
初始化:
m_pos = 50; // 更新到编辑区 UpdateData(FALSE); // 设置滑块范围 m_scroll.SetScrollRange(1,100); m_scroll.SetScrollPos(m_pos);
// 滑块事件处理,只有操作滑块,nPos才有值 void CCComboBoxDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { // TODO: 在此添加消息处理程序代码和/或调用默认值 // 如果有多个滑块,以此加以区分 if (pScrollBar == &m_scroll) { switch (nSBCode) { // 判断滑动条的哪一部分 case SB_THUMBPOSITION: // 滑块位置 { m_scroll.SetScrollPos(nPos); // 设置滑块的位置 m_pos = nPos; UpdateData(FALSE); // 更新到编辑区 break; } case SB_LINELEFT: // 向左的箭头 { int tempPos; tempPos = m_scroll.GetScrollPos() - 1; if (tempPos <= 0) { tempPos = 1; } m_scroll.SetScrollPos(tempPos); m_pos = tempPos; UpdateData(FALSE); break; } case SB_LINERIGHT: // 向右的箭头 { int tempPos; tempPos = m_scroll.GetScrollPos() + 1; if (tempPos >= 100) { tempPos = 100; } m_scroll.SetScrollPos(tempPos); m_pos = tempPos; UpdateData(FALSE); break; } case SB_PAGELEFT: // 箭头和滑块之间的左边 { int tempPos; tempPos = m_scroll.GetScrollPos() - 5; if (tempPos <= 0) { tempPos = 1; } m_scroll.SetScrollPos(tempPos); m_pos = tempPos; UpdateData(FALSE); break; } case SB_PAGERIGHT: // 箭头和滑块之间的右边 { int tempPos; tempPos = m_scroll.GetScrollPos() + 5; if (tempPos >= 100) { tempPos = 100; } m_scroll.SetScrollPos(tempPos); m_pos = tempPos; UpdateData(FALSE); break; } } } CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar); }
微调(旋转)spincontrol
然后设置它们的TAB键顺序,顺序必须是edit为1,spin为2.
设置好顺序之后就是关联它们,右键单击spin属性,设置Set Buddy Integer为TRUE,Auto Buddy也设置为TRUE
或绑定spin和edit:
m_Spin.SetBuddy(GetDlgItem(m_Edit1));
接着去初始化对话框函数中设置spin的范围和进制数
双击控件添加消息
// 初始化CSpinButtonCtrl m_spin.SetRange(0,10); // //表示数值只能在0到10内变化 m_spin.SetBase(10); //设置进制数,只能是10进制和16进制
如果Auto Buddy 为false,可以在消息处理函数中处理
void CCComboBoxDlg::OnDeltaposSpin1(NMHDR *pNMHDR, LRESULT *pResult) { LPNMUPDOWN pNMUpDown = reinterpret_cast<LPNMUPDOWN>(pNMHDR); // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); if(pNMUpDown->iDelta == -1) // 如果此值为-1 , 说明点击了Spin的往下的箭头 { m_editNum -= 2; if (m_editNum <= 0) { m_editNum = 0; } } else if(pNMUpDown->iDelta == 1) // 如果此值为1, 说明点击了Spin的往上的箭头 { m_editNum += 2; if (m_editNum >= 10) { m_editNum = 10; } } UpdateData(FALSE); *pResult = 0; }
列表视图控件CListCtrl
List Control
属性设置 view-> Report (报表方式)
添加关联变量 m_list
// CListControlDlg 消息处理程序 BOOL CListControlDlg::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: 在此添加额外的初始化代码 // 设置风格样式 // LVS_EX_GRIDLINES 网格 // LVS_EX_FULLROWSELECT 选中整行 m_list.SetExtendedStyle(m_list.GetExtendedStyle() | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT); // 插入标题 CString head[] = {TEXT("姓名"),TEXT("年龄"),TEXT("性别")}; // 插入列 m_list.InsertColumn(0,head[0],LVCFMT_LEFT,80); m_list.InsertColumn(1,head[1],LVCFMT_LEFT,50); m_list.InsertColumn(2,head[2],LVCFMT_LEFT,50); for (int i = 0; i < 10; i++) { CString str; str.Format(TEXT("mike%d"),i + 1); // 确定行 m_list.InsertItem(i,str); // 确定列 m_list.SetItemText(i,1,TEXT("18")); m_list.SetItemText(i,2,TEXT("男")); } return TRUE; // 除非将焦点设置到控件,否则返回 TRUE }
静态控件static
一、静态控件Static的使用 1、获取对话框的控件,适用于所有控件,需要转换为所需类型 CStatic * pImage = (CStatic *)GetDlgItem(IDC_STATIC); IDC_STATIC:控件ID 2、设置静态控件窗口风格为位图居中显示 pImage->ModifyStyle(0xf, SS_BITMAP | SS_CENTERIMAGE); 3、获取控件的大小,适用于所有控件: CWnd::GetWindowRect 4、静态控件设置bitmap: CStatic::SetBitmap 5、通过路径获取bitmap句柄 #define HBMP(filepath,width,height) (HBITMAP)LoadImage(AfxGetInstanceHandle(),filepath,IMAGE_BITMAP,width,height,LR_LOADFROMFILE|LR_CREATEDIBSECTION) 例如:HBMP(TEXT("./image/1.bmp"), 100, 100) 二、 CButton使用 1、设置按钮内容 CWnd::SetWindowText 2、按钮是否变灰 CWnd::EnableWindow 三、定时器 1、设置定时器 CWnd::SetTimer 2、关闭定时器 CWnd::KillTimer
// 图片浏览器Dlg.h : 头文件 // #pragma once #include "afxwin.h" // C图片浏览器Dlg 对话框 class C图片浏览器Dlg : public CDialogEx { // 构造 public: C图片浏览器Dlg(CWnd* pParent = NULL); // 标准构造函数 // 对话框数据 enum { IDD = IDD_MY_DIALOG }; 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() private: CButton buttonPre; //上一张按钮 CButton buttonAuto; //自动按钮 CButton buttonNext; //下一张按钮 CStatic *pImage; //静态控件 CRect rect; bool isAuto; //自动按钮按下标志位 int i; //标志第几张图片 public: afx_msg void OnBnClickedButtonPre(); afx_msg void OnBnClickedButtonNext(); afx_msg void OnBnClickedButtonAuto(); afx_msg void OnTimer(UINT_PTR nIDEvent); };
// 图片浏览器Dlg.cpp : 实现文件 // #include "stdafx.h" #include "图片浏览器.h" #include "图片浏览器Dlg.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() // C图片浏览器Dlg 对话框 C图片浏览器Dlg::C图片浏览器Dlg(CWnd* pParent /*=NULL*/) : CDialogEx(C图片浏览器Dlg::IDD, pParent) , i(0) , isAuto(true) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void C图片浏览器Dlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_BUTTON_PRE, buttonPre); DDX_Control(pDX, IDC_BUTTON_Auto, buttonAuto); DDX_Control(pDX, IDC_BUTTON_NEXT, buttonNext); } BEGIN_MESSAGE_MAP(C图片浏览器Dlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON_PRE, &C图片浏览器Dlg::OnBnClickedButtonPre) ON_BN_CLICKED(IDC_BUTTON_NEXT, &C图片浏览器Dlg::OnBnClickedButtonNext) ON_BN_CLICKED(IDC_BUTTON_Auto, &C图片浏览器Dlg::OnBnClickedButtonAuto) ON_WM_TIMER() END_MESSAGE_MAP() // C图片浏览器Dlg 消息处理程序 BOOL C图片浏览器Dlg::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: 在此添加额外的初始化代码 //通过路径获取Bitmap句柄 #define HBMP(filepath,width,height) (HBITMAP)LoadImage(AfxGetInstanceHandle(),filepath,IMAGE_BITMAP,width,height,LR_LOADFROMFILE|LR_CREATEDIBSECTION) //获取对话框上静态控件的句柄 pImage = (CStatic*)GetDlgItem(IDC_STATIC); //设置静态控件窗口风格为位图居中显示 pImage->ModifyStyle(0xf, SS_BITMAP | SS_CENTERIMAGE); pImage->GetWindowRect(&rect); //获取静态控件范围 i = 0; //静态控件设置图片 pImage->SetBitmap(HBMP(TEXT("./image/1.bmp"), rect.Width(), rect.Height())); return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } void C图片浏览器Dlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); } } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void C图片浏览器Dlg::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 C图片浏览器Dlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } //上一张按钮 void C图片浏览器Dlg::OnBnClickedButtonPre() { i--; if (i < 1) { i = 24; } CString filePath; filePath.Format(TEXT("./image/%d.bmp"), i); pImage->SetBitmap(HBMP(filePath, rect.Width(), rect.Height())); } //下一张按钮 void C图片浏览器Dlg::OnBnClickedButtonNext() { // TODO: 在此添加控件通知处理程序代码 i++; if (i > 24) { i = 1; } CString filePath; filePath.Format(TEXT("./image/%d.bmp"), i); pImage->SetBitmap(HBMP(filePath, rect.Width(), rect.Height())); } //自动按钮 void C图片浏览器Dlg::OnBnClickedButtonAuto() { // TODO: 在此添加控件通知处理程序代码 if (isAuto == true) //按下自动按钮 { SetWindowText(TEXT("停止")); buttonNext.EnableWindow(FALSE); buttonPre.EnableWindow(FALSE); SetTimer(1, 1000, NULL); //设置定时器 } else //按下停止按钮 { SetWindowText(TEXT("自动")); buttonNext.EnableWindow(TRUE); buttonPre.EnableWindow(TRUE); KillTimer(1); //关闭定时器 } isAuto = !isAuto; //标志位切换 } //定时器处理函数 void C图片浏览器Dlg::OnTimer(UINT_PTR nIDEvent) { // TODO: 在此添加消息处理程序代码和/或调用默认值 if (1 == nIDEvent) { OnBnClickedButtonNext(); //直接调用下一张按钮处理函数 } CDialogEx::OnTimer(nIDEvent); }
加登陆对话框
重写 OnOK()
void LoginDlg::OnOK() { // TODO: 在此添加专用代码和/或调用基类 //CDialogEx::OnOK(); }
// LoginDlg.cpp : 实现文件 // #include "stdafx.h" #include "static.h" #include "LoginDlg.h" #include "afxdialogex.h" // LoginDlg 对话框 IMPLEMENT_DYNAMIC(LoginDlg, CDialogEx) LoginDlg::LoginDlg(CWnd* pParent /*=NULL*/) : CDialogEx(LoginDlg::IDD, pParent) , m_account(_T("")) , m_pwd(_T("")) { } LoginDlg::~LoginDlg() { } void LoginDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT1, m_account); DDX_Text(pDX, IDC_EDIT2, m_pwd); } BEGIN_MESSAGE_MAP(LoginDlg, CDialogEx) ON_BN_CLICKED(IDC_BUTTON1, &LoginDlg::OnBnClickedButton1) ON_BN_CLICKED(IDC_BUTTON2, &LoginDlg::OnBnClickedButton2) ON_WM_CLOSE() END_MESSAGE_MAP() // LoginDlg 消息处理程序 // 确认 void LoginDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 //取出编辑区内容 UpdateData(TRUE); if (m_account == TEXT("mike") && m_pwd == TEXT("250250")) { //关闭对话框 CDialogEx::OnOK(); } else { MessageBox(TEXT("账号或密码不正确")); } } void LoginDlg::OnBnClickedButton2() { // TODO: 在此添加控件通知处理程序代码 exit(1); } void LoginDlg::OnOK() { // TODO: 在此添加专用代码和/或调用基类 //CDialogEx::OnOK(); } void LoginDlg::OnClose() { // TODO: 在此添加消息处理程序代码和/或调用默认值 exit(1); CDialogEx::OnClose(); }
#pragma once // LoginDlg 对话框 class LoginDlg : public CDialogEx { DECLARE_DYNAMIC(LoginDlg) public: LoginDlg(CWnd* pParent = NULL); // 标准构造函数 virtual ~LoginDlg(); // 对话框数据 enum { IDD = IDD_DIALOG1 }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 DECLARE_MESSAGE_MAP() public: afx_msg void OnBnClickedButton1(); private: CString m_account; CString m_pwd; public: afx_msg void OnBnClickedButton2(); virtual void OnOK(); afx_msg void OnClose(); };