VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 593|回复: 13

[求助] 求助各位大身神,自绘CListCtrl,使用InsertItem插入了数据,但无法显示

[复制链接]
87_avatar_middle
在线会员 发表于 2018-12-12 19:38:14 | 显示全部楼层 |阅读模式
4驿站币
class CSilDlg : public CDialog
{
// Construction
  struct SData
  {UINT row;
   CString number;
   CString name;
   CString country;
  };
public:
        struct SData* pData;
}

void CSilDlg::OnAdd()
{
        CString str,strn,strc;
        int imagindex;

        GetDlgItemText(IDC_NUMB,str);
    GetDlgItemText(IDC_NAME,strn);
    ((CComboEx*)GetDlgItem(IDC_NATION))->GetWindowText(strc);

        imagindex=((CComboEx*)GetDlgItem(IDC_NATION))->GetCurSel();
    //CString nb,nm,cot;

       
    //((CEdit*)GetDlgItem(IDC_NUMB))->GetWindowText(nb);
    //((CEdit*)GetDlgItem(IDC_NAME))->GetWindowText(nm);
        //((CComboEx*)GetDlgItem(IDC_NATION))->GetWindowText(cot);
       
       
        int II=((CListCtrlEx*)GetDlgItem(IDC_LIS))->GetItemCount();
        int jj=0;

        CRect rect;
    GetDlgItem(IDC_LIS)->GetWindowRect(&rect);
    DRAWITEMSTRUCT btnds;

        if(II==0)
        {   while(jj<3)
                        {
                     ((CListCtrlEx*)GetDlgItem(IDC_LIS))->InsertItem(jj,NULL);

                        }
       
        }
   
    //II=((CListCtrlEx*)GetDlgItem(IDC_LIS))->GetItemCount();

        ((CListCtrlEx*)GetDlgItem(IDC_LIS))->InsertItem(II,str);
        ((CListCtrlEx*)GetDlgItem(IDC_LIS))->SetItemText(II,1,strn);
        ((CListCtrlEx*)GetDlgItem(IDC_LIS))->SetItemText(II,2,strc);

        SData* pData=new SData;
        pData->row=II;
        pData->number=str;
        pData->name=strn;
        pData->country=strc;

        ((CListCtrlEx*)GetDlgItem(IDC_LIS))->SetItemData(II,(DWORD)pData);

   
    btnds.CtlID = IDC_LIS;
    btnds.CtlType = ODT_LISTBOX;
    btnds.hDC = GetDC()->GetSafeHdc();
    btnds.hwndItem = GetDlgItem(IDC_LIS)->GetSafeHwnd();
    btnds.itemAction = ODS_DEFAULT;  
    btnds.itemData = (DWORD)pData;
        btnds.itemID = IDC_LIS;
        btnds.itemState = ODS_DEFAULT;
        btnds.rcItem = rect;   
        ::SendMessage(m_hWnd,WM_DRAWITEM,IDC_LIS,(LPARAM)&btnds);
   
}

void CListCtrlEx::DrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDIS) //chenhu
{
       
        CDC dc;
        dc.Attach(lpDIS->hDC);

    static CRect rect(lpDIS->rcItem);
        int nItem=lpDIS->itemID;
   
     int i=0;
   SData* pTemp=(SData*)(((CListCtrlEx*)GetDlgItem(IDC_LIS))->GetItemData(lpDIS->itemData));
  CHeaderEx* pHeader=(CHeaderEx*)(((CListCtrlEx*)GetDlgItem(IDC_LIS))->GetHeaderCtrl());
       
    int nCount=pHeader->GetItemCount();
   
         while(i<nCount)
                {
                 CRect rc;
         CString str;
                 pHeader->GetItemRect(i,rc);
                 rc.top=rect.top;
                 rc.bottom=rect.bottom;
               
                 rc.left+=18;
                 DrawBack(&dc,rc,lpDIS);
                 rc.left+=2;
                 CString s1,s2,s3;
                 if(lpDIS->itemData)
                 {
                        s1=pTemp->number;
                        s2=pTemp->name;
                        s3=pTemp->country;

                        switch(nCount)
                                {case 0:
                                        str=s1;
                                        break;
                                case 1:
                                        str=s2;
                                        break;
                                case 2:
                                        str=s3;
                                        break;
                                }
                       rc.top+=rc.Height();
                        rc.bottom+=rc.Height();
                        if(str)
                                dc.DrawText(str,rc,DT_VCENTER|DT_SINGLELINE);
                }
                ++i;
                }
           if(lpDIS->itemState&ODS_FOCUS)
                     dc.DrawFocusRect(rect);
           DrawItem(nItem, lpDIS);
       
        dc.Detach();
}





上一篇:未加载ucrtbased.pdb问题
下一篇:读取访问权限冲突
51_avatar_middle
online_admins 发表于 2018-12-12 20:56:34 | 显示全部楼层
调试一下 DrawItem 函数,看看自绘的时候走到哪块退出了
87_avatar_middle
ico_lz  楼主| 发表于 2018-12-12 21:09:13 | 显示全部楼层
Syc 发表于 2018-12-12 20:56
调试一下 DrawItem 函数,看看自绘的时候走到哪块退出了

怎么调试啊,我只会设断点,然后Ctrl+f10
51_avatar_middle
online_admins 发表于 2018-12-12 21:11:31 | 显示全部楼层
cjwchenhui 发表于 2018-12-12 21:09
怎么调试啊,我只会设断点,然后Ctrl+f10

那干脆直接拿一个自绘好的开源控件类来使用就得了
楼主是为了自己学习控件的自绘吗?
还是为了使用?
87_avatar_middle
ico_lz  楼主| 发表于 2018-12-12 21:12:06 | 显示全部楼层
是不是我的方法不对?
87_avatar_middle
ico_lz  楼主| 发表于 2018-12-12 21:18:00 | 显示全部楼层
本帖最后由 cjwchenhui 于 2018-12-12 21:19 编辑

这个问题困扰我很久了,哪里可以下载啊
51_avatar_middle
online_admins 发表于 2018-12-12 21:20:24 | 显示全部楼层
cjwchenhui 发表于 2018-12-12 21:18
这个问题困扰我很久了,哪里可以下载啊

https://www.cctry.com/thread-297487-1-1.html
87_avatar_middle
ico_lz  楼主| 发表于 2018-12-12 21:32:07 | 显示全部楼层
本帖最后由 cjwchenhui 于 2018-12-12 21:39 编辑


谢谢。可以运行,但感觉不能响应我的鼠标,很慢。我想弄懂里面的机制,不知道哪里错了,消息我也发了,按理应该更新显示了,还是我的矩形区域不对,还是我的思路不对。
87_avatar_middle
ico_lz  楼主| 发表于 2018-12-12 21:44:21 | 显示全部楼层
跪求大神点拨,这个程序我调试了一星期。
51_avatar_middle
online_admins 发表于 2018-12-12 22:20:22 | 显示全部楼层
cjwchenhui 发表于 2018-12-12 21:44
跪求大神点拨,这个程序我调试了一星期。

方便的话工程代码发上来看看,我这边调试调试
75_avatar_middle
在线会员 发表于 2018-12-13 12:16:50 | 显示全部楼层
我说说我看到的问题:
1.struct SData 写在对话框的类里    clistctrlex没办法使用该结构体    。
应该放在另一个头文件中
2.   if(II==0)
        {   while(jj<3)
                        {
                     ((CListCtrlEx*)GetDlgItem(IDC_LIS))->InsertItem(jj,NULL);

                        }
        
        }
这个代码是死循环 当然 可能是你删除关键代码后  把jj++也删掉了。
3.既然你想用自绘 那我就当你普通的clistctrl会用 什么report属性肯定是设置了的。
  有没有设置owner draw fixed 为true?
4.一般的列表设置列也当你设置好了的
        //设置列表
        DWORD dwStyle = ((CListCtrlEx*)GetDlgItem(IDC_LIS))->GetExtendedStyle();
        dwStyle |= LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES;
        ((CListCtrlEx*)GetDlgItem(IDC_LIS))->SetExtendedStyle(dwStyle);
        ((CListCtrlEx*)GetDlgItem(IDC_LIS))->InsertColumn(0,"列1",LVCFMT_LEFT,100);
        ((CListCtrlEx*)GetDlgItem(IDC_LIS))->InsertColumn(1,"列2",LVCFMT_LEFT,100);
        ((CListCtrlEx*)GetDlgItem(IDC_LIS))->InsertColumn(2,"列3",LVCFMT_LEFT,100);
你试试这个流程 检查一下你的代码 到底哪里出问题了
87_avatar_middle
ico_lz  楼主| 发表于 2018-12-13 18:33:14 | 显示全部楼层
本帖最后由 cjwchenhui 于 2018-12-13 18:40 编辑

CListCtrlEx关联CListCtrl控件变量:IDC_LIS : m_lst;
General页:设置visible,Tab stop;
Styles页:设置Report
More Styles页:设置Own draw fixed


CSilDlg.h文件:

#pragma once
#if !defined(AFX_SILDLG_H__DF3BE44D_678D_4A04_95E6_A40993CD6BBA__INCLUDED_)
#define AFX_SILDLG_H__DF3BE44D_678D_4A04_95E6_A40993CD6BBA__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "ComboEx.h"
#include "ButtonEx.h"
#include "ListCtrlEx.h"

/////////////////////////////////////////////////////////////////////////////
// CSilDlg dialog


class CSilDlg : public CDialog
{
// Construction
  struct SData
  {UINT row;
   CString number;
   CString name;
   CString country;
  };
public:
        CSilDlg(CWnd* pParent = NULL);        // standard constructor
    // Dialog Data
        //{{AFX_DATA(CSilDlg)
        enum { IDD = IDD_SIL_DIALOG };
        CEdit        m_num;
        CEdit        m_nam;
        CListCtrlEx        m_lst;
        CButtonEx        m_mod;
        CButtonEx        m_del;
        CButtonEx        m_add;
        CComboEx        m_comb;
        //}}AFX_DATA

        // ClassWizard generated virtual function overrides
        //{{AFX_VIRTUAL(CSilDlg)
        protected:
        virtual void DoDataExchange(CDataExchange* pDX);        // DDX/DDV support
        //}}AFX_VIRTUAL

// Implementation
public:
        HICON m_hIcon;
        struct SData* pData;
protected:
        // Generated message map functions
        //{{AFX_MSG(CSilDlg)
        virtual BOOL OnInitDialog();
        afx_msg void OnPaint();
        afx_msg HCURSOR OnQueryDragIcon();
        afx_msg void OnAdd();
        afx_msg void OnMod();
        afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
        afx_msg UINT OnNcHitTest(CPoint point);
        afx_msg void OnShowWindow(BOOL bShow, UINT nStatus);
        afx_msg void OnDestroy();
        afx_msg void OnClose();
        afx_msg BOOL OnEraseBkgnd(CDC* pDC);
        //}}AFX_MSG
        DECLARE_MESSAGE_MAP()
};

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_SILDLG_H__DF3BE44D_678D_4A04_95E6_A40993CD6BBA__INCLUDED_)



CSilDlg.cpp文件:

#include "stdafx.h"
#include "sil.h"
#include "silDlg.h"
#include "HeaderEx.h"
#include "ComboEx.h"
#include "ListCtrlEx.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CSilDlg dialog
extern CImageList* m_hList;

CSilDlg::CSilDlg(CWnd* pParent)
        : CDialog(CSilDlg::IDD, pParent)
{
        //{{AFX_DATA_INIT(CSilDlg)
        //}}AFX_DATA_INIT
        // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
        m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
       
}



void CSilDlg::DoDataExchange(CDataExchange* pDX)
{
        CDialog::DoDataExchange(pDX);
        //{{AFX_DATA_MAP(CSilDlg)
        DDX_Control(pDX, IDC_NUMB, m_num);
        DDX_Control(pDX, IDC_NAME, m_nam);
        DDX_Control(pDX, IDC_LIS, m_lst);
        DDX_Control(pDX, IDC_MOD, m_mod);
        DDX_Control(pDX, IDC_DEL, m_del);
        DDX_Control(pDX, IDC_ADD, m_add);
        DDX_Control(pDX, IDC_NATION, m_comb);
        //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CSilDlg, CDialog)
        //{{AFX_MSG_MAP(CSilDlg)
        ON_WM_PAINT()
        ON_WM_QUERYDRAGICON()
        ON_BN_CLICKED(IDC_ADD, OnAdd)
        ON_BN_CLICKED(IDC_MOD, OnMod)
        ON_WM_CTLCOLOR()
        ON_WM_NCHITTEST()
        ON_WM_SHOWWINDOW()
        ON_WM_DESTROY()
        ON_WM_CLOSE()
        ON_WM_ERASEBKGND()
        //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSilDlg message handlers
extern CHeaderCtrl* pHeader;

BOOL CSilDlg::OnInitDialog()
{
       

        // Set the icon for this dialog.  The framework does this automatically
        //  when the application's main window is not a dialog
        SetIcon(m_hIcon, TRUE);                        // Set big icon
        SetIcon(m_hIcon, FALSE);

        // Set small ico
   
          
        // TODO: Add extra initialization here
        ((CButtonEx*)GetDlgItem(IDC_ADD))->SetIcon(IDI_ADD);
        ((CButtonEx*)GetDlgItem(IDC_MOD))->SetIcon(IDI_MOD);
        ((CButtonEx*)GetDlgItem(IDC_DEL))->SetIcon(IDI_DEL);

   
        ((CComboEx*)GetDlgItem(IDC_NATION))->AddItem("韩国",0);   
        ((CComboEx*)GetDlgItem(IDC_NATION))->AddItem("日本",1);
        ((CComboEx*)GetDlgItem(IDC_NATION))->AddItem("美国",2);
        ((CComboEx*)GetDlgItem(IDC_NATION))->AddItem("加拿大",3);
    ((CComboEx*)GetDlgItem(IDC_NATION))->AddItem("英国",4);

    ((CComboEx*)GetDlgItem(IDC_NATION))->SetCurSel(0);
    ((CComboEx*)GetDlgItem(IDC_NATION))->ModifyStyle(0, LVS_REPORT|WS_CHILD|WS_VISIBLE|WS_BORDER|WS_VSCROLL|LVS_OWNERDRAWFIXED);
    ((CListCtrlEx*)GetDlgItem(IDC_LIS))->SetExtendedStyle (LVS_EX_FULLROWSELECT |LVS_EX_GRIDLINES );

    int cishu=0;

((CListCtrlEx*)GetDlgItem(IDC_LIS))->InsertColumn(0,"序号",LVCFMT_CENTER,100);
    ((CListCtrlEx*)GetDlgItem(IDC_LIS))->InsertColumn(1, "姓名", LVCFMT_CENTER, 100);
    ((CListCtrlEx*)GetDlgItem(IDC_LIS))->InsertColumn(2, "国籍", LVCFMT_CENTER, 100);

     //CHeaderEx* pHeader=(CHeaderEx*)(((CListCtrlEx*)GetDlgItem(IDC_LIS))->GetHeaderCtrl());

    ModifyStyle(0,WS_SYSMENU|WS_MINIMIZEBOX);

CDialog::OnInitDialog();


        return TRUE;  // return TRUE  unless you set the focus to a control
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CSilDlg::OnPaint()
{
        if (IsIconic())
        {
                CPaintDC dc(this); // device context for painting

                SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

                // Center icon in client rectangle
                int cxIcon = GetSystemMetrics(SM_CXICON);
                int cyIcon = GetSystemMetrics(SM_CYICON);
                CRect rect;
                GetClientRect(&rect);
                int x = (rect.Width() - cxIcon + 1) / 2;
                int y = (rect.Height() - cyIcon + 1) / 2;

                // Draw the icon
                dc.DrawIcon(x, y, m_hIcon);
        }
        else
        {
                CDialog::OnPaint();
        }
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CSilDlg::OnQueryDragIcon()
{
        return (HCURSOR) m_hIcon;
}

void CSilDlg::OnAdd()
{
        CString str,strn,strc;
        int imagindex;

        GetDlgItemText(IDC_NUMB,str);
    GetDlgItemText(IDC_NAME,strn);
    ((CComboEx*)GetDlgItem(IDC_NATION))->GetWindowText(strc);

        imagindex=((CComboEx*)GetDlgItem(IDC_NATION))->GetCurSel();
    //CString nb,nm,cot;

       
    //((CEdit*)GetDlgItem(IDC_NUMB))->GetWindowText(nb);
    //((CEdit*)GetDlgItem(IDC_NAME))->GetWindowText(nm);
        //((CComboEx*)GetDlgItem(IDC_NATION))->GetWindowText(cot);
       
       
        int II=((CListCtrlEx*)GetDlgItem(IDC_LIS))->GetItemCount();
        int jj=0;

        CRect rect;
    GetDlgItem(IDC_LIS)->GetWindowRect(&rect);
    DRAWITEMSTRUCT btnds;

        if(II==0)
        {   while(jj<3)
                        {
                     ((CListCtrlEx*)GetDlgItem(IDC_LIS))->InsertItem(jj,NULL);

                        }
       
        }
   
    //II=((CListCtrlEx*)GetDlgItem(IDC_LIS))->GetItemCount();

        ((CListCtrlEx*)GetDlgItem(IDC_LIS))->InsertItem(II,str);
        ((CListCtrlEx*)GetDlgItem(IDC_LIS))->SetItemText(II,1,strn);
        ((CListCtrlEx*)GetDlgItem(IDC_LIS))->SetItemText(II,2,strc);

        SData* pData=new SData;
        pData->row=II;
        pData->number=str;
        pData->name=strn;
        pData->country=strc;

        ((CListCtrlEx*)GetDlgItem(IDC_LIS))->SetItemData(II,(DWORD)pData);

   
    btnds.CtlID = IDC_LIS;
    btnds.CtlType = ODT_LISTBOX;
    btnds.hDC = GetDC()->GetSafeHdc();
    btnds.hwndItem = GetDlgItem(IDC_LIS)->GetSafeHwnd();
    btnds.itemAction = ODS_DEFAULT;  
    btnds.itemData = (DWORD)pData;
        btnds.itemID = IDC_LIS;
        btnds.itemState = ODS_DEFAULT;
        btnds.rcItem = rect;   
        ::SendMessage(m_hWnd,WM_DRAWITEM,IDC_LIS,(LPARAM)&btnds);
   
        // TODO: Add your control notification handler code here
        //((CListCtrlEx*)GetDlgItem(IDC_LIS))->GetSafeHwnd()
}

void CSilDlg::OnMod()
{   int count=((CListCtrlEx*)GetDlgItem(IDC_LIS))->GetSelectedCount();
        // TODO: Add your control notification handler code here
        if(!count)
        {
      AfxMessageBox("请选中一条记录再修改!");
      return;
        }

        int i=((CListCtrlEx*)GetDlgItem(IDC_LIS))->GetSelectionMark();
        CString str1,str2,str3;
        GetDlgItemText(IDC_NAME,str2);
    GetDlgItemText(IDC_NUMB,str1);
        //((CListCtrlEx*)GetDlgItem(IDC_LIS))->SetItemText(i,1,str);
        ((CComboEx*)GetDlgItem(IDC_NATION))->GetWindowText(str3);
       

        //LVITEM li={LVIF_TEXT,i,2};
        //li.pszText=(LPSTR)(LPCSTR)str;
        //((CListCtrlEx*)GetDlgItem(IDC_LIS))->SetItem(&li);
        //li.iImage=m_comb.GetCurSel();
        //li.iImage=m_comb.GetCurSel();
        //li.mask=LVIF_IMAGE;
        //li.iSubItem=0;
        //((CListCtrlEx*)GetDlgItem(IDC_LIS))->SendChildNotifyLastMsg();
    CRect rect;
    GetDlgItem(IDC_LIS)->GetWindowRect(&rect);

    DRAWITEMSTRUCT btnds;
    btnds.CtlID = IDC_LIS;
    btnds.CtlType = ODT_LISTBOX;
    btnds.hDC = GetDC()->GetSafeHdc();
    btnds.hwndItem = GetDlgItem(IDC_LIS)->GetSafeHwnd();
    btnds.itemAction = ODA_FOCUS;  
    btnds.itemData = (DWORD)pData;
        btnds.itemID = IDC_LIS;
        btnds.itemState = ODS_DEFAULT;
        btnds.rcItem = rect;   
        ::SendMessage(m_hWnd,WM_DRAWITEM,IDC_LIS,(LPARAM)&btnds);
       
}

HBRUSH CSilDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)  //chenhu
{
        HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

        // TODO: Change any attributes of the DC here
        if(pWnd->GetDlgCtrlID()==IDC_STATI1)
        {
                pDC->SetTextColor(RGB(0,0,255));
                pDC->SetBkColor(RGB(255,255,0));
                pDC->SetBkMode(TRANSPARENT);
                return (HBRUSH)GetStockObject(NULL_BRUSH);
        }
   else
   {
            pDC->SetTextColor(RGB(0,0,255));
                pDC->SetBkColor(RGB(255,255,0));
                pDC->SetBkMode(TRANSPARENT);
                return (HBRUSH)GetStockObject(NULL_BRUSH);
   }
        // TODO: Return a different brush if the default is not desired
        return hbr;
}

UINT CSilDlg::OnNcHitTest(CPoint point) //CHENHU
{
        // TODO: Add your message handler code here and/or call default
        UINT nRet=CDialog::OnNcHitTest(point);
if(HTCLIENT==nRet)
{
ScreenToClient(&point);
if(point.y<25)
         return HTCAPTION;
}

        return nRet;
}

void CSilDlg::OnShowWindow(BOOL bShow, UINT nStatus)
{
        CDialog::OnShowWindow(bShow, nStatus);
   

        // TODO: Add your message handler code here
       
}

void CSilDlg::OnDestroy()
{
CDialog::OnDestroy();

// TODO: Add your message handler code here
       
}

void CSilDlg::OnClose()
{
        // TODO: Add your message handler code here and/or call default

//AfxMessageBox("删除m_iList");

//AfxMessageBox("程序退出");       
        CDialog::OnClose();
}

BOOL CSilDlg::OnEraseBkgnd(CDC* pDC)
{
        // TODO: Add your message handler code here and/or call default
CRect rect;
GetClientRect(&rect);

CBitmap m_pBmp;
BITMAP bm;
CDC dcMem;

m_pBmp.LoadBitmap(IDB_BITMAP1);
m_pBmp.GetBitmap(&bm);//得到位图尺寸

dcMem.CreateCompatibleDC(pDC);
CBitmap* pOldBitmap = dcMem.SelectObject(&m_pBmp);

  pDC->SetStretchBltMode(COLORONCOLOR);//这个模式不设置的话会导致图片严重失真
pDC->StretchBlt(0,0,rect.Width() ,rect.Height(),
  &dcMem,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
dcMem.SelectObject(pOldBitmap);

return TRUE;

        return CDialog::OnEraseBkgnd(pDC);
}

ListCtrlEx.h文件

#if !defined(AFX_LISTCTRLEX_H__2FF3B4C8_A37F_4549_8FB2_0B3E5557CCF9__INCLUDED_)
#define AFX_LISTCTRLEX_H__2FF3B4C8_A37F_4549_8FB2_0B3E5557CCF9__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// ListCtrlEx.h : header file
//

/////////////////////////////////////////////////////////////////////////////
// CListCtrlEx window
int CALLBACK byNumb(LPARAM lParam1,LPARAM lParam2,LPARAM lParam);
int CALLBACK byName(LPARAM lParam1,LPARAM lParam2,LPARAM lParam);
int CALLBACK byNationS(LPARAM lParam1,LPARAM lParam2,LPARAM lParam);

class CSilDlg;

class CListCtrlEx : public CListCtrl
{
// Construction
public:
        CListCtrlEx();
   
        void SetSort(int nCol)
        {
        m_nSort=nCol;
        }
// Attributes
public:
   int m_nSort; //chenhu
   CImageList* m_hList;
   CImageList* m_iList;;
   //static int m_Border;
// Operations
public:

// Overrides
        // ClassWizard generated virtual function overrides
        //{{AFX_VIRTUAL(CListCtrlEx)
        //}}AFX_VIRTUAL

// Implementation
public:
        void DrawBack(CDC* pDC,CRect& rc,LPDRAWITEMSTRUCT lpDIS);
        void DrawImage(CDC* pDC,CRect& rc,int nItem);

        virtual ~CListCtrlEx();
   

        // Generated message map functions
protected:
        //{{AFX_MSG(CListCtrlEx)
        afx_msg void OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult);
        virtual void DrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDIS);
        virtual void MeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMIS);
        afx_msg BOOL OnEraseBkgnd(CDC* pDC);
        afx_msg void OnSetFocus(CWnd* pOldWnd);
        afx_msg void OnInsertitem(NMHDR* pNMHDR, LRESULT* pResult);
        afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
        //}}AFX_MSG

        DECLARE_MESSAGE_MAP()
};

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_LISTCTRLEX_H__2FF3B4C8_A37F_4549_8FB2_0B3E5557CCF9__INCLUDED_)



