2013-08-22 61 views
1

我正在嘗試獲取MFC CListCtrl中列的順序。最初我嘗試在HDN_ENDDRAG通知的消息處理程序中調用GetColumnOrderArray(),但總是返回舊的(預拖放)列順序。因此,根據this SO發表的評論,我嘗試處理HDN_BEGINDRAGHDN_ENDDRAG,並用phdr->pitem->iOrder來抓取新舊列訂單。但在這兩個處理程序中,pitem對我來說始終是NULL。不知道爲什麼。獲取列順序(MFC)

SOOO我嘗試使用存儲在郵件(phdr->iItem)中的列索引直接與CHeaderCtrl對話,並自己獲取列順序,但由我的標題控件填充的結構中的字段都是無效的;我仍然無法獲得列順序。

我的列表控件是否存在某種深層次的問題?或者我只是處理消息不正確?

HDN_BEGINDRAG消息處理程序:

BOOL CDFAManListView::OnHdnBegindrag(UINT, NMHDR *pNMHDR, LRESULT *pResult) 
{ 
    LPNMHEADER phdr = reinterpret_cast<LPNMHEADER>(pNMHDR); 

    phdr->iItem; // this contains a valid column index 

    HDITEM columnStruct; 

    List->GetHeaderCtrl()->GetItem(phdr->iItem, &columnStruct); // but this call just fills columnStruct with junk values 

    if (phdr->pitem) // pitem is always null 
    { 
     initialPosition = phdr->pitem->iOrder; 
    } 

    *pResult = 0; 
    return TRUE; 
} 

HDN_ENDDRAG消息處理程序:

void CDFAManListView::OnHdnEnddrag(NMHDR *pNMHDR, LRESULT *pResult) 
{ 
    LPNMHEADER phdr = reinterpret_cast<LPNMHEADER>(pNMHDR); 

    HDITEM columnStruct; 

    List->GetHeaderCtrl()->GetItem(phdr->iItem, &columnStruct); // still just fills columnStruct with junk 

    List->GetColumnOrderArray(signalColumnOrder); // gets **old** column order 

    *pResult = 0; 
} 

回答

0

雖然這是一個老問題,但我在查看CListCtrl列的拖動時發現了它,並認爲如果它對其他人有用,我會更新它。

的OP提到,

HDITEM columnStruct; 

List->GetHeaderCtrl()->GetItem(phdr->iItem, &columnStruct); // but this call just fills columnStruct with junk values 

這將因爲你還沒有初始化columnStruct足以告訴的GetItem哪些數據您感興趣的檢索。您需要使用各種標誌(如HDI_WIDTH |)來初始化columnStruct.mask HDI_ORDER,如果你使用HDI_TEXT,那麼給columnStruct.pszText一個緩衝區並且columnStruct.cchTextMax爲緩衝區的大小。例如

這是documented in the CHeaderCtrl::GetItem documentation on MSDN

在mask元素中設置的任何標誌都可以確保 相應元素中的值在返回時被正確填充。如果將掩碼 設置爲零,則其他結構元素中的值爲 無意義。

+0

可愛的,我只是沒有仔細閱讀文檔 - - - – aguazales

0

這可能有點簡單的解決方案的,爲什麼不叫GetColumnOrderArray()時需要關閉列表控件的父?

如果你確實需要一些其他目的列順序馬上從SO後你引用,它看起來像HDN_ENDDRAG是爲時過早GetColumnOrderArray(),嘗試PostMessage到(父)在列表控件OnHdnEnddrag()的結尾,消息號碼範圍爲WM_USER through 0x7FFF,並在該消息的處理程序中調用GetColumnOrderArray()

+0

我試着你的第一個解決方案已經通過從包含我的列表控件的CListView的析構函數調用'GetColumnOrderArray()',但是列表控件已經無效了,該程序崩潰:(我會看看如果我可以得到你的第二個解決方案的工作,但PostMessage()並沒有給你一個明確的信息將被處理,對嗎?我不能保證父母會在'HDN_ENDDRAG'處理程序完成後處理消息,'GetColumnArray()'會返回有效答案? – aguazales

+0

我確定析構函數太晚了,這就是爲什麼我提到「何時需要關閉列表控件的父項」,以便在關閉過程開始之前;你用什麼樣的父類來託管ListControl? 'PostMessage'只會在處理完所有其他隊列消息後才處理消息,值得一試 –

+0

好的,我會試一試。父母是「CListView」。我試圖從'CListView'的析構函數調用'GetColumnOrderArray()',而不是'CListCtrl()'。 – aguazales