MFC入门 001 Edit&Button&List&ComboBox

---恢复内容开始---

# 一. MFC是什么

  

  1.MFC是 windows 一整套应用程序开发框架

    MFC(MicrosoftFoundationClasses)

    是微软公司实现的一个c++类库,主要封装了大部分的windows API函数

  

  2.QT  C++图形用户界面应用程序开发框架

    是一个1991年由奇趣科技开发的跨平台C++图形用户界面应用程序开发框架。

    它既可以开发GUI程序

    也可用于开发非GUI程序

    比如控制台工具和服务器

  

  3.Duilib 是一款强大的界面开发工具,可以将用户界面和处理逻辑彻底分离,极大地提高用户界面的开发效率。

    提供所见即所得的开发工具UIDesigner。使用DirectUI后将使得我们的设计人员彻底解

    DirectUI界面库使用XML来描述界面风格,界面布局,可 以很方便的构建高效,绚丽的,非常易于扩展的界面

    Duilib界面库的出现解决了使用传统MFC界面库开发软件不美观、界面细节处理不好、使用硬编码、开发效率低下、生成程序体积大等问题。

# 二. 第一个MFC程序 计算编辑框内的文本数量

  

(图1)

 

(图2)

 

(图3)

  1.创建第一个MFC应用程序解决方案

    打开 VS2015 文件新建项目 快捷键 Ctrl + Shift + N (图1)

    选择基于对话框 (图2) 

    如果要发布程序 选择静态库使用MFC 会把库文件打包. 程序体积会很大,打包库文件到程序中 (图2)

    如果选择共享 DLL 中使用MFC  动态链接库 程序机体较小 不打包库文件到程序种 (图2)

    创建完成 后一个所见即所得的界面 (图3)

(图4)

 

(图5)

 

 (图6)

  2.编辑框

    工具栏拖拽一个编辑框到窗口内 (图4)

    编辑窗口 设置编辑框的属性 (图5)

    工具栏拖拽一个button 和 两个 startic Text 控件分别设置ID的属性 IDC_BTN_COUNT 和 IDC_OUTPUT (图6)

    

  3.代码实现

    双击button进入鼠标单击响应事件

    输入以下代码 (图7)

    编译运行程序 ( 图8 )

  

( 图7 )

1     CString strInput;
2     if (0 == GetDlgItemTextW(IDC_EDT_INPUT, strInput))
3     {
4         SetDlgItemTextW(IDC_OUTPUT, L"获取统计资料失败!");
5         return;
6     }
7     CString strOutput;
8     strOutput.Format(L"%d", strInput.GetLength());
9     SetDlgItemTextW(IDC_OUTPUT, strOutput);

( 图8 )

  4.代码分析

    A版本和W版本函数区别

      首先 函数SetDlgItemText 宏定义 如果编译器定义UNICODE 使用 SetDlgItemTextW 否则使用 SetDlgItemTextA

      Windows 内核采用UNICODE 开发的,如果使用 A版本的函数,系统会将其转换成W版本然后调用运行,所以尽量使用W版本进行编程开发

    CString strInput 

      Cstring 是MFC下的独有数据类型 定义(图9)

    if (0 == GetDlgItemTextW(IDC_EDT_INPUT, strInput))

      调用这个函数以获得与对话框中的控件相关的标题或文本。GetDlgItemText成员函数将文本拷贝到lpStr指向的位置并返回拷贝的字节的数目

      如果函数调用成功,返回值为拷贝到缓冲区中的 TCHAR 字符个数(不包括结束空字符)。

      如果函数调用失败,返回值为 0 

      这个判断的意思就是如果函数执行失败 设置  IDC_OUTPUT 控件的文本为 L"获取统计资料失败!"

    CString strOutput;

      新申请一个strOutput 用于显示输出编辑框文本的字符数量

    strOutput.Format(L"%d", strInput.GetLength());
    SetDlgItemTextW(IDC_OUTPUT, strOutput);

      获取字符串的长度 

      修改设置IDC_OUTPUT 控件 用于显示字符串的数量

 

 

 

(图9)

 

# . 第二个MFC程序 CheckBokDemo 实现点击点选和多选按钮实现不通颜色的矩形和圆形

  1.创建第一个MFC应用程序解决方案

    新建项目,修改默认界面 可参照 图1 图2 图3 

    拖拽 单选框 和 多选框 设置 ID 和 文本 并排列(图10) (图11)

(图10)

 

(图11)

 

  2.使用类向导将控件跟变量关联

    方法一对控件点击右键 添加变量 命名变量名 (图 12) (图 13)

    方法二点击鼠标右键 类向导 快捷键 Ctrl + Shift +X   成员变量  添加变量 (图 14) (图 15)

 

(图12)

 

(图13)

 

(图14)

 

