2011-12-08 34 views
0

所以我正在使用PostMessage(LVN_INSERTITEM,0,(LPARAM) lvitem)實現CListCtrl。我需要一種方法來區分lvitems,以便稍後當我得到一個lvitem時,告訴它是一個文件還是目錄。我需要使用PostMessage來實現,所以我不知道該項目何時插入。我動態分配項目(將動態分配的內存指針存儲在LVITEM結構的lParam屬性中,所以在插入它之後,我將它視爲通知並取消分配從項目獲取地址的內存)。如何區分一些LVITEMS(文件或目錄)?

+0

在wParam中存儲布爾或枚舉? –

+0

或者只是在lvitem結構之後存儲其他數據。 –

回答

1

可以使用LVITEM結構的lParam成員設置自定義的數據爲您列出的項目:

// custom structure to hold some information 
struct listItem { 
    int value; 
    char path[MAX_PATH]; 
}; 

// initialize a custom object to hold a value and a path 
LVITEM lvi; 
listItem* pItem = new listItem(); 
pItem->value = 666; 
sprintf(pItem->path,"c:\\\\xampp\\htdocs"); 

// initialize a LVITEM object 
memset(&lvi, 0, sizeof(lvi)), 
lvi.pszText = "My Folder"; 
lvi.mask = LVIF_PARAM | LVIF_TEXT; 
// lParam points to our custom object 
lvi.lParam = (LPARAM)pItem; 
SendMessage(g_hwndLV, LVM_INSERTITEM, 0, (LPARAM)&lvi); 

注:在這種情況下,你應該釋放內存指出通過lParam使用delete來。

+0

關於這個想法很好,但不幸的是,對我來說,lparam已經被用於存儲動態分配的LVITEM的原始指針,以便在它插入與postmessage異步後,我可以處理通知,並且從新插入的項目中獲取原始地址,並將其解除分配。 –

+1

我在想這個,是的,我想我要定義一個保存地址的結構,以及一個用於確定文件或目錄的布爾變量,並將結構設置爲lParam,並且當我收到LVN_INSERT_ITEM通知處理項目地址,我要設置它的項目數據。 –

0

您可以使用CListCtrl::SetItemData設置任意數據,但您應該使用方法CListCtrl::InsertItem而不是使用PostMessage(它是低級別的Win32調用,而不是MFC)。

+0

我知道我可以使用該函數設置數據,但通過使用postmessage,我不知道消息何時將被處理,所以我不知道該項目何時插入,並且唯一一次我知道它是屬性是當我postmessage它。我需要不同的解決方案。 –

+0

那你爲什麼要用PostMessage()呢?除了不是慣用的MFC代碼,它不能解決你的問題。你爲什麼不使用'CListCtrl :: InsertItem()'? – Andre

+0

@Andre - OP發佈來自不同線程的lvitem?這將解釋PostMessage和在CListCtrl更新後取消分配lvitem的必要(發佈線程已經綁定了lvitem,但通過發佈其指針來放棄所有權 - 接收線程必須在處理該消息之後釋放它)。 –

相關問題