CTreeCtrl SortChildrenCB 排序问题

v2nero 2012-12-24 12:05:35
写了个小测试程序,但怎么调试都不行,不请大神们帮忙看看我到底哪错了
头文件

// Test6Dlg.h : header file
//

#pragma once

#include <list>

typedef struct {
HTREEITEM hItem;
bool bOnline;
}_MyItemData;

typedef std::list<_MyItemData*> ItemDataList;

// CTest6Dlg dialog
class CTest6Dlg : public CDialogEx
{
// Construction
public:
CTest6Dlg(CWnd* pParent = NULL); // standard constructor

// Dialog Data
enum { IDD = IDD_TEST6_DIALOG };

protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support


// Implementation
protected:
HICON m_hIcon;

// Generated message map functions
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()

public:
afx_msg void OnBnClickedBtnSort();

//int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);
static int CALLBACK TreeCmpFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);

private:
CTreeCtrl m_Tree;
ItemDataList m_ItemDataList;
public:
afx_msg void OnBnClickedBtnSortcb();
};

//static int CALLBACK TreeCmpFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);


CPP文件


// Test6Dlg.cpp : implementation file
//

#include "stdafx.h"
#include "Test6.h"
#include "Test6Dlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CAboutDlg dialog used for App About

class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();

// Dialog Data
enum { IDD = IDD_ABOUTBOX };

protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

// Implementation
protected:
DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()


// CTest6Dlg dialog



CTest6Dlg::CTest6Dlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CTest6Dlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CTest6Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_TREE_TEST, m_Tree);
}

BEGIN_MESSAGE_MAP(CTest6Dlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BTN_SORT, &CTest6Dlg::OnBnClickedBtnSort)
ON_BN_CLICKED(IDC_BTN_SORTCB, &CTest6Dlg::OnBnClickedBtnSortcb)
END_MESSAGE_MAP()


// CTest6Dlg message handlers

BOOL CTest6Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();

// Add "About..." menu item to system menu.

// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}

// 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 icon

// TODO: Add extra initialization here


_MyItemData *mItemData = new _MyItemData;
mItemData->hItem = m_Tree.InsertItem(_T("2311"));
mItemData->bOnline = true;
m_ItemDataList.push_back(mItemData);
m_Tree.SetItemData(mItemData->hItem,(DWORD_PTR)mItemData);



mItemData = new _MyItemData;
mItemData->hItem = m_Tree.InsertItem(_T("121"));
mItemData->bOnline = true;
m_ItemDataList.push_back(mItemData);
m_Tree.SetItemData(mItemData->hItem,(DWORD_PTR)mItemData);

mItemData = new _MyItemData;
mItemData->hItem = m_Tree.InsertItem(_T("1234"));
mItemData->bOnline = false;
m_ItemDataList.push_back(mItemData);
m_Tree.SetItemData(mItemData->hItem,(DWORD_PTR)mItemData);

mItemData = new _MyItemData;
mItemData->hItem = m_Tree.InsertItem(_T("1111"));
mItemData->bOnline = false;
m_ItemDataList.push_back(mItemData);
m_Tree.SetItemData(mItemData->hItem,(DWORD_PTR)mItemData);

CString str1 = m_Tree.GetItemText(mItemData->hItem);

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

void CTest6Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}

// 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 CTest6Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<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
{
CDialogEx::OnPaint();
}
}

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



void CTest6Dlg::OnBnClickedBtnSort()
{
// TODO: Add your control notification handler code here
m_Tree.SortChildren(NULL);

//
}

int CALLBACK CTest6Dlg::TreeCmpFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
CTreeCtrl *pTree = (CTreeCtrl*)lParamSort;
/*
HTREEITEM hItem1 = (HTREEITEM)lParam1;
HTREEITEM hItem2 = (HTREEITEM)lParam2;
_MyItemData *pItemData1 = (_MyItemData*)pTree->GetItemData(hItem1);
_MyItemData *pItemData2 = (_MyItemData*)pTree->GetItemData(hItem2);
if (pItemData1->bOnline != pItemData2->bOnline) {
return pItemData1->bOnline?1:-1;
}*/
CString cstr1 = pTree->GetItemText((HTREEITEM)lParam1);
CString cstr2 = pTree->GetItemText((HTREEITEM)lParam2);

return wcscmp(cstr1,cstr2);
}

void CTest6Dlg::OnBnClickedBtnSortcb()
{
// TODO: Add your control notification handler code here
TVSORTCB tvs;
tvs.hParent = TVI_ROOT;
tvs.lParam = (LPARAM)&m_Tree;
tvs.lpfnCompare = TreeCmpFunc;
m_Tree.SortChildrenCB(&tvs);
}

...全文
150 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
v2nero 2012-12-24
  • 打赏
  • 举报
回复
TreeCmpFunc 这函数里GetItemData直接Crash. GetItemText返回L""(空)
atmel89cs52 2012-12-24
  • 打赏
  • 举报
回复
TreeCmpFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) 里的lParam1,lParam2指的是ItemData
v2nero 2012-12-24
  • 打赏
  • 举报
回复
又沉了。。

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