1.首先是ListControl

简介: 列表视图控件List Control同样比较常见,它能够把任何字符串内容以列表的方式显示出来,这种显示方式的特点是整洁、直观,在实际应用中能为用户带来方便。

    列表视图控件是列表框控件List Box的改进和延伸。列表视图控件的列表项一般有图标(Icon)和标签(Label)两部分。图标是对列表项的图形描述,标签是文字描述。当然列表项可以只包含图标也可以只包含标签。

    列表视图控件有4种风格:Icon、Small Icon、List和Report。下面简单说下4种风格各自的特点:

    Icon大图标风格:列表项的图标通常为32×32像素,在图标的下面显示标签。

    Small Icon小图标风格:列表项的图标通常为16×16像素,在图标的右面显示标签。  

    List列表风格:与小图标风格类似,图标和文字的对齐方式不同。

    Report报表风格:列表视图控件可以包含一个列表头来描述各列的含义。每行显示一个列表项,通常可以包含多个列表子项。最左边的列表子项的标签左边可以添加一个图标,而它右边的所有子项则只能显示文字。这种风格的列表视图控件很适合做各种报表。

   我的理解就是windows资源管理器,“查看”标签下的“大图标,小图标,列表,详细资料”

创建: MFC同样为列表视图控件的操作提供了CListCtrl类。

   如果我们不想在对话框模板中直接拖入List Control来使用列表视图控件,而是希望动态创建它,则要用到CListCtrl类的成员函数Create函数,原型如下:

virtual BOOL Create(
DWORD dwStyle,
const RECT& rect,
CWnd* pParentWnd,
UINT nID
);

  参数rect为列表视图控件的位置和尺寸,pParentWnd为指向父窗口的指针,nID指定列表视图控件的ID,最复杂的一个参数同样还是dwStyle,它用于设定列表视图控件的风格,可以是以下风格的组合:

风格    含义
LVS_ALIGNLEFT                         显示格式是大图标或小图标时,标签放在图标的左边
LVS_ALIGNTOP                          显示格式是大图标或小图标时,标题放在图标的上边
LVS_AUTOARRANGE 显示格式是大图标或小图标时,自动排列控件中的列表项
LVS_EDITLABELS                       用户可以修改标签文本
LVS_ICON                                  指定大图标显示格式
LVS_LIST                                   指定列表显示格式
LVS_NOCOLUMNHEADER          在报表格式中不显示列的表头
LVS_NOLABELWRAP                 显示格式是大图标时,使标签文本单行显示。默认是多行显示
LVS_NOSCROLL                        列表视图控件无滚动条,此风格不能与LVS_LIST或LVS_REPORT组合使用
LVS_NOSORTHEADER               报表格式的列表视图控件的表头不能作为排序按钮使用
LVS_OWNERDRAWFIXED         由控件的拥有者负责绘制表项
LVS_REPORT                            指定报表显示格式
LVS_SHAREIMAGELISTS            使列表视图共享图像序列
LVS_SHOWSELALWAYS            即使控件失去输入焦点,仍显示出项的选择状态
LVS_SINGLESEL                        指定只能有一个列表项被选中。默认时可以多项选择
LVS_SMALLICON                        指定小图标显示格式
LVS_SORTASCENDING              按升序排列列表项
LVS_SORTDESCENDING           按降序排列列表项

常用方法:以下未经说明,ListControl默认view,风格为report

--1.设置ListControl风格及扩展风格

      LONG lStyle;
lStyle = GetWindowLong(m_list.m_hWnd, GWL_STYLE);//获取当前窗口style
lStyle &= ~LVS_TYPEMASK; //清除显示方式位
lStyle |= LVS_REPORT; //设置style
SetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle);//设置style DWORD dwStyle = m_list.GetExtendedStyle();
dwStyle |= LVS_EX_FULLROWSELECT;//选中某行使整行高亮(只适用与report风格的listctrl)
dwStyle |= LVS_EX_GRIDLINES;//网格线(只适用与report风格的listctrl)
dwStyle |= LVS_EX_CHECKBOXES;//item前生成checkbox控件
m_list.SetExtendedStyle(dwStyle); //设置扩展风格

--2.插入数据

      m_list.InsertColumn( , "ID", LVCFMT_LEFT,  );//插入列
m_list.InsertColumn( , "NAME", LVCFMT_LEFT, );
int nRow = m_list.InsertItem(, “”);//插入行
m_list.SetItemText(nRow, , “jacky”);//设置数据

--3.一直选中item

选中style中的Show selection always,或者在上面第2点中设置LVS_SHOWSELALWAYS

--4.选中和取消选中一行

    int nIndex = ;
//选中
m_list.SetItemState(nIndex, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);
//取消选中
m_list.SetItemState(nIndex, , LVIS_SELECTED|LVIS_FOCUSED);

--5.得到ListControl中的所有行的checkbox的状态

      m_list.SetExtendedStyle(LVS_EX_CHECKBOXES);
CString str;
for(int i=;i<m_list.GetItemCount();i++)
{
if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED || m_list.GetCheck(i))
{
str.Format(_T("第%d行的checkbox为选中状态"), i);
AfxMessageBox(str);
}
}

--6.得到ListControl中所有选中行的序号

     CString str;
for(int i=; i<m_list.GetItemCount();i++)
{
if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED )
{
str.Format(_T("选中了第%d行"), i);
AfxMessageBox(str);
}
}

--7.得到item的信息

      TCHAR szBuf[];
LVITEM lvi;
lvi.iItem = nItemIndex;
lvi.iSubItem = ;
lvi.mask = LVIF_TEXT;
lvi.pszText = szBuf;
lvi.cchTextMax = ;
m_list.GetItem(&lvi);

--8.得到ListControl的所有列的header字符串内容

      LVCOLUMN lvcol;
char str[];
int nColNum;
CString strColumnName[];//假如有4列 nColNum = ;
lvcol.mask = LVCF_TEXT;
lvcol.pszText = str;
lvcol.cchTextMax = ;
while(m_list.GetColumn(nColNum, &lvcol))
{
strColumnName[nColNum] = lvcol.pszText;
nColNum++;
}

--9.使ListControl中一项可见,即滚动滚动条

    m_list.EnsureVisible(i, FALSE);

--10.得到ListControl列数

    int nHeadNum = m_list.GetHeaderCtrl()->GetItemCount();

--11.删除所有列

        // 方法一:
while ( m_list.DeleteColumn ())
因为你删除了第一列后,后面的列会依次向上移动。 //方法二:
int nColumns = ;
for (int i=nColumns-; i>=; i--)
m_list.DeleteColumn (i);

--12.得到单击的ListControl的行列号

    // 添加listctrl控件的NM_CLICK消息相应函数
void CTest6Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
CString str;
for(int i=; i<m_list.GetItemState();i++)
{
if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED )
{
str.Format(_T("选中了第%d行"), i);
AfxMessageBox(str);
}
} *pResult = ;
}

--13.判断是否点击在ListControl的checkbox上

     //添加listctrl控件的NM_CLICK消息相应函数
void CTest6Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
DWORD dwPos = GetMessagePos();
CPoint point( LOWORD(dwPos), HIWORD(dwPos) ); m_list.ScreenToClient(&point); LVHITTESTINFO lvinfo;
lvinfo.pt = point;
lvinfo.flags = LVHT_ABOVE; UINT nFlag;
int nItem = m_list.HitTest(point, &nFlag);
//判断是否点在checkbox上
if(nFlag == LVHT_ONITEMSTATEICON)
{
AfxMessageBox("点在listctrl的checkbox上");
}
*pResult = ;
}

--14.右键点击ListControl的item弹出菜单

     //添加listctrl控件的NM_RCLICK消息相应函数
void CTest6Dlg::OnRclickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
if(pNMListView->iItem != -)
{
DWORD dwPos = GetMessagePos();
CPoint point( LOWORD(dwPos), HIWORD(dwPos) ); CMenu menu;
VERIFY( menu.LoadMenu( IDR_MENU1 ) );
CMenu* popup = menu.GetSubMenu();
ASSERT( popup != NULL );
UINT Cmd =popup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON| TPM_RETURNCMD, point.x, point.y, this ); switch(Cmd) { case ID_Log_SELECT: break; case ID_Log_CANCEL: break; }
}
*pResult = ;
}

--14.修改某一行的某一项

m_listRecvDetail.SetItem(m_listItemCount-,,LVIF_TEXT,"不应答",,,,NULL);

--15.失去焦点后依然高亮显示某一行或者熄灭某一行

 //获得选中行的索引
m_SecCount = (int)m_lc.GetFirstSelectedItemPosition()-; //设置选中行一直高亮显示
m_lc.SetItemState(m_SecCount,LVIS_DROPHILITED,LVIF_STATE); //取消在失去高亮时候选中行的高亮显示
m_lc.SetItemState(m_SecCount,FALSE,LVIF_STATE);

--16.单击ListControl获取行号

 /添加响应NM_CLICK消息

 void CEventAddDlg::OnNMClickListEventselect(NMHDR *pNMHDR, LRESULT *pResult)
{
  LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast(pNMHDR) ;
  int nItem = - ;
8   if( pNMItemActivate != NULL )
9   {
10     nItem = pNMItemActivate->iItem ; // To get selected RAW NUM
  }
12   *pResult = ;
13 }

2.编辑框Edit Control

编辑框的通知消息

  编辑框发生某些事件时会向父窗口发送通知消息。在对话框模板中的编辑框上点右键,选择“Add Event Handler”,为编辑框添加消息处理函数时,可以在“Message type”列表中看到这些消息。下面简单介绍编辑框的部分通知消息。

  EN_CHANGE:编辑框的内容被用户改变了,与EN_UPDATE 不同,该消息是在编辑框显示的正文被刷新后才发出的
       EN_ERRSPACE: 编辑框控件无法申请足够的动态内存来满足需要
       EN_HSCROLL: 用户在水平滚动条上单击鼠标
       EN_KILLFOCUS: 编辑框失去输入焦点
       EN_MAXTEXT:输入的字符超过了规定的最大字符数。在没有ES_AUTOHSCROLL 或
       ES_AUTOVSCROLL: 的编辑框中,当正文超出了编辑框的边框时也会发出该消息
       EN_SETFOCUS: 编辑框获得输入焦点
       EN_UPDATE: 在编辑框准备显示改变了的正文时发送该消息
       EN_VSCROLL: 用户在垂直滚动条上单击鼠标

编辑框的创建

  MFC为编辑框提供了CEdit类。编辑框的所有操作都封装到了CEdit类中。

  与静态文本框的创建类似,除了可以在对话框模板上拖进一个编辑框,然后关联一个变量或通过API函数使用,也可以在程序中动态创建编辑框,即调用CEdit类的成员函数Create。Create成员函数的原型如下:

virtual BOOL Create(
DWORD dwStyle,
const RECT& rect,
CWnd* pParentWnd,
UINT nID
);

  参数说明:

  dwStyle:指定编辑框的风格。可以是MSDN中“edit styles”包含风格的任意组合。下面是“edit styles”的所有风格说明。