ListCtrlEx.cpp文件:

#include "stdafx.h"
#include "sil.h"
#include "ListCtrlEx.h"
#include "HeaderEx.h"
#include "SilDlg.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CListCtrlEx
extern struct SData
  {UINT row;
   CString number;
   CString name;
   CString country;
  };


CListCtrlEx::CListCtrlEx() //chenhu
{   m_nSort=-1;

    //CBitmap b1,b2;
        //b1.LoadBitmap(IDB_ASC);
        //b2.LoadBitmap(IDB_DES);

   
   
        //m_hList = new CImageList();
        //m_hList->Create(16,16,ILC_COLOR16|ILC_MASK,6,6);
//m_hList->Add(&b1,RGB(255,255,255));
//        m_hList->Add(&b2,RGB(255,255,255));
  
}

CListCtrlEx::~CListCtrlEx()
{
        if(m_hList!=NULL)
{
delete m_hList;
m_hList=NULL;
//AfxMessageBox("删除m_hList");

}
}


BEGIN_MESSAGE_MAP(CListCtrlEx, CListCtrl)
        //{{AFX_MSG_MAP(CListCtrlEx)
        ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnColumnclick)
    ON_WM_DRAWITEM_REFLECT()
        ON_WM_MEASUREITEM_REFLECT()
        ON_WM_ERASEBKGND()
        ON_WM_SETFOCUS()
        ON_NOTIFY_REFLECT(LVN_INSERTITEM, OnInsertitem)
        ON_WM_PAINT()
        ON_WM_VSCROLL()
        //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CListCtrlEx message handlers