(图15)

 

  3.给程序增添一个消除窗口背景的消息 WM_ERASEBKGND

    WM_ERASEBKGND 消息详解

      当窗口背景必须被擦除时 (例如,窗口的移动,窗口的大小的改变)才发送

      当窗口的一部分无效需要重绘时发送此消息。

      #define WM_ERASEBKGND 0x0014  宏定义 编译时候自动替换

    增添方法

      单击鼠标右键类向导快捷键 Ctrl + Shift +X (图12)

      切换到消息选卡中 选中要增添的消息点击确定 (图16)

 

(图16)

 

  4.代码实现

    输入代码 (图17)

  

(图17)

  WM_ERASEBKGND 响应代码

BOOL CCheckBoxDemoDlg::OnEraseBkgnd(CDC* pDC)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值

    BOOL bRet = CDialogEx::OnEraseBkgnd(pDC);
    int nRed, nGreen, nBlue;
    nRed = m_chkred.GetCheck() ? 255 : 0;
    nGreen = m_chkgreen.GetCheck() ? 255 : 0;
    nBlue = m_chkblue.GetCheck() ? 255 : 0;
    COLORREF crColor = RGB(nRed, nGreen, nBlue);

    CBrush brush;
    brush.CreateSolidBrush(crColor);
    CBrush *pOldBrush = pDC->SelectObject(&brush);
    RECT rect = { 25,25,200,200 };
    if (((CButton*)GetDlgItem(IDC_RADIO_RECT))->GetCheck())
    {
        pDC->Rectangle(&rect);
    }
    else
    {
        pDC->Ellipse(&rect);
    }
    
    pDC->SelectObject(pOldBrush);
    return bRet;
}

给窗口内所有控件 增添一个函数 设置无效区域 使窗口进行重绘 void Invalidate( BOOL bErase = TRUE );

void CCheckBoxDemoDlg::OnBnClickedCheckRed()
{
    // TODO: 在此添加控件通知处理程序代码
    Invalidate();
}


void CCheckBoxDemoDlg::OnBnClickedCheckGreen()
{
    // TODO: 在此添加控件通知处理程序代码
    Invalidate();
}


void CCheckBoxDemoDlg::OnBnClickedCheckBlue()
{
    // TODO: 在此添加控件通知处理程序代码
    Invalidate();
}


void CCheckBoxDemoDlg::OnBnClickedRadioRect()
{
    // TODO: 在此添加控件通知处理程序代码
    Invalidate();
}


void CCheckBoxDemoDlg::OnBnClickedRadio2()
{
    // TODO: 在此添加控件通知处理程序代码
    Invalidate();
}

  5.代码分析

    BOOL bRet = CDialogEx::OnEraseBkgnd(pDC);
    return bRet;

      定义一个 bRet的变量 如果它擦除了背景,则返回非零值;否则返回0

      

int nRed, nGreen, nBlue;
nRed = m_chkred.GetCheck() ? 255 : 0;
nGreen = m_chkgreen.GetCheck() ? 255 : 0;
nBlue = m_chkblue.GetCheck() ? 255 : 0;

      定义三个整型变量 

      GetCheck() 控件是否被按下

      用三目运算符 控件被按下 设置255 没有被按下设置为0

    COLORREF crColor = RGB(nRed, nGreen, nBlue);

    CBrush brush;
    brush.CreateSolidBrush(crColor);
    CBrush *pOldBrush = pDC->SelectObject(&brush);
    RECT rect = { 25,25,200,200 };
    if (((CButton*)GetDlgItem(IDC_RADIO_RECT))->GetCheck())
    {
        pDC->Rectangle(&rect);
    }
    else
    {
        pDC->Ellipse(&rect);
    }
    
    pDC->SelectObject(pOldBrush);

    COLORREF typedef DWORD   COLORREF; DWORD类型的变量

    RGB #define RGB(r,g,b)          ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16))) 控制颜色取值

    CBrush brush; 新建画刷

    brush.CreateSolidBrush(crColor);  设置画刷的颜色,把我们的变量传递进去

    CBrush *pOldBrush = pDC->SelectObject(&brush); 

      函数功能:该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的相同类

      有点晕不是太懂 T_T 标记一下

    RETC

      结构体 窗口内 左上角的 坐标 跟 右下角的坐标 然后就可以画出图形了  (图18)

      typedef struct tagRECT
      {
        LONG left;
        LONG top;
        LONG right;
        LONG bottom;
      } RECT, *PRECT, NEAR *NPRECT, FAR *LPRECT;

    if (((CButton*)GetDlgItem(IDC_RADIO_RECT))->GetCheck())

      如果矩形点选按钮按下 就执行画矩形 否则 画圆圈 

(图18)

#四  . 第三个MFC程序  ComboBoxDemo  下拉框列表

  新建MFC 项目 并在窗口增添控件  (图19)

    拖拽 Combo Box 下拉框列表

      设置属性 ID IDC_COMBO_DEMO 

      设置 TYPE 属性 下拉列表 Drop List

      注意属性 Sort 自动排序属性

      添加变量 设置变量名位 m_ListDemo

    拖拽 List Box  

      设置属性 ID IDC_LIST_DEMO

      添加变量 设置变量名位 m_cobDemo

    拖拽 编辑框 Edit Box

      设置ID IDC_EDIT_INPUT

    拖拽 两个按钮 

      设置属性ID 一个为 IDC_BTN_ADD  标题设置为 添加

      设置属性ID 一个为 IDC_BTN_DEL   标题设置为 删除

