(七)对话框,单选框(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("未能创建工具栏
");
        return -1;      // 未能创建
    }

    if (!m_wndStatusBar.Create(this))
    {
        TRACE0("未能创建状态栏
");
        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("第一个
");
    }
    if (IsDlgButtonChecked(IDC_CHECK2)) {
        str += TEXT("第二个
");
    }
    if (IsDlgButtonChecked(IDC_CHECK3)) {
        str += TEXT("第三个
");
    }
    if (IsDlgButtonChecked(IDC_CHECK4)) {
        str += TEXT("第四个
");
    }
    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();
}
loginDlg.cpp
#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();
};
loginDlg.h

原文地址:https://www.cnblogs.com/xiangtingshen/p/10807144.html