让你的软件界面更漂亮(六)仿QQ主界面之ListCtrl
2008-01-19 20:25:25 来源:WEB开发网二、打开Visual Studio C++ (6.0),新建工程。(本文的目的是实现自绘 ListCtrl 的,实现过程下面会详细介绍)
a. 首先,生成一个新类名为CMyListCtrl. 其基类为CListCtrl. 这部分工作用ClassWizard很容易完成。
b. 添加相关消息及处理函数,OnPaint() ;OnMouseMove();OnHScroll();OnVScroll等,这部工作用ClassWizard同样很容易完成。编译通过后,接着往下看。
c. 在.h文件顶部定义用户信息结构struct LUSERITEM
d. 在.h文件顶部定义一些常量标志
#define TVS_VIDEO 0x00000001 //有视频设备标志
e.添加成员变量 及并在构造函数中初始化
#define TVS_MOBILEMSG 0x00000002 //可用手机SMS标志
#define TVS_NETDISK 0x00000004
#define TVS_LEADER 0x00000008
#define TVS_VICELEADER 0x00000010
#define TVS_ONLINEUSER 0x00000020CFont* m_pFont; //用于创建选择字体
BOOL m_bOverImage;
BOOL m_bOverVedio;
BOOL m_bOverMobile;
DEQUELVITEM m_DequeList; //用户信息链表
HICON m_hTailIconA; //vido flag
HICON m_hTailIconB; //mobil message flag
HICON m_hTailIconC;
HBITMAP m_hBackBitmap; //背景
f.添加部分成员函数
重载InsertItem函数,用于增加Item同时增加用户信息。
InsertItem(int nItem, LPCTSTR szItemText, int nImageIndex, LUSERITEM* UserInfo)
添加设置显示图标函数,A指定视频标志图标,B指定为短消息标志图标,C未定义
{
DEQUELVITEM* pDeqListItem = &m_DequeList;
if(UserInfo)
pDeqListItem ->push_back(*UserInfo);
nItem = CListCtrl::InsertItem(nItem,szItemText,nImageIndex);
return nItem;
}void CMyListCtrl::SetTailIcon(LPCTSTR strIconFileA,LPCTSTR strIconFileB,LPCTSTR strIconFileC)
添加设背景位图函数SetBackBitmap
{
HICON hIcon=NULL;
hIcon = (HICON)::LoadImage(NULL, strIconFileA, IMAGE_ICON, 0, 0, LR_DEFAULTSIZE|LR_LOADFROMFILE);
if(hIcon)
{
if(m_hTailIconA)
DeleteObject(m_hTailIconA);
m_hTailIconA = hIcon;
}
hIcon = (HICON)::LoadImage(NULL, strIconFileB, IMAGE_ICON, 0, 0, LR_DEFAULTSIZE|LR_LOADFROMFILE);
if(hIcon)
{
if(m_hTailIconB)
DeleteObject(m_hTailIconB);
m_hTailIconB = hIcon;
}
hIcon = (HICON)::LoadImage(NULL, strIconFileC, IMAGE_ICON, 0, 0, LR_DEFAULTSIZE|LR_LOADFROMFILE);
if(hIcon)
{
if(m_hTailIconC)
DeleteObject(m_hTailIconC);
m_hTailIconC = hIcon;
}
}void CMyListCtrl::SetBackBitmap(LPCTSTR lpszResourceName)
添加删除用户信息函数
{
HBITMAP hBmp = (HBITMAP)::LoadImageFile(lpszResourceName);
if(hBmp)
m_hBackBitmap = hBmp;
}BOOL DeleteUserInfo(CString szText)
{
BOOL bRet = FALSE;
LUSERITEM itemInfo;
DEQUELVITEM* pDeqItem = &m_DequeList;
int nItemCount = -1;
DEQUELVITEM::iterator it,itbegin = pDeqItem->begin(),itend = pDeqItem->end();
for ( it = itbegin; it != itend; it++ )
{
nItemCount++;
if(( it->szUserID == szText)||(it->szUserName == szText))
{
if ( nItemCount == ( pDeqItem->size() - 1 ) )
{
//如果是最后一个
pDeqItem->pop_back();
}
else if ( nItemCount == 0 )
//如果是第一个
pDeqItem->pop_front();
else
pDeqItem->erase( pDeqItem->begin() + nItemCount );
bRet = TRUE;
}
}
return bRet;
}
三、自绘代码全部在OnPaint()中实现 ,为了节省篇幅这里省略,请参考源码。
四、结束语
为了让VC程序员编写聊天软件时能够更好地美化其软件界面,本人写了这样CMyListCtrl 并给出了其源码,希望对大家有所启发!CMyTreeCtrl的自绘的实现也是大同小异,有兴趣的可去试试!。有任何问题请和本人联系:song_0962@sina.com (QQ:34544052)
(全文完)
更多精彩
赞助商链接