2010年3月4日 星期四

ListView sort item at anytime

ListView_SortItems可以用來排序,但只能在按在column時進來排序, 在其它時間點即便call ListView_SortItems(hwnd, CompareFunc, lParamSort), 在CompareFunc callback function中的lParam1, lParam2也會是NULL.
int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);

所以,你如果想利用ListView的ListView_SortItems來進行排序卻又不想受限,就模擬OS的message loop,模擬按下ListView的clomun,就能在任何時間點進行sort.

//------------------------------Code-----------------------------------
int nColumnWidth[3]; //假設有3個column
for(int i = 0 ; i < 3; i++)
nColumnWidth[i] = ListView_GetColumnWidth(g_hwndLV, i);

DWORD dwPos = 0;

for(int i = 0; i < g_nSortColumn; i++)
dwPos = dwPos + nColumnWidth[i];

dwPos = dwPos + (nColumnWidth[g_nSortColumn] / 2) + SORT_POS_Y; // SORT_POS_Y的值為0x00140000

HWND hWndListViewHeader = ListView_GetHeader(g_hwndLV);
PostMessage(hWndListViewHeader, WM_SETCURSOR, (WPARAM)hWndListViewHeader, 0x02010001); //lParam固定為0x02010001
PostMessage(hWndListViewHeader, WM_LBUTTONDOWN, 0X00000001, dwPos); // wParam 固定為0X00000001
PostMessage(hWndListViewHeader, WM_LBUTTONUP, 0X00000001, dwPos);


//------------------------------Code-----------------------------------

dwPos 的算法為4個bit一個數字,前4個bit代表Y,後4個bit代表X, 0X0014006A代表座標X:106, Y:20











沒有留言: