• CListCtrl 防止闪烁,调整行显示长度


    1,设置重绘

     2,新建类,继承CListCtrl

    #pragma once
    #include "afxcmn.h"
    
    class DBufferListCtrl :
        public CListCtrl
    {
    public:
        DBufferListCtrl(void);
        ~DBufferListCtrl(void);
    
    
        DECLARE_MESSAGE_MAP()
        afx_msg void OnPaint();
        afx_msg BOOL OnEraseBkgnd(CDC* pDC);
    
    
        CString GetItemText(int nItem, int nSubItem) const;
    
        virtual void DrawItem(LPDRAWITEMSTRUCT /*lpDrawItemStruct*/);
    };
    
    #include "stdafx.h"
    #include "DBufferListCtrl.h"
    
    
    DBufferListCtrl::DBufferListCtrl(void)
    {
    }
    
    
    DBufferListCtrl::~DBufferListCtrl(void)
    {
    }
    BEGIN_MESSAGE_MAP(DBufferListCtrl, CListCtrl)
        ON_WM_PAINT()
        ON_WM_ERASEBKGND()
    END_MESSAGE_MAP()
    
    
    void DBufferListCtrl::OnPaint()
    {
    
        CPaintDC dc(this); // device context for painting
        CRect rect;
        CRect headerRect;
        CDC MenDC;        
        CBitmap MemMap;
    
        GetClientRect(&rect);    
        GetDlgItem(0)->GetWindowRect(&headerRect);   
        MenDC.CreateCompatibleDC(&dc);   
        MemMap.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height()); 
        MenDC.SelectObject(&MemMap);
        MenDC.FillSolidRect(&rect,RGB(255,255,255));   
    
        DefWindowProc(WM_PAINT,(WPARAM)MenDC.m_hDC,(LPARAM)0);   
    
        dc.BitBlt(0,
            headerRect.Height(),   
            rect.Width(),   
            rect.Height(),   
            &MenDC,   
            0,     
            headerRect.Height(),   
            SRCCOPY);   
    
        MenDC.DeleteDC();
        MemMap.DeleteObject();
    }
    
    
    BOOL DBufferListCtrl::OnEraseBkgnd(CDC* pDC)
    {
        // TODO: Add your message handler code here and/or call default
    
        //return CListCtrl::OnEraseBkgnd(pDC);
        return FALSE;
    }
    
    
    CString DBufferListCtrl::GetItemText(int nItem, int nSubItem) const
    {
        ASSERT(::IsWindow(m_hWnd));
        LVITEM lvi;
        memset(&lvi, 0, sizeof(LVITEM));
        lvi.iSubItem = nSubItem;
    
        CString str;
        int nLen = 512;
        int nRes;
    
        do
        {
            nLen *= 2;
            lvi.cchTextMax = nLen;
            lvi.pszText = str.GetBufferSetLength(nLen);
            nRes  = (int)::SendMessage(m_hWnd, LVM_GETITEMTEXT, (WPARAM)nItem,
                (LPARAM)&lvi);
        } while (nRes >= nLen-1);
    
        str.ReleaseBuffer();
        return str;
    }
    
    void DBufferListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
    {
        CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
        CRect rcItem(lpDrawItemStruct->rcItem);
        int nItem = lpDrawItemStruct->itemID;
        COLORREF clrTextSave, clrBkSave;
        static _TCHAR szBuff[1024];
    
        LV_ITEM lvi;
        lvi.mask = LVIF_TEXT | LVIF_STATE;//LVIF_IMAGE |
        lvi.iItem = nItem;
        lvi.iSubItem = 0;
        lvi.pszText = szBuff;
        lvi.cchTextMax = sizeof(szBuff);
        lvi.stateMask = 0xFFFF;
        GetItem(&lvi);
    
        BOOL bSelected = (lvi.state & LVIS_SELECTED);
        CRect rcAllLabels;
        GetItemRect(nItem, rcAllLabels, LVIR_BOUNDS);
    
        if (bSelected)
        {
            clrTextSave = pDC->SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
            clrBkSave = pDC->SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));
            pDC->FillRect(rcAllLabels, &CBrush(::GetSysColor(COLOR_HIGHLIGHT)));
        }
    
        GetItemRect(nItem, rcItem, LVIR_LABEL);
        pDC->DrawText(szBuff, -1, rcItem, DT_LEFT | DT_SINGLELINE | DT_NOPREFIX | DT_NOCLIP | DT_VCENTER);
    
        LV_COLUMN lvc;
        lvc.mask = LVCF_FMT | LVCF_WIDTH;
        for (int nColumn = 1; GetColumn(nColumn, &lvc); nColumn++)
        {
            rcItem.left = rcItem.right;
            rcItem.right += lvc.cx;
    
            int nRetLen = CListCtrl::GetItemText(nItem, nColumn,
                szBuff, sizeof(szBuff));
            if (nRetLen == 0)
                continue;
            UINT nJustify = DT_LEFT;
            switch (lvc.fmt & LVCFMT_JUSTIFYMASK)
            {
            case LVCFMT_RIGHT:
                nJustify = DT_RIGHT;
                break;
            case LVCFMT_CENTER:
                nJustify = DT_CENTER;
                break;
            default:
                break;
            }
    
            pDC->DrawText(szBuff, -1, rcItem,
                nJustify | DT_SINGLELINE | DT_NOPREFIX | DT_NOCLIP | DT_VCENTER);
        }
        if (lvi.state & LVIS_FOCUSED)
            pDC->DrawFocusRect(rcAllLabels);
    
        if (bSelected)
        {
            pDC->SetTextColor(clrTextSave);
            pDC->SetBkColor(clrBkSave);
        }
    }
  • 相关阅读:
    celery 定时任务demo
    zip函数的使用
    关于数论的知识整理——待更新
    线性基
    博弈论博客推荐
    BZOJ1597: [Usaco2008 Mar]土地购买——斜率优化
    BZOJ1096 [ZJOI2007]仓库建设——斜率优化
    bzoj1010: [HNOI2008]玩具装箱toy——斜率优化
    斜率优化
    HDU3480 Division——四边形不等式或斜率优化
  • 原文地址:https://www.cnblogs.com/mymeng_feng/p/13712624.html
Copyright © 2020-2023  润新知