(图19)

  代码实现

    双击增添按钮 编写鼠标响应消息 图20 

    双击删除按钮 编写鼠标响应消息 图21

 

 图20 

void CComboBoxDemoDlg::OnBnClickedButton1()
{
    // TODO: 在此添加控件通知处理程序代码
    CString strInput;
    if (GetDlgItemTextW((IDC_EDIT_INPUT), strInput) != 0)
    {
        int nIndex = m_cobDemo.AddString(strInput);
        m_cobDemo.SetCurSel(nIndex);
        nIndex = m_listDemo.AddString(strInput);
        m_listDemo.SetCurSel(nIndex);
    }
}

图21

void CComboBoxDemoDlg::OnBnClickedButton2()
{
    // TODO: 在此添加控件通知处理程序代码
    int nIndex = m_cobDemo.GetCurSel();
    if (-1 < nIndex)
    {
            m_cobDemo.DeleteString(nIndex);
            if (nIndex < m_cobDemo.GetCount())
                m_cobDemo.SetCurSel(nIndex);
            else
                m_cobDemo.SetCurSel(0);
    }
    else
    {
        MessageBoxW(L"未选中待删除的项!");
    }

    nIndex = m_listDemo.GetCurSel();
    if (nIndex > -1)
    {
        m_listDemo.DeleteString(nIndex);
        if (nIndex < m_listDemo.GetCount())
            m_listDemo.SetCurSel(nIndex);
        else
            m_listDemo.SetCurSel(0);
    }
    else
    {
        MessageBoxW(L"未选中待删除的项!");
    }
}

  代码分析

    CString strInput;
    if (GetDlgItemTextW((IDC_EDIT_INPUT), strInput) != 0)

    创建 CString 变量 strInput 保存 从 编辑框中获得的数据 如果返回值不为0  说明获取成功

    {
        int nIndex = m_cobDemo.AddString(strInput);
        m_cobDemo.SetCurSel(nIndex);
        nIndex = m_listDemo.AddString(strInput);
        m_listDemo.SetCurSel(nIndex);
    }

    int AddString( UINT nStringID ); 

      如果成功则返回被添加的第一个新字符串的从零开始的索引;否则返回-1

      参数: nStringID 要添加到工具条控件的字符串列表中去的字符串资源的资源标识符。

    int SetCurSel( int nSelect );

      调用成功时返回选中的项的下标。如果 nSelect 大于列表中项的个数,则返回 CB_ERR 。如果 nSelect 为 -1 ,则清除当前的选择并返回 CB_ERR 。

    往下拉框 列表框 添加数据

    nIndex 下拉框 列表框 选中的项下标

      

    int nIndex = m_cobDemo.GetCurSel();
    if (-1 < nIndex)
    {
            m_cobDemo.DeleteString(nIndex);
            if (nIndex < m_cobDemo.GetCount())
                m_cobDemo.SetCurSel(nIndex);
            else
                m_cobDemo.SetCurSel(0);
    }
    else
    {
        MessageBoxW(L"未选中待删除的项!");
    }

    整型 nIndex 变量 用来保存 下拉框 列表框 选中的项下标

    判断-1 < nIndex 为-1 说明 ComboBox内没有数据 位0 为第一个

      删除 第[nIndex] 个 数据

      判断 nInde < ComboBox内 个数

        选择 第[nIndex] 个 数据

      否则 选择 第1  个 数据

    否则 弹出消息框 未选中的删除项目

    nIndex = m_listDemo.GetCurSel();
    if (nIndex > -1)
    {
        m_listDemo.DeleteString(nIndex);
        if (nIndex < m_listDemo.GetCount())
            m_listDemo.SetCurSel(nIndex);
        else
            m_listDemo.SetCurSel(0);
    }
    else
    {
        MessageBoxW(L"未选中待删除的项!");
    }

    这个逻辑跟上面的差不多.......省略了.....

#五  . 总结

  学习了如何创建MFC程序

  第一个程序

    获取控件的TEXT  GetDlgItemTextW

    设置控件的TEXT  SetDlgItemTextW

  第二个程序

    如果获取当前控件的对象

    一种是直接添加增援变量

    一种是 通过 GetDlgItem 获取对象指针

    GetCheck() 控件是否被按下

  第三个程序

    ComboBox几个函数

   AddString  增加项字符数据

    SetCurSel  返回选中的项的下标

    GetCount  返回选中的个数

    DeleteString  删除项字符串

    

GetDlgItemTextW
原文地址:https://www.cnblogs.com/sdk123/p/6803827.html