ES_AUTOHSCROLL:当用户在行尾键入一个字符时,正文将自动向右滚动10 个字符,当用户按回车键时,正文总是滚向左边
       ES_AUTOVSCROLL: 当用户在最后一个可见行按回车键时,正文向上滚动一页
       ES_CENTER: 在多行编辑框中使正文居中
       ES_LEFT :左对齐正文
       ES_LOWERCASE: 把用户输入的字母统统转换成小写字母
       ES_MULTILINE:指定一个多行编辑器。若多行编辑器不指定ES_AUTOHSCROLL 风格,则会自动换行,若不指定ES_AUTOVSCROLL,则多行编辑器会在窗口中正文装满时
  发出警告声响
       ES_NOHIDESEL:默认时,当编辑框失去输入焦点后会隐藏所选的正文,当获得输入焦点时又显示出来。设置该风格可禁止这种默认行为
       ES_NUMBER :编辑框中只允许输入数字
       ES_OEMCONVERT:使编辑框中的正文可以在ANSI 字符集和OEM 字符集之间相互转换。这在编辑框中包含文件名时是很有用的
       ES_PASSWORD: 使所有键入的字符都用“*”来显示
       ES_READONLY: 将编辑框设置成只读的
       ES_RIGHT :右对齐正文
       ES_UPPERCASE: 把用户输入的字母统统转换成大写字母
       ES_WANTRETURN:使多行编辑器接收回车键输入并换行。如果不指定该风格,按回车键会选择默认的命令按钮,这往往会导致对话框的关闭

除了上面的风格外,编辑款一般还会设置WS_CHILD、WS_VISIBLE、WS_BORDER等窗口风格。另外,编辑框可以是多行的,也就是在编辑框中显示多行文字,这就需要设置ES_MULTILINE风格,如果想要多行编辑框支持回车键,

  则还要设置ES_WANTRETURN。

对于在对话框模板中创建的编辑框,它的属性中包含了上述的风格,例如,Multiline属性对应的就是ES_MULTILINE风格,Want Return属性对应ES_WANTRETURN风格。

其他三个参数与静态文本框的Create函数的参数类似,就不介绍了。

CEdit类的主要成员函数

    使用编辑框最重要的莫过于,获取和设置编辑框中的正文,它们对应的成员函数分别是GetWindowText和SetWindowText,这两个函数都是继承自CWnd类的成员函数,

  另外,还可以使用CWnd类的GetWindowTextLength函数获取编辑框中正文的长度。

    下面简单介绍CEdit类的其他几个主要的成员函数:

   int LineFromChar(int nIndex = –1) const;

  返回多行编辑框中指定索引的字符所在行的行号(从零开始),只适用于多行编辑框。nIndex等于-1则返回所选择正文的第一个字符所在行的索引。如果没有选择正文,则返回当前行的行号。

  int LineIndex(int nLine = –1) const;

  返回由nLine指定行的起始字符在编辑框的整个字符串中的索引,只适用于多行编辑框。如果指定行超过编辑框的最大行数,则返回-1,而如果nLine为-1,则返回当前插入符所在行的起始字符的索引。

  void GetSel(int& nStartChar,int& nEndChar) const;

  获取选择正文的索引范围。nStartChar返回被选择正文的起始索引,nEndChar返回被选择正文的终止索引(不包括在选择范围内)。如果没有选择正文,则两者均为当前插入符的索引。

  void SetSel(int nStartChar,int nEndChar,BOOL bNoScroll=FALSE);

  选择编辑框中的正文。nStartChar为选择开始处的索引,nEndChar为选择结束处的索引。如果nStartChar为0并且nEndChar为-1,则选择所有正文,而如果nStartChar为-1则取消所有选择。bNoScroll为FALSE时滚动插入符并使之可见,为TRUE时不滚动。

  void ReplaceSel(LPCTSTR lpszNewText,BOOL bCanUndo = FALSE);

  用lpszNewText指向的字符串来替换选择的正文。如果bCanUndo为TRUE则替换可以被撤销。

   int GetLineCount() const;

  获取正文的行数,只适用于多行编辑框。如果编辑框没有正文则返回1。

  int LineLength( int nLine = –1 ) const;

获取指定字符索引所在行的字节长度(行尾的回车和换行符不计算在内),参数nLine 说明了为字符索引。如果nLine 的值为-1,则函数返回当前行的长度(假如没有正文被选择),或选择正文占据的行的字符总数减去选择正文的字符数(假如有正文被选择)。若用于单行编辑框,则函数返回整个正文的长度。

