📄 listctrlx.cpp
字号:
// ListCtrlX.cpp : implementation file
//
#include "stdafx.h"
#include "ListCtrlX.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
CListCtrlX::CListCtrlX()
{
}
CListCtrlX::~CListCtrlX()
{
}
BEGIN_MESSAGE_MAP(CListCtrlX, CListCtrl)
//{{AFX_MSG_MAP(CListCtrlX)
ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnColumnClick)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BOOL CListCtrlX::OnCommand(WPARAM wParam, LPARAM lParam)
{
CString sBuffer;
int nSrcColumn = -1;
int nDesColumn = -1;
nDesColumn = wParam - BEGIN_CTRL_ID;
m_Popup.GetMenuString(wParam, sBuffer, MF_BYCOMMAND);
int nColumnCount = GetHeaderCtrl()->GetItemCount();
int nMenuCount = m_Popup.GetMenuItemCount();
LVCOLUMN column;
column.mask = LVCF_TEXT;
column.cchTextMax = 50;
WCHAR buffer[50];
column.pszText = buffer;
for(int n=0;n<nColumnCount;n++)
{
GetColumn(n, &column);
if(sBuffer == buffer)
{
nDesColumn = n;
break;
}
}
bool bFind;
for(int i=0;i<nColumnCount;i++)
{
bFind = false;
GetColumn(i, &column);
for(int j=0;j<nMenuCount;j++)
{
m_Popup.GetMenuString(i, sBuffer, MF_BYPOSITION);
bFind |= sBuffer == buffer;
}
if(!bFind)
{
nSrcColumn = i;
break;
}
}
SwapColumn(nSrcColumn, nDesColumn);
return TRUE;
}
void CListCtrlX::OnColumnClick(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
LVCOLUMN column;
column.mask = LVCF_TEXT;
m_Popup.DestroyMenu();
VERIFY(m_Popup.CreatePopupMenu());
int nColumnCount = GetHeaderCtrl()->GetItemCount();
UINT nCtrlID = BEGIN_CTRL_ID;
for(int i=0;i<nColumnCount;i++)
{
if(i == pNMListView->iSubItem) continue;
WCHAR buffer[50];
column.pszText = buffer;
column.cchTextMax = 50;
VERIFY(GetColumn(i, &column));
m_Popup.AppendMenu(MF_STRING, nCtrlID++ , buffer);
}
POINT oPoint = {0,0};
//if the os did not support the GetCursorPos API then use the default value of oPoint 0,0
//we can change the default point on initialize oPoint
GetCursorPos( &oPoint);
m_Popup.TrackPopupMenu(TPM_LEFTALIGN | TPM_BOTTOMALIGN, oPoint.x, oPoint.y, this);
}
void CListCtrlX::SwapColumn(int nSrc, int nDes)
{
ASSERT(nSrc >= 0 && nDes >=0 && nSrc != nDes);
WCHAR buffer[256];
int nColumnCount;
int nItemCount;
nColumnCount = GetHeaderCtrl()->GetItemCount();
nItemCount = GetItemCount();
WCHAR srcBuffer[50];
WCHAR desBuffer[50];
LVCOLUMN columnSrc;
LVCOLUMN columnDes;
columnSrc.mask = LVCF_TEXT;
columnSrc.cchTextMax = 50;
columnSrc.pszText = srcBuffer;
columnDes.mask = LVCF_TEXT;
columnDes.cchTextMax = 50;
columnDes.pszText = desBuffer;
VERIFY(GetColumn(nSrc, &columnSrc));
VERIFY(GetColumn(nDes, &columnDes));
SetColumn(nSrc, &columnDes);
SetColumn(nDes, &columnSrc);
for(int i=0;i<nItemCount;i++)
{
InsertItem(nItemCount + i, NULL);
for(int j=0;j<nColumnCount;j++)
{
GetItemText(i, j, buffer, 256);
if(j == nSrc)
{
GetItemText(i, nDes, buffer, 256);
}
if(j == nDes)
{
GetItemText(i, nSrc, buffer, 256);
}
SetItemText(nItemCount + i, j, buffer);
}
}
for(int in=0;in<nItemCount;in++)
{
DeleteItem(0);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -