控件中国网现已改版,您看到的是老版本网站的镜像,系统正在为您跳转到新网站首页,请稍候.......
中国最专业的商业控件资讯网产品咨询电话:023-67870900 023-67871946
产品咨询EMAIL:SALES@COMPONENTCN.COM

CListCtrl透明完美实现

作者:未知 出处:cnblog 2013年03月14日 阅读:

 网上找过很多资料,左不行右不通,你抄我抄大家抄的不管了,但是某些解释的详细的资料也不行,或许还有MFC版本的原因。咬咬牙,决定自己实现一个。虽然粗枝大叶,但是网友们如果

 
按照这里的方法,应该能行。照着葫芦画瓢仍行不通的网友们请留言。说明一下,我用VS2010+MFC10环境。
 
实现步骤如下:
 
1、把CListCtrl子类化
 
2、在IDE中把CListCtrl的Transparent复选框勾上。
 
3、实现WM_PARENTNOTIFY,代码如下:
 void CMyListCtrl::OnParentNotify(UINT message, LPARAM lParam) 
      
    if (message==IDC_TREE_FILE) 
    { 
        LPTSTR lp=(LPTSTR)calloc(MAX_PATH,sizeof(TCHAR)); 
        lstrcpy(lp,(LPTSTR)lParam); 
        memset(m_szFileFullName,0,MAX_PATH*sizeof(TCHAR)); 
        lstrcpy(m_szFileFullName,lp); 
        lstrcat(lp,L"\\*.*"); 
        CFileFind ff; 
        DeleteAllItems(); 
        GetParent()->InvalidateRect(&m_rc); 
        SetRedraw(FALSE); 
        BOOL bFind=ff.FindFile(lp); 
        CString szFileName=L""; 
        do 
        { 
            bFind=ff.FindNextFile(); 
            if (ff.IsDots()) 
            { 
                continue; 
            } 
            szFileName=ff.GetFileName(); 
            if (szFileName.IsEmpty()) 
            { 
                break; 
            } 
            if (!ff.IsDirectory()) 
            { 
                InsertItem(0,szFileName.GetBuffer(szFileName.GetLength())); 
            } 
        } while (bFind); 
        SetRedraw(TRUE); 
        GetParent()->InvalidateRect(&m_rc); 
        delete lp; 
    } 
    else if (message==WM_USER+1&&lParam==0) 
    { 
        SetBkColor(CLR_NONE); 
        SetTextBkColor(CLR_NONE); 
        SetClassLong(GetSafeHwnd(),GCL_HBRBACKGROUND,(LONG)GetStockObject(NULL_BRUSH)); 
        GetWindowRect(&m_rc); 
        GetParent()->ScreenToClient(&m_rc); 
        ::SendMessage(GetHeaderCtrl()->GetSafeHwnd(),WM_PARENTNOTIFY,WM_USER+1,0); 
    } 
    else
    { 
        CListCtrl::OnParentNotify(message, lParam); 
    } 
4、实现LVN_ITEMCHANGED,代码如下:
void CMyListCtrl::OnLvnItemchanged(NMHDR *pNMHDR, LRESULT *pResult) 
    LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR); 
    // TODO: 在此添加控件通知处理程序代码 
    //要刷新旧列表项。用一个变量把旧列表项记录下来。 
    GetParent()->InvalidateRect(&m_rc); 
    //异或用于追加,与用于判断 
    if (pNMLV->uNewState&LVIS_SELECTED) 
    { 
        LPTSTR lp=(LPTSTR)calloc(MAX_PATH,sizeof(TCHAR)); 
        lstrcpy(lp,m_szFileFullName); 
        lstrcat(lp,L"\\"); 
        lstrcat(lp,GetItemText(pNMLV->iItem,pNMLV->iSubItem)); 
        GetParent()->SetDlgItemText(IDC_EDIT_FILE,lp); 
        delete lp; 
    } 
    *pResult = 0; 
5、分别实现LVN_DELETEALLITEMS、LVN_DELETEITEM、WM_HSCROLL、WM_VSCROLL、WM_MOUSEWHEEL,在每个调用CListCtrl默认处理之后追加一行代码:
 
GetParent()->InvalidateRect(&m_rc); 
*pResult = 0; 
 
 
6、用类向导新建一个继承CHeaderCtrl类的新类,实现WM_PAINT,代码如下:
void CMyHeaderCtrl::OnPaint() 
    CPaintDC dc(this); // device context for painting 
    // TODO: 在此处添加消息处理程序代码 
    // 不为绘图消息调用 CHeaderCtrl::OnPaint() 
    HDC dcMem=::CreateCompatibleDC(GetParent()->GetParent()->GetDC()->GetSafeHdc()); 
    SelectObject(dcMem,m_bmp); 
    BitBlt(dc.GetSafeHdc(),0,0,m_rc.right-m_rc.left,m_rc.bottom-m_rc.top,dcMem,m_rc.left,m_rc.top,SRCCOPY); 
    dc.SetBkMode(TRANSPARENT); 
    dc.SetTextColor(RGB(255,0,0)); 
    dc.SelectObject(CreatePen(PS_DOT,1,RGB(255,0,255))); 
    dc.SelectObject(GetStockObject(NULL_BRUSH)); 
    dc.SelectObject(m_font); 
    dc.Rectangle(0,0,m_rc.right-m_rc.left,m_rc.bottom-m_rc.top); 
    HDITEM col; 
    GetItem(0,&col); 
    if (lstrlen(col.pszText)) 
    { 
        dc.TextOut(0,3,col.pszText,lstrlen(col.pszText)); 
    }  
    else
    { 
        dc.TextOut(0,3,L"文件名",3); 
    } 
      
  
  7、重载PreSubclassWindow,代码如下:
 void CMyListCtrl::PreSubclassWindow() 
    // TODO: 在此添加专用代码和/或调用基类 
      
    CListCtrl::PreSubclassWindow(); 
    m_headerFile.SubclassWindow(GetHeaderCtrl()->GetSafeHwnd()); 
  好了,到此完成。网友们一定发现界面上的CEdit、CButton、CStatic、CTreeCtrl全是透明的。
 

热推产品

  • ActiveReport... 强大的.NET报表设计、浏览、打印、转换控件,可以同时用于WindowsForms谀坔攀戀Forms平台下......
  • AnyChart AnyChart使你可以创建出绚丽的交互式的Flash和HTML5的图表和仪表控件。可以用于仪表盘的创......
首页 | 新闻中心 | 产品中心 | 技术文档 | 友情连接 | 关于磐岩 | 技术支持中心 | 联系我们 | 帮助中心 Copyright-2006 ComponentCN.com all rights reserved.重庆磐岩科技有限公司(控件中国网) 版权所有 电话:023 - 67870900 传真:023 - 67870270 产品咨询:sales@componentcn.com 渝ICP备12000264号 法律顾问:元炳律师事务所 重庆市江北区塔坪36号维丰创意绿苑A座28-5 邮编:400020
在线客服
在线客服系统
在线客服
在线客服系统