如题,怎样给CTreeCtrl添加网格线显示?CListCtrl很简单,设置一个LVS_EX_GRIDLINES的风格就行了,但CTreeCtrl没有这个风格。怎么给CTreeCtrl添加网格线,有没有办法?求救啊,各位给个办法!!!
解决方案 »
- cbutton 如何不在界面上显示为凸起状
- (100分)网络通信该如何加密?
- 各位高手请帮忙,我的数据库能添加和查询,就是不能删除!怎么也想不明白
- 用Winsocket编写了一个简单的网络文件传输程序,由客户端向服务器端发送文件,服务器端何时调用receiveSocket.Receive()来接收文件啊?
- 如何读写wince的inbox?将自己的数据做为一封邮件保存到inbox中?最好是ce.net的,ppc2002也行。
- 大家能看看么?两个关于 BCG 使用的入门问题 。。。。。。
- 那里可以下到Jeff Prosise写的《MFC WINDOWS程序设计》,就是Programing Windows with MFC,Second Edition的中文版
- 求救!DAO数据库
- 我在fopen一个53M MPEG-1的文件时,只读到1.2M就feof(fp)=TRUE
- MFC中使用OpenDocumentFile打开视图出现多个任务栏图标问题
- 根据软件需求设计软件
- 求个流程图,急
指的是那种多少行多少列的线吗?
treectrl要这样的线有什么用
{
LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
/*不同控件消息不同,如TreeView控件发送NM_CUSTOMDRAW通知码时,lParam指向的
是NMTVCUSTOMDRAW结构体,这个结构体的第一个成员是NMCUSTOMDRAW结构体*/
NMCUSTOMDRAW* pNMCustomDraw = (NMCUSTOMDRAW*)pNMHDR;
NMTVCUSTOMDRAW* pNMTVCustomDraw = (NMTVCUSTOMDRAW*)pNMHDR; switch(pNMCustomDraw->dwDrawStage)
{
case CDDS_PREPAINT: //绘制循环开始时
*pResult = CDRF_NOTIFYITEMDRAW; //绘制items前、后都发送NM_CUSTOMDRAW
break;
case CDDS_ITEMPREPAINT : //绘制item前,可绘制背景
{ //自己画,不发送NM_CUSTOMDRAW,绘制item后发送NM_CUSTOMDRAW
HTREEITEM hItem = (HTREEITEM)pNMCustomDraw->dwItemSpec;
CRect rcItem = pNMCustomDraw->rc; CRect rtemp;
GetItemRect(hItem,&rtemp,TRUE); if (rtemp.left > m_pHeader->GetItemWidth(0))
{
//测试这个位置
//*pResult = CDRF_SKIPDEFAULT ;
//break;
}
if (rcItem.IsRectEmpty())
{ //不需要重绘
*pResult = CDRF_DODEFAULT;
break;
}
*pResult = (CDRF_DODEFAULT | CDRF_NOTIFYPOSTPAINT);
}
break; case CDDS_ITEMPOSTPAINT: //绘制item后
{
HTREEITEM hItem = (HTREEITEM)pNMCustomDraw->dwItemSpec;
CRect rcItem = pNMCustomDraw->rc;
if (rcItem.IsRectEmpty())
{ //不需要重绘
*pResult = CDRF_DODEFAULT;
break;
}
CDC dc;
dc.Attach(pNMCustomDraw->hdc);
CRect rLibrect; COLORREF crTextBk = pNMTVCustomDraw->clrTextBk;
COLORREF crWnd = GetSysColor(COLOR_WINDOW); GetItemRect(hItem,&rLibrect,TRUE);
dc.FillSolidRect(&rLibrect, crWnd);
//TRACE("left:%d ,width:%d \n",rLibrect.left,m_pHeader->GetItemWidth(0));
if (rLibrect.right > m_pHeader->GetItemWidth(0))
{ //如果树的右侧超过表头0的宽度,侧减小RECT的大小
rLibrect.right = m_pHeader->GetItemWidth(0);
if (rLibrect.left> m_pHeader->GetItemWidth(0))
{ //如果左侧超出了首个表头的宽度,抹除表头后的+号
rLibrect.left= m_pHeader->GetItemWidth(0);
CRect Outrect;
GetItemRect(hItem,&Outrect,FALSE);
Outrect.left = rLibrect.left;
dc.FillSolidRect(&Outrect, crWnd);
}
} if (pNMCustomDraw->uItemState & CDIS_FOCUS )
{
dc.DrawFocusRect(&rLibrect);
if (crTextBk != crWnd) // 画出焦点背景
dc.FillSolidRect(&rLibrect, crTextBk);
}
dc.DrawText(GetItemText(hItem),&rLibrect,DT_LEFT|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);
//在这里用false得到了一整条Rect,盖住了加号。
//用true得到了文本部分的Rect。以下画出横线
GetItemRect(hItem,&rLibrect,FALSE);
rLibrect.bottom+=1;
dc.DrawEdge(&rLibrect,EDGE_ETCHED, BF_BOTTOM);
GetItemRect(hItem,&rLibrect,FALSE);
int temp = 0;
for (int i =0 ; i<m_pHeader->GetItemCount() ; i++)
{
temp += m_pHeader->GetItemWidth(i);
rLibrect.right = temp;
dc.DrawEdge(&rLibrect, BDR_RAISEDOUTER, BF_RIGHT);
}
//==============以上画线部分完成================
dc.Detach();
*pResult = CDRF_DODEFAULT;
break;
}
default:
*pResult = CDRF_DODEFAULT ;
}
}