zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    swfupload控件文件上传大小限制设置
    C# 判断和创建目录路径
    [转载]Python ImportError: No module named 'requests'解决方法
    使用SQL语句进行特定值排序
    使用SQL语句进行数据复制
    Email正则表达式验证
    c#winform程序的改名(修改名称)
    关于无法加载DLL"***.dll":找不到指定的模块(异常来自HRESULT:0x8007007E)问题的解决办法
    C#中倒计时汇总
    C#中倒计时
  • 原文地址:https://www.cnblogs.com/sdk123/p/6803827.html
Copyright © 2011-2022 走看看