void CListCtrlEx::OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult) //chenhu
{
        NM_LISTVIEW* p= (NM_LISTVIEW*)pNMHDR;
        int nCol=p->iSubItem;
        //HDITEM hi={HDI_IMAGE|HDI_FORMAT};
        CHeaderEx* pHeader=(CHeaderEx*)(((CListCtrlEx*)GetDlgItem(IDC_LIS))->GetHeaderCtrl());
        static int i=0;
       
        if(nCol>-1)
                {
                //pHeader->GetItem(nCol,&hi);
           // hi.fmt=HDF_IMAGE;
           // hi.iImage=i;
           // i=!i;
        //        pHeader->GetItem(nCol,&hi);
        //        hi.fmt&=~HDF_IMAGE;
        //        pHeader->SetItem(nCol,&hi);
          //  pHeader->GetItem(nCol,&hi);
        }
        int j=0,nCount=GetItemCount();

        while(j<nCount)
        {
        SetItemData(j,j);
        ++j;
        }

        //SetSort(nCol);

        switch(nCol)
        {case 0:
             ((CListCtrl*)GetDlgItem(IDC_LIS))->SortItems((PFNLVCOMPARE)byNumb,(DWORD)this);
                 break;
         case 1:
         ((CListCtrl*)GetDlgItem(IDC_LIS))->SortItems((PFNLVCOMPARE)byName,(DWORD)this);
                 break;
     case 2:
         ((CListCtrl*)GetDlgItem(IDC_LIS))->SortItems((PFNLVCOMPARE)byNationS,(DWORD)this);
                 break;
           }

        //pHeader->SetItem(nCol,&hi);
        // TODO: Add your control notification handler code here
       
        *pResult = 0;
}

