如何双击clistctrl 高度弹出一个新的对话框并把ListCtrl中的某一项字段内容传到弹出的新对话框中的编辑框?

5745人阅读
MFC CListCtrl的用法.Style/插入、删除、选中数据及排序问题等
摘抄自:/fclshark/blog/item/650cbaa731bdc.html
功能强大的CListCtrl:做网络笔记,还需添加修改CListCtrl改变行的颜色,列的颜色,字体颜色等.
资源属性里面有个sort设置排序的,如果不小心选了Ascending,那么你insertItem的顺序就就1,10,11,12,13,14,15,16,17,18,19,2,20,21....所以要注意.首先使用下面的语句设置CListCtrl的style:DWORD
SetExtendedStyle( DWORD dwNewStyle );其中LVS_EX_CHECKBOXES
表示添加CheckBoxLVS_EX_FULLROWSELECT 表示选择整行LVS_EX_GRIDLINES 表示添加表格线
如果设置了LVS_EX_CHECKBOXES属性,则可以用BOOL GetCheck( int nItem )
来得到某一行是否Checked。
可以先用下面的语句来删除以前的东西:for(int k=2;k&=0;k--)
//注意要从后往前删,否则出错m_ListCtrl.DeleteColumn(k);m_ListCtrl.DeleteAllItems();
用下面的语句新建列:m_ListCtrl.InsertColumn(0,_T("文件名"),LVCFMT_IMAGE|LVCFMT_LEFT);m_ListCtrl.InsertColumn(1,_T("仪器类别"));m_ListCtrl.InsertColumn(2,_T("项目类别"));其中LVCFMT_IMAGE表示可以在第一列加入图标。如果不要图标可以删去。
然后设置列宽:for(j=0;j&3;j++)m_ListCtrl.SetColumnWidth(j
,100);以下为列表加入图标,如果不需要图标,可以跳过这一步。注意只在第一次加入,如果多次加入会出错!先在头文件中加入声明:CImageList
m_ImageL这是必要的,如果在cpp的某个函数中加入由于生命期结束,CImageList自动释放,则效果是列表中看不到图标,只看到一个白方块。下面生成CImageList,并将其绑定到CListCtrl中,这是CImageList中还没有图标,只是一个容器:static
int flag=2;if(flag==2){//只调用一次SetImageList,否则出错m_ImageList.Create(128,
128, ILC_COLORDDB|ILC_MASK, 20, 1);
m_ListCtrl.SetImageList(&m_ImageList,LVSIL_SMALL);}flag=(flag+1)%2;如果CListCtrl已经用过,曾经加过图标进去,这时就要删除上次放进m_ImageList中的Imagefor(int
kk=0;kk&m_ImageList.GetImageCount();kk++)m_ImageList.Remove(k);下面介绍如何向CListCtrl里面加入行,并同时为每一行动态加入图标:假设m_listRowCount为要加入的行数。CBitmap*
bitmap=new CBitmap[m_list1rowCount];HBITMAP
for(int i = 0; i & m_listRowC
i++){//为每一行插入相应的缩略图CFCFileE if(
!f.Open(m_FileName, CFile::modeRead, &e )){ //m_FileName为bmp文件名,由你来定&&
hbitmap = (HBITMAP)LoadImage(NULL,path+"blank.bmp",IMAGE_BITMAP,0,0,&&&
LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);}else{&&
f.Close();&& hbitmap =
(HBITMAP)LoadImage(NULL,bmpFile,IMAGE_BITMAP,0,0,&&&
LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);}bitmap[i].Attach(hbitmap);m_ImageList.Add(&bitmap[i],
RGB(0, 128,
128));//插入行m_ListCtrl.InsertItem(i,m_FileName,i);m_ListCtrl.SetItemText(i,1,type);m_ListCtrl.SetItemText(i,2,m_Path);}//记得删除已经没用的临时文件if(m_list1rowCount!=0)delete[]
2。如果是ICON类型的CListCtrl,则要做一点点改动:把绑定图标集的代码由SetImageList(&m_ImageList,LVSIL_SMALL);改为SetImageList(&m_ImageList,LVSIL_NORMAL);
插入行时只用InsertItem(i,mainSet.m_FileName,i);不用SetItemText(i,1,type);之类的代码。
1. ListCtrl 风格&&&&& LVS_ICON:
为每个item显示大图标&&&&& LVS_SMALLICON: 为每个item显示小图标&&&&& LVS_LIST:
显示一列带有小图标的item&&&&& LVS_REPORT: 显示item详细资料
&&&&& 直观的理解:windows资源管理器,&查看&标签下的&大图标,小图标,列表,详细资料&
--------------------------------------------------------------------------------
2. 设置listctrl 风格及扩展风格&&&&& LONG
lS&&&&& 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);
//设置扩展风格
--------------------------------------------------------------------------------
3. 插入数据&&&&& m_list.InsertColumn( 0, "ID",
LVCFMT_LEFT, 40 );//插入列&&&&& m_list.InsertColumn( 1, "NAME", LVCFMT_LEFT, 50
);&&&&& int nRow = m_list.InsertItem(0, &11&);//插入行&&&&&
m_list.SetItemText(nRow, 1, &jacky&);//设置数据
--------------------------------------------------------------------------------
4. 一直选中item&&& 选中style中的Show selection
always,或者在上面第2点中设置LVS_SHOWSELALWAYS
--------------------------------------------------------------------------------
5. 选中和取消选中一行&&& int nIndex = 0;&&&
//选中&&& m_list.SetItemState(nIndex, LVIS_SELECTED|LVIS_FOCUSED,
LVIS_SELECTED|LVIS_FOCUSED);&&& //取消选中&&& m_list.SetItemState(nIndex, 0,
LVIS_SELECTED|LVIS_FOCUSED);--------------------------------------------------------------------------------
6. 得到listctrl中所有行的checkbox的状态&&&&&
m_list.SetExtendedStyle(LVS_EX_CHECKBOXES);&&&&& CS&&&&&
for(int i=0; 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);&&&&&&&&&& }&&&&& }
--------------------------------------------------------------------------------
7. 得到listctrl中所有选中行的序号
&&&&& 方法一:&&&&& CS&&&&& for(int i=0;
i&m_list.GetItemCount(); i++)&&&&& {&&&&&&&&&& if(
m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED )&&&&&&&&&&
{&&&&&&&&&&&&&&& str.Format(_T("选中了第%d行"), i);&&&&&&&&&&&&&&&
AfxMessageBox(str);&&&&&&&&&& }&&&&& }
&&&&& 方法二:&&&&& POSITION pos =
m_list.GetFirstSelectedItemPosition();&&&&& if (pos == NULL)&&&&&&&&&&
TRACE0("No items were selected!/n");&&&&& else&&&&& {&&&&&&&&&&
while (pos)&&&&&&&&&& {&&&&&&&&&&&&&&& int nItem =
m_list.GetNextSelectedItem(pos);&&&&&&&&&&&&&&& TRACE1("Item %d was
selected!/n", nItem);&&&&&&&&&&&&&&& // you could do your own processing on
nItem here&&&&&&&&&& }&&&&& }
--------------------------------------------------------------------------------
8. 得到item的信息&&&&& TCHAR
szBuf[1024];&&&&& LVITEM&&&&& lvi.iItem = nItemI&&&&&
lvi.iSubItem = 0;&&&&& lvi.mask = LVIF_TEXT;&&&&& lvi.pszText =
szB&&&&& lvi.cchTextMax = 1024;&&&&&
m_list.GetItem(&lvi);
--------------------------------------------------------------------------------
9. 得到listctrl的所有列的header字符串内容&&&&& LVCOLUMN
&&&&& char str[256];&&&&& int&& nColN&&&&& CString
strColumnName[4];//假如有4列
&&&&& nColNum = 0;&&&&& lvcol.mask = LVCF_TEXT;&&&&&
lvcol.pszText =&&&&& lvcol.cchTextMax = 256;&&&&&
while(m_list.GetColumn(nColNum, &lvcol))&&&&& { &&&&&&&&&&
strColumnName[nColNum] = lvcol.pszT&&&&&&&&&& nColNum++;&&&&&
--------------------------------------------------------------------------------
10. 使listctrl中一项可见,即滚动滚动条&&&
m_list.EnsureVisible(i, FALSE);
--------------------------------------------------------------------------------
11. 得到listctrl列数&&& int nHeadNum =
m_list.GetHeaderCtrl()-&GetItemCount();
--------------------------------------------------------------------------------
12. 删除所有列&&&&& 方法一:&&&&&&&& while (
m_list.DeleteColumn (0))&&&&&& 因为你删除了第一列后,后面的列会依次向上移动。
&&&&& 方法二:&&&&& int nColumns = 4;&&&&& for (int
i=nColumns-1; i&=0; i--)&&&&&&&&& m_list.DeleteColumn (i);
--------------------------------------------------------------------------------
13. 得到单击的listctrl的行列号&&&&&
添加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.pt =&&&&&&&&&& lvinfo.flags =
LVHT_ABOVE;&&&& &&&&&&&&&& int nItem =
m_list.SubItemHitTest(&lvinfo);&&&&&&&&&& if(nItem != -1)&&&&&&&&&&
{&&&&&&&&&&&&&&& CS&&&&&&&&&&&&&&&
strtemp.Format("单击的是第%d行第%d列", lvinfo.iItem,
lvinfo.iSubItem);&&&&&&&&&&&&&&& AfxMessageBox(strtemp);&&&&&&&&&&
}&&&&&&&&& */&& &&&&&&&&& // 方法二:&&&&&&&&& /*&&&&&&&&&&
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;&&&&&&&&&&
if(pNMListView-&iItem != -1)&&&&&&&&&& {&&&&&&&&&&&&&&& CString
&&&&&&&&&&&&&&&
strtemp.Format("单击的是第%d行第%d列",&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
pNMListView-&iItem, pNMListView-&iSubItem);&&&&&&&&&&&&&&&
AfxMessageBox(strtemp);&&&&&&&&&& }&&&&&&&&& */&&&&&&&&&& *pResult =
--------------------------------------------------------------------------------
14. 判断是否点击在listctrl的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.pt =&&&&&&&&&&
lvinfo.flags = LVHT_ABOVE;&&&& &&&&&&&&&& UINT nF&&&&&&&&&& int
nItem = m_list.HitTest(point, &nFlag);&&&&&&&&&&
//判断是否点在checkbox上&&&&&&&&&& if(nFlag == LVHT_ONITEMSTATEICON)&&&&&&&&&&
{&&&&&&&&&&&&&&& AfxMessageBox("点在listctrl的checkbox上");&&&&&&&&&& }
&&&&&&&&&& *pResult = 0;&&&&& }
--------------------------------------------------------------------------------
15. 右键点击listctrl的item弹出菜单&&&&&
添加listctrl控件的NM_RCLICK消息相应函数&&&&& void CTest6Dlg::OnRclickList1(NMHDR*
pNMHDR, LRESULT* pResult)&&&&& {&&&&&&&&&& NM_LISTVIEW* pNMListView =
(NM_LISTVIEW*)pNMHDR;&&&&&&&&&& if(pNMListView-&iItem !=
-1)&&&&&&&&&& {&&&&&&&&&&&&&&& DWORD dwPos =
GetMessagePos();&&&&&&&&&&&&&&& CPoint point( LOWORD(dwPos), HIWORD(dwPos)
);&&& &&&&&&&&&&&&&&& CM&&&&&&&&&&&&&&& VERIFY(
menu.LoadMenu( IDR_MENU1 ) );&&&&&&&&&&&&&&& CMenu* popup =
menu.GetSubMenu(0);&&&&&&&&&&&&&&& ASSERT( popup != NULL
);&&&&&&&&&&&&&&& popup-&TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,
point.x, point.y, this );&&&&&&&&&& } &&&&&&&&&& *pResult =
--------------------------------------------------------------------------------
item切换焦点时(包括用键盘和鼠标切换item时),状态的一些变化顺序&&&&&
添加listctrl控件的LVN_ITEMCHANGED消息相应函数&&&&& void
CTest6Dlg::OnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult)&&&&&
{&&&&&&&&&& NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;&&&&&&&&&&
// TODO: Add your control notification handler code here&&& &&&&&&&&&&
CString sT&&&&&&&&&& if((pNMListView-&uOldState &
LVIS_FOCUSED) == LVIS_FOCUSED && &&&&&&&&&&&
(pNMListView-&uNewState & LVIS_FOCUSED) == 0)&&&&&&&&&&
{&&&&&&&&&&&&&&& sTemp.Format("%d losted
focus",pNMListView-&iItem);&&&&&&&&&& }&&&&&&&&&& else
if((pNMListView-&uOldState & LVIS_FOCUSED) == 0
&&&&&&&&&&&&&&&& (pNMListView-&uNewState & LVIS_FOCUSED) ==
LVIS_FOCUSED)&&&&&&&&&& {&&&&&&&&&&&&&&& sTemp.Format("%d got
focus",pNMListView-&iItem);&&&&&&&&&& } &&&&&&&&&&
if((pNMListView-&uOldState & LVIS_SELECTED) == LVIS_SELECTED
&&&&&&&&&&&&& (pNMListView-&uNewState & LVIS_SELECTED) ==
0)&&&&&&&&&& {&&&&&&&&&&&&&&& sTemp.Format("%d losted
selected",pNMListView-&iItem);&&&&&&&&&& }&&&&&&&&&& else
if((pNMListView-&uOldState & LVIS_SELECTED) == 0
&&&&&&&&&&&&& (pNMListView-&uNewState & LVIS_SELECTED) ==
LVIS_SELECTED)&&&&&&&&&& {&&&&&&&&&&&&&&& sTemp.Format("%d got
selected",pNMListView-&iItem);&&&&&&&&&& }&&& &&&&&&&&&& *pResult
= 0;&&&&& }
--------------------------------------------------------------------------------
17. listctrl的 subitem 添加图标
&&&&&&注意: 首先要用
InsertItem() 插入一行的第一列, 然后才能用 SetItem 设置其他项 &&&&&
m_list.SetExtendedStyle(LVS_EX_SUBITEMIMAGES);&&&&&
m_userlist.SetItem(..);
--------------------------------------------------------------------------------
18. 在CListCtrl显示文件,并根据文件类型来显示图标&&&&&
网上找到的代码,自己试用并改正过, share
步骤1: 设置 list 的图像列表为 系统图像列表&&&
BOOL SetSystemImageList( CListCtrl & list ){&& &&
HIMAGELIST himlSHIMAGELIST himlLSHFILEINFOchar
cSysDir[MAX_PATH];CString strB
memset(cSysDir, 0, MAX_PATH);
GetWindowsDirectory(cSysDir, MAX_PATH);strBuf = cSysDir
;// SHGetFileInfo:// If uFlags
contains SHGFI_SYSICONINDEX, the return value is a handle to // an image
list that contains the large icon images. // If SHGFI_SMALLICON is included
with SHGFI_SYSICONINDEX, the return value // is the handle to an image list
that contains the small icon images.//
himlSmall = (HIMAGELIST)SHGetFileInfo ( (LPCSTR)cSysDir,
&&&&& 0, &&&&& &sfi, &&&&& sizeof(SHFILEINFO), &&&&&
SHGFI_SYSICONINDEX | SHGFI_SMALLICON );
himlLarge = (HIMAGELIST)SHGetFileInfo((LPCSTR)cSysDir, &&&&&
0, &&&&& &sfi, &&&&& sizeof(SHFILEINFO), &&&&&
SHGFI_SYSICONINDEX | SHGFI_LARGEICON);
if (himlSmall && himlLarge){&&
::SendMessage(list.m_hWnd, LVM_SETIMAGELIST, &&&&&& (WPARAM)LVSIL_SMALL,
(LPARAM)himlSmall);&&&& ::SendMessage(list.m_hWnd, LVM_SETIMAGELIST,
&&&&&& (WPARAM)LVSIL_NORMAL, (LPARAM)himlLarge);}
return TRUE;}步骤2: 给列表添加指定的文件, 同时获得该文件的的图标索引, 给 list
int GetIconIndex(LPCTSTR lpszPath, BOOL bIsDir, BOOL bSelected)
; // 向前声明void
AddFiles(CListCtrl & list, LPCTSTR lpszFileName, BOOL
bAddToDocument){int nIcon = GetIconIndex(lpszFileName, FALSE,
TRUE);CString strSCFileF
// get file sizeif (
filefind.FindFile(lpszFileName)){&& filefind.FindNextFile();&&
strSize.Format("%d", filefind.GetLength());}else&& strSize =
// split path and filenameCString strFileName
= lpszFileNCString strP
int nPos = strFileName.ReverseFind('//');if (nPos != -1){&&
strPath = strFileName.Left(nPos);&& strFileName = strFileName.Mid(nPos +
// insert to listint nItem =
list.GetItemCount();//list.InsertItem(nItem, strFileName,
nIcon);//list.SetItemText(nItem, 1, strSize);////
此处可以根据实际需要修改代码//}
--------------------------------------------------------------------------------
19. listctrl内容进行大数据量更新时,避免闪烁&&&&&
m_list.SetRedraw(FALSE);&&&&& //更新内容&&&&&
m_list.SetRedraw(TRUE);&&&&& m_list.Invalidate();&&&&&
m_list.UpdateWindow();
20. 清除 ListCtrl 以重新初始化:
&&&&&& // 删除所有行m_ctrllist.DeleteAllItems() ;&&&& //
删除所有列int iColCount = m_ctrllist.GetHeaderCtrl()-&GetItemCount()
;// 方法 1// 原理: 删除第一列后, 其他列向前移动while( m_ctrllist.DeleteColumn(0)
) ;&&& // 方法 2for (int i=0; i & iColC i++){&&
m_ctrllist.DeleteColumn(0); }
// 方法 3for (int i=iColCount-1; i &= 0; i-- ){&&
m_ctrllist.DeleteColumn( i );&
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:43687次
排名:千里之外
原创:10篇
转载:23篇
评论:14条
(1)(1)(3)(1)(1)(2)(2)(3)(6)(13)当前位置:
修改一个完全颜色的CListCtrl类
修改一个完全颜色的CListCtrl类
发布日期: 11:08
浏览次数:4264次
标  签:windows
文章评分:5.0
操  作:
称号:未设置简介:...
文章概要:
在使用CListCtrl控件的过程中,我们会发现使用及其不方便,特别是在使用“report"显示模式时, 想给指定条目添加背景颜色,CListCtrl控件所提供的设置颜色函数只能使得控件的界面变得好看一些,根本不能满足我们的要求,我们无法把特定的一项或几项添加上不同的颜色以示区别。 幸运的是很多VC的使用者在改造CListCtrl类,使之更加功能强大上做了很多工作,开发出了各种各样的继承类来实现这个功能,Sven Freitag 就是其中的一员。他开发出了CListCtrl的继承类CColorListCtrl来实现给指定的条目加背景色的功能,并无偿的在网上公布给VC的使用者,我在源代码中收集了他的源程序,各位读者可以先阅读学习一下。
在使用CListCtrl控件的过程中,我们会发现使用及其不方便,特别是在使用“report"显示模式时, 想给指定条目添加背景颜色,CListCtrl控件所提供的设置颜色函数只能使得控件的界面变得好看一些,根本不能满足我们的要求,我们无法把特定的一项或几项添加上不同的颜色以示区别。 幸运的是很多VC的使用者在改造CListCtrl类,使之更加功能强大上做了很多工作,开发出了各种各样的继承类来实现这个功能,Sven Freitag 就是其中的一员。他开发出了CListCtrl的继承类CColorListCtrl来实现给指定的条目加背景色的功能,并无偿的在网上公布给VC的使用者,我在源代码中收集了他的源程序,各位读者可以先阅读学习一下。
CColorListCtrl类示例代码运行效果如下图所示:
怎样使用CColorListCtrl类:
1、把下面的文件加入你的工程中去:
ColorListCtrl.h
ColorListCtrl.cpp
2、在对话框头文件中加入ColorListCtrl.h的说明,然后用CColorListCtrl代替CListCtrl声明成员变量。
3、具体的使用方法,请看示例代码中的ColoredListCtrlDlg.cpp文件。
CColorListCtrl类存在的不足:
在使用CColorListCtrl类的过程中,我体会到了随意添加条目颜色的乐趣,但同时也发现它存在的一些不足之处。下面我列出color.h和color.cpp文件代码来进行分析。color.h源代码如下所示:
// Author: SFr frydaysoft@gmx.de
#ifndef AFX_COLOR_H__9FC7D36B_FC88_42FD_8DAA_2FBA__INCLUDED_
#define AFX_COLOR_H__9FC7D36B_FC88_42FD_8DAA_2FBA__INCLUDED_
#include "windows.h"
typedef enum
DEF_BACKGROUND=0, DEF_TEXT, DEF_SELBACKGROUND, DEF_SELTEXT, DEF_DESELBACKGROUND, DEF_DESELTEXT,
BLACK,BLUE,GREEN,CYAN,RED,
MANGENTA,YELLOW,WHITE,DARKBLUE,DARKGREEN,
BLUEGREEN,BROWN,PURPUR,OLIV,DARKGRAY,
LIGHTGRAY,LIGHTBLUE,DARKWHITE,MIDDLEGRAY
ITEM_COLOR;
typedef struct
char str[50];
ITEM_COLOR
#define COLLIST_MAX 25
extern ColorList colList[COLLIST_MAX];
COLORREF GetColorRef(ITEM_COLOR lParam);
color.cpp源代码如下所示:
// Author: SFr frydaysoft@gmx.de
#include "stdafx.h"
#include "color.h"
ColorList colList[COLLIST_MAX]=
{"DEF_BACKGROUND",DEF_BACKGROUND},
{"DEF_TEXT",DEF_TEXT},
{"DEF_SELBACKGROUND",DEF_SELBACKGROUND},
{"DEF_SELTEXT",DEF_SELTEXT},
{"DEF_DESELBACKGROUND",DEF_DESELBACKGROUND},
{"DEF_DESELTEXT",DEF_DESELTEXT},
{"BLACK",BLACK},
{"BLUE",BLUE},
{"GREEN",GREEN},
{"CYAN",CYAN},
{"RED",RED},
{"MANGENTA",MANGENTA},
{"YELLOW",YELLOW},
{"WHITE",WHITE},
{"DARKBLUE",DARKBLUE},
{"DARKGREEN",DARKGREEN},
{"BLUEGREEN",BLUEGREEN},
{"BROWN",BROWN},
{"PURPUR",PURPUR},
{"OLIV",OLIV},
{"DARKGRAY",DARKGRAY},
{"LIGHTGRAY",LIGHTGRAY},
{"LIGHTBLUE",LIGHTBLUE},
{"DARKWHITE",DARKWHITE},
{"MIDDLEGRAY",MIDDLEGRAY}
COLORREF GetColorRef(ITEM_COLOR lParam)
switch (lParam)
case DEF_BACKGROUND: return ::GetSysColor(COLOR_WINDOW);
case DEF_TEXT: return ::GetSysColor(COLOR_WINDOWTEXT);
case DEF_SELBACKGROUND: return ::GetSysColor(COLOR_ACTIVECAPTION);
case DEF_SELTEXT: return ::GetSysColor(COLOR_HIGHLIGHTTEXT);
case DEF_DESELBACKGROUND: return ::GetSysColor(COLOR_INACTIVECAPTION);
case DEF_DESELTEXT: return ::GetSysColor(COLOR_INACTIVECAPTIONTEXT );
case BLACK: return RGB(0,0,0); //black
case BLUE: return RGB(0,0,255); //blue
case GREEN: return RGB(0,255,0); //green
case CYAN: return RGB(0,255,255); //cyan
case RED: return RGB(255,0,0); //red
case MANGENTA: return RGB(255,0,255); //mangenta
case YELLOW: return RGB(255,255,0); //yellow
case WHITE: return RGB(255,255,255); //white
case DARKBLUE: return RGB(0,0,128); //dark-blue
case DARKGREEN: return RGB(0,128,0); //dark-green
case BLUEGREEN: return RGB(0,128,128); //blue-green
case BROWN: return RGB(128,0,0); //brown
case PURPUR: return RGB(128,0,128); //purpur
case OLIV: return RGB(128,128,0); //oliv
case DARKGRAY: return RGB(128,128,128); //dark-gray
case LIGHTGRAY: return RGB(192,192,192); //light-gray
case LIGHTBLUE: return RGB(166,202,240); //light-blue
case DARKWHITE: return RGB(255,251,240); //dark-white
case MIDDLEGRAY: return RGB(160,160,164); //middle-gray
default: return RGB(0,128,0); //dark-green
由上述源代码可以看出,CColorListCtrl类给我们提供的可供填充的颜色数量十分有限,只有BLACK,BLUE,GREEN,CYAN,RED,MANGENTA,YELLOW,WHITE,DARKBLUE,DARKGREEN,BLUEGREEN,BROWN,PURPUR,
OLIV,DARKGRAY,LIGHTGRAY,LIGHTBLUE,DARKWHITE,MIDDLEGRAY等几种,完全不能满足我们随时定制自己所需颜色的要求,因此我对这个类进行了一些修改,以使得能随心所欲的填充任何颜色。
对CColorListCtrl类修改的地方如下所示:
1、完全去掉color.h和color.cpp源文件,只把ColorListCtrl.h和ColorListCtrl.cpp源文件导入自己的工程中;
2、把ColorListCtrl.h头文件中的#include"color.h"去掉;
3、在类CMyLParam的定义和函数说明中进行如下修改:
ITEM_COLOR *m_pBackC
ITEM_COLOR *m_pTextC
m_pBackColor=new ITEM_COLOR[column_count];
m_pTextColor=new ITEM_COLOR[column_count];
BOOL SetBackColor(ITEM_COLOR color, int iSub)
if (iSub&m_column_count) {
m_pBackColor[iSub] =
return TRUE;
} else return FALSE;
BOOL SetTextColor(ITEM_COLOR color, int iSub)
if (iSub&m_column_count) {
m_pTextColor[iSub] =
return TRUE;
} else return FALSE; }
COLORREF GetBackColor(int iSub)
if (iSub&m_column_count)
return GetColorRef(m_pBackColor[iSub]);
return GetColorRef(DEF_BACKGROUND);}
COLORREF GetTextColor(int iSub)
if (iSub&m_column_count)
return GetColorRef(m_pTextColor[iSub]);
return GetColorRef(DEF_TEXT);
修改后的代码:
COLORREF *m_pBackC
COLORREF *m_pTextC
m_pBackColor=new COLORREF[column_count];
m_pTextColor=new COLORREF[column_count];
BOOL SetBackColor(COLORREF color, int iSub) {
if (iSub&m_column_count) {
m_pBackColor[iSub] =
return TRUE;
} else return FALSE; }
BOOL SetTextColor(COLORREF color, int iSub)
if (iSub&m_column_count) {
m_pTextColor[iSub] =
return TRUE;
} else return FALSE; }
COLORREF GetBackColor(int iSub)
if (iSub&m_column_count)
return m_pBackColor[iSub];
return ::GetSysColor(COLOR_WINDOW);}
COLORREF GetTextColor(int iSub)
if (iSub&m_column_count)
return m_pTextColor[iSub];
return ::GetSysColor(COLOR_WINDOWTEXT);}
4、在类CColorListCtrl的定义和函数说明中进行如下修改: 源代码:
BOOL SetItemTextColor(ITEM_COLOR color, int Index, int iSub);
BOOL SetItemBackgndColor(ITEM_COLOR color, int Index, int iSub);
BOOL CColorListCtrl::SetItemBackgndColor(ITEM_COLOR color, int Index, int iSub)
BOOL CColorListCtrl::SetItemTextColor(ITEM_COLOR color, int Index, int iSub)
修改后的代码:
BOOL SetItemTextColor(COLORREF color, int Index, int iSub);
BOOL SetItemBackgndColor(COLORREF color, int Index, int iSub);
BOOL CColorListCtrl::SetItemBackgndColor(COLORREF color, int Index, int iSub)
BOOL CColorListCtrl::SetItemTextColor(COLORREF color, int Index, int iSub)
删除的源代码:
// only for TEST
if (ret_index&3)
p-&SetBackColor(ITEM_COLOR(ret_index+BLUE),0);
p-&SetTextColor(ITEM_COLOR(ret_index+RED ),0);
if (ret_index&=6)
p-&SetBackColor(ITEM_COLOR(ret_index+BLUE),1);
p-&SetTextColor(ITEM_COLOR(ret_index+RED ),1);
p-&SetBackColor(ITEM_COLOR((ret_index+BLUE)&0xF),2);
p-&SetTextColor(ITEM_COLOR((ret_index+RED )&0xF),2);
// end: only for TEST
5、替换如下所示的代码:
DEF_BACKGROUND替换成::GetSysColor(COLOR_WINDOW);
DEF_TEXT替换成::GetSysColor(COLOR_WINDOWTEXT);
GetColorRef(DEF_DESELTEXT)替换成::GetSysColor(COLOR_HIGHLIGHTTEXT);
GetColorRef(DEF_SELBACKGROUND)替换成::GetSysColor(COLOR_ACTIVECAPTION);
GetColorRef(DEF_SELTEXT)替换成::GetSysColor(COLOR_HIGHLIGHTTEXT);
GetColorRef(DEF_DESELBACKGROUND)替换成::GetSysColor(COLOR_INACTIVECAPTION);
pDC-&SetTextColor(pMyLParam-&GetTextColor(DEF_DESELTEXT))替换成pDC-&SetTextColor(pMyLParam-&GetTextColor(5));
修改后的示例程序如下图所示,基本功能与原来的程序一样。
本来我还计划把对CListCtrl类的排序功能加入其中,可是到实现的时候才发现异常复杂,因为在CListCtrl控件的“More Style”属性中已选中“Owner draw fixed”选项,对CListCtrl控件颜色的修改实际上是通过自画来实现的,导致了CListCtrl控件某些函数的不可使用,例如InsertItem()等等,我尝试做了一下排序,总是会出现一些无法理解的错误,照我的理解只能把项全部存进列表中,然后对列表进行排序,再清空CListCtrl控件的所有项罗列出已排序的项。如果哪位高手有独到的解决方法,请不吝指教!
vs2010无法显示颜色,求指点
23:26 发表
最多还可以输入100字
【VIP年会员制套餐】
【C/C++软件工程师实战能力集训大纲】
VC知识库发布了C/C++业界的“本草纲目”
【牛人都在千人一号群! 加群三步走!!!】
第一步:请必须加VC知识库QQ: 为好友;
第二步:请必须关注本站微博:
第三步:申请加入群:.(必须将关注微博截屏发到QQ方可通过!)
【最新2013:】
全部100% VC++源码提供: E-Form++全新大型SCADA & HMI解决方案源码、CAD解决方案源码、Gis解决方案源码 、电力石油化工仿真与图形建模解决方案源码、大量其他高级制图VC++源码下载!
【 新视频发布】
o o o o o o o o o o
在VC环境中除了我们所常用的Dialog、Menu和Bitmap等标准资源类型之外,它还支持自定义资源类型(Custom Resource),我们自定义的资源类型能做些什么呢?呵呵,用处多多。...
在VC环境中除了我们所常用的Dialog、Menu和Bitmap等标准资源类型之外,它还支持自定义资源类型(Custom Resource),我们自定义的资源类型能做些什么呢?呵呵,用处多多。...
本文介绍了套接字编程的基本知识。...}

我要回帖

更多关于 clistctrl 高度 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信