int GetLine( int nIndex, LPTSTR lpszBuffer ) const;
       int GetLine( int nIndex, LPTSTR lpszBuffer, int nMaxLength ) const;

用来获得指定行的正文(不包括行尾的回车和换行符),只适用于多行编辑框。参数nIndex 是行号,lpszBuffer 指向存放正文的缓冲区,nMaxLength 规定了拷贝的最大字节数。若指定的行号小于编辑框的实际行数,函数返回实际拷贝的字节数,若指定的行号大于编辑框的实际行数,则函数返回0。需要注意的是,GetLine 函数不会在缓冲区中字符串的末尾添加字符串结束符(NULL)。

UINT GetLimitText( ) const;

获取编辑框能够接受的正文的最大字节数。

void LimitText(int nChars = 0);

设置用户在编辑框中可以输入的正文的最大长度(字节数)。如果nChars为0,则最大长度为UINT_MAX个字节。

3.字符转换

  1. CString向char类型转换

         CString str = "hello";
string st = (string)(CStringA)str;
int len = st.length();
char* ch = (char*)malloc(len); //动态申请char*大小的空间
for(int i = ; i <len ; i++)
{
ch[i] = st[i];
}
ch[len] = '\0';

  2. int向CString类型的转换

 /*若转换时Format函数第一个参数报错可能是因为项目字符集有问题,可以修改为“使用多字节字符集”;或者将参数"%d"改为_T("%d")*/

     int myInt;//目标int类型
CString myCString;//目标CString类型
myCString.Format("%d",myInt); /*转换函数,有两个参数(前一个%d表示十进制正数,不加则不能将myInt格式为CString;第二个参数即为需要转换的int类型变量)*/ Formt简单介绍:
有俩种形式,分别是俩个参数和三个参数,三个参数的线程安全但是不常用,俩个参数的较为常用,需要着重掌握。

  3. CString向int类型转换

 int myInt;//目标int类型
CString myCString;//目标CString类型
myInt= _ttoi(myCString);

  4. int向string类型转换

//使用C++函数std::to_string可以实现转换,std::to_string不但可以将int转换成string,对于常用的基本数据类型都能进行转换,如float、double、long等。

int myInt;//目标int类型
string to_string (myInt);

  5. string向int类型转换

std::string str;  //目标string类型
int myInt = std::stoi(str);

  6. char向CString类型转换

//产生两个个随机长度的key字符数组
char * key = test->genRandomString();
char * value = test->genRandomString();
//DO SOMETHING 对数据进行操作
………………
char temp[];
//将字符数组,key,value按照一定的格式要求,连接起来
sprintf(temp,"%s%s%s%s%s%s","Key:",key,"------","Value",value,"插入成功!");
//生成我们需要的CString对象
CString str(temp);