int CALLBACK byNumb(LPARAM lParam1,LPARAM lParam2,LPARAM lParam)
{
        CListCtrlEx* pTh=(CListCtrlEx*)lParam;
       
//        if(pTh)AfxMessageBox("yes1");
        int n1=atoi(pTh->GetItemText((int)lParam1,0));
    int n2=atoi(pTh->GetItemText((int)lParam2,0));
        if(true)return n1>n2;
        else return n1<n2;

}

int CALLBACK byName(LPARAM lParam1,LPARAM lParam2,LPARAM lParam)
{
        CListCtrlEx* pTh=(CListCtrlEx*)lParam;
        //int num=(int)lParam;
        CString str1=pTh->GetItemText((int)lParam1,1);
    CString str2=pTh->GetItemText((int)lParam2,1);
        if(true)return str1>str2;
        else return str1<str2;
}

int CALLBACK byNationS(LPARAM lParam1,LPARAM lParam2,LPARAM lParam)
{
    CListCtrlEx* pTh=(CListCtrlEx*)lParam;
//        int num=(int)lParam;
        CString str1=pTh->GetItemText((int)lParam1,2);
    CString str2=pTh->GetItemText((int)lParam2,2);
        if(true)return str1>str2;
        else return str1<str2;

}

void CListCtrlEx::DrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDIS) //chenhu
{
        // TODO: Add your message handler code here and/or call default
   
        CDC dc;
        dc.Attach(lpDIS->hDC);

    static CRect rect(lpDIS->rcItem);
        int nItem=lpDIS->itemID;
   
     int i=0;
   SData* pTemp=(SData*)(((CListCtrlEx*)GetDlgItem(IDC_LIS))->GetItemData(lpDIS->itemData));
  CHeaderEx* pHeader=(CHeaderEx*)(((CListCtrlEx*)GetDlgItem(IDC_LIS))->GetHeaderCtrl());
       
    int nCount=pHeader->GetItemCount();
    //pData = (SData*)(((CListCtrlEx*)GetDlgItem(IDC_LIS))->GetItemData(lpDIS->itemData));
        // TODO: Add your control notification handler code here
         while(i<nCount)
                {
                 CRect rc;
         CString str;
                 pHeader->GetItemRect(i,rc);
                 rc.top=rect.top;
                 rc.bottom=rect.bottom;
               
           //// DrawImage(&dc,rc,i);
                 rc.left+=18;
                 DrawBack(&dc,rc,lpDIS);
                 rc.left+=2;
                 CString s1,s2,s3;
                 if(lpDIS->itemData)
                 {
                        //s1=pTemp->number;
                        //s2=pTemp->name;
                        //s3=pTemp->country;
             //str=GetItemText(nItem,i);

                        switch(nCount)
                                {case 0:
                                        str=s1;
                                        break;
                                case 1:
                                        str=s2;
                                        break;
                                case 2:
                                        str=s3;
                                        break;
                                }
            rc.top+=rc.Height();
                        rc.bottom+=rc.Height();
                        if(str)
                                dc.DrawText(str,rc,DT_VCENTER|DT_SINGLELINE);
                }
                ++i;
                }
           if(lpDIS->itemState&ODS_FOCUS)
                     dc.DrawFocusRect(rect);
           DrawItem(nItem, lpDIS);
       
        dc.Detach();
}