MFC总结的更多相关文章

  1. vs2010静态链接MFC库报链接错误

    由于需要将MFC程序在其它电脑上运行,所以需要将动态链接的MFC改成静态链接,本以为很简单,没想到链接的时候出现下面的链接错误: uafxcw.lib(afxmem.obj) : error LNK2 ...

  2. MFC中成员变量的声明顺序与析构顺序

    第一次用博客,第一篇随笔,就写今天遇到的一个问题吧. 在VS2008的MFC对话框程序,窗口成员变量的声明顺序与其析构顺序相反,即,先声明的变量后析构,后声明的变量先析构.未在其他模式下测试. cla ...

  3. VC中的MFC到底是什么?

    1. 微软基础类库(英语:Microsoft Foundation Classes,简称MFC)是一个微软公司提供的类库(class libraries),以C++类的形式封装了Windows API ...

  4. MFC&Halcon之实时视频监控

    上一篇实现了在MFC的窗体内显示图片,本篇介绍如何在MFC窗体内实时显示摄像头的影像. 要实现的功能是点击一个“开始”按钮,可以显示影像,再点击“停止”按钮,可以停止显示. 因为实时显示影像需要在一个 ...

  5. MFC快速入门 - 菜单

    本文仅用于学习交流,商业用途请支持正版!转载请注明:http://www.cnblogs.com/mxbs/p/6231104.html 打开VS2010,依次打开File – New – Proje ...

  6. MFC画线功能总结

    本文仅用于学习交流,商业用途请支持正版!转载请注明:http://www.cnblogs.com/mxbs/p/6216464.html MFC画线功能要点有二:其一,鼠标按下时记录初始位置为线的起始 ...

  7. MFC消息映射机制以及画线功能实现

    ---此仅供用于学习交流,切勿用于商业用途,转载请注明http://www.cnblogs.com/mxbs/p/6213404.html. 利用VS2010创建一个单文档标准MFC工程,工程名为Dr ...

  8. mfc+vtk

    MFC中view类主要处理显示视图,doc类处理文档,mainframe主要为整个窗口的和工程的设置管理.由此,VTK与MFC联合编程时,需要主要的是数据操作,以及显示要很好的与MFC中的结构结合,做 ...

  9. 共享MFC dULL

    >------ 已启动生成: 项目: OSGtest, 配置: Debug Win32 ------1>正在编译...1>AddScene.cpp1>main.cpp1> ...

  10. VC++/MFC 最常用宏和指令

    1.#include指令  包含指定的文件,最基本的最熟悉的指令,编程中不得不用,包含库文件用双尖括号,包含自定义头文件用双引号. 2.#define指令   预定义,通常用它来定义常量(包括无参量与 ...

随机推荐

  1. freeRTOS学习一

    freeRTOS中的链表结构: /* * Definition of the only type of object that a list can contain. 链表中的节点 */ struct ...

  2. python脚本调用外部程序的若干种方式以及利弊

    脚本执行外部程序的常用几种方式: # os.popen(path)# subprocess.run(cmd,shell=True)# subprocess.check_call(cmd,shell = ...

  3. Netty源码之解码中两种数据积累器(Cumulator)的区别

    上一篇随笔中已经介绍了解码核心工作流程,里面有个数据积累器的存在(Cumulator),其实解码中有两种Cumulator,那他们的区别是什么呢? 还是先打开ByteToMessageDecoder的 ...

  4. Java实现AES对称加密算法

    Java代码实现 import java.security.SecureRandom; import javax.crypto.Cipher; import javax.crypto.KeyGener ...

  5. 2019年9月训练(贰)区间DP (luogu 4290)

    区间DP luogu 4290 明显的区间DP. 定义 dp[l][r][k]/*表示区间[l,r]能否凑成k(W,I,N,G)字符*/mp['W']=1;mp['I']=2;mp['N']=3;mp ...

  6. 图论+思维(2019牛客国庆集训派对day2)

    题意:https://ac.nowcoder.com/acm/contest/1107/J n个点的完全图编号0-n-1,第i个点的权值为2^i,原先是先手选取一些边,然后后手选取一些点,满足先手选取 ...

  7. tp5 post接到的json被转义 问题解决

    今天做项目的时候前端需要可以保存可变数据, 然后原样返回给前端 接口 $data =input('post.');//用户唯一标识$goods = $data['goods']; $shopcuxia ...

  8. Asp.net core Identity + identity server + angular + odata + 权限管理

    今天踩了一个坑. 网站发布后看到了一个 error Refused to execute inline script because it violates the following Content ...

  9. oracle创建用户表空间

    --本次因工作需要,为其他部门提供部分表数据,创建一个新用户与表空间.--system用户下drop user sys_outside cascade;drop tablespace sys_outs ...

  10. Java开发自动售货机

    1:先写一个类,包括商品的基本属性 package com.xt.java.base25; public class Goods { private int ID; private String na ...