void CListCtrlEx::DrawImage(CDC *pDC, CRect &rc, int nItem)
{
        LVITEM lvi={LVIF_IMAGE};
        GetItem(&lvi);
        CImageList* pImageList=GetImageList(LVSIL_SMALL);
        pImageList->Draw(pDC,nItem,CPoint(rc.top,rc.left),ILD_TRANSPARENT);
}

void CListCtrlEx::DrawBack(CDC *pDC, CRect &rc, LPDRAWITEMSTRUCT lpDIS) //chenhu
{
int nItem=lpDIS->itemID;

if(ODS_SELECTED&lpDIS->itemState)
{
        pDC->FillSolidRect(rc,GetSysColor(COLOR_HIGHLIGHT));
    pDC->SetTextColor(GetSysColor(COLOR_HIGHLIGHTTEXT));

}
else
{if(nItem%2)
{
    pDC->FillSolidRect(rc,RGB(165,203,247));
    pDC->SetTextColor(RGB(200,0,217));
}
else
{
    pDC->FillSolidRect(rc,RGB(105,100,247));
    pDC->SetTextColor(RGB(0,200,217));
}

}
}

void CListCtrlEx::MeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMIS)
{
        // TODO: Add your message handler code here and/or call default
        if(lpMIS->itemData>-1)
        {lpMIS->itemHeight=20;
        lpMIS->itemWidth=320;
        }
        else
        {lpMIS->itemHeight=0;
        lpMIS->itemWidth=320;
        }
       
        CListCtrl::OnMeasureItem(nIDCtl, lpMIS);
}


BOOL CListCtrlEx::OnEraseBkgnd(CDC* pDC)
{
        // TODO: Add your message handler code here and/or call default
        //CRect rclh;
    //CHeaderEx* pHeader=(CHeaderEx*)(((CListCtrlEx*)GetDlgItem(IDC_LIS))->GetHeaderCtrl());
    //pHeader->GetWindowRect(&rclh);

   //CBrush br(RGB(0,255,0));
   //CDC* dn=GetDC();
   //dn->SelectObject(&br);
   //dn->FillRect(&rclh,&br);

        return CListCtrl::OnEraseBkgnd(pDC);
}

void CListCtrlEx::OnSetFocus(CWnd* pOldWnd)
{
        CListCtrl::OnSetFocus(pOldWnd);
       
        // TODO: Add your message handler code here
       
}

void CListCtrlEx::OnInsertitem(NMHDR* pNMHDR, LRESULT* pResult)
{
        NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
        // TODO: Add your control notification handler code here
        UpdateData(false);
        *pResult = 0;
}

void CListCtrlEx::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
        // TODO: Add your message handler code here and/or call default
        int i=0;
        CListCtrl::OnVScroll(nSBCode, nPos, pScrollBar);
}

BOOL CSilApp::InitInstance()
{
        // Standard initialization
        // If you are not using these features and wish to reduce the size
        //  of your final executable, you should remove from the following
        //  the specific initialization routines you do not need.

int nResult;

CSilDlg dlg;
if(nResult=dlg.DoModal())
{
}
        return FALSE;
        // Since the dialog has been closed, return FALSE so that we exit the
        //  application, rather than start the application's message pump.

}


87_avatar_middle
ico_lz  楼主| 发表于 2018-12-13 18:42:32 | 显示全部楼层
我的QQ号:3062174785,请加我QQ,我发文件给你,谢谢了
87_avatar_middle
ico_lz  楼主| 发表于 2018-12-14 20:49:07 | 显示全部楼层
本帖最后由 cjwchenhui 于 2018-12-14 21:27 编辑

请问Syc大神,我错在哪里。是否new的结构体析构了,导致int 3中断,请问如何修改呢。
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-8-22 03:43

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表