關於LPSTR_TEXTCALLBACK宏的機制

來源:互聯網
上載者:User

 LPSTR_TEXTCALLBACK 是如何請求字串的?

  

這是清單控制項的一種機制,如果把一個Item(或subITem)的文字設定為LPSTR_TEXTCALLBACK,當清單控制項需要顯示這個文字時會向其父控制項發LVN_GETDISPINFO訊息,父控制項必須響應這個訊息並返回要顯示的文字。
你可以在MSDN中輸入LVN_GETDISPINFO查看詳細的說明。

 

這就是虛擬化CListCtrl的一種應用:
http://www.codeproject.com/KB/combobox/virtuallist.ASPx

http://msdn2.microsoft.com/en-us/library/ye4z8x58(VS.80).ASPx

在資源編輯器中選好了ListCtrl的owner data選項,代碼中設定好了列,之後調用SetITemCount(1000);觸發重畫。 1000是你實際的資料行數。行資料可以根據當前顯示的位置來重畫。例如有1000行資料,但實際上使用者可以看到的假設是10列(每螢幕顯示10行),響應相應LVN_GETDISPINFO訊息,我們就可以只重畫1~10行,這樣就大大節省了資源,不需要每次都重畫CListCtrl中的所有1000行資料。這樣效率得到明顯的提高。

 

關於動態提供結點所顯示的字元:首先你在項時需要指明lpszITem參數為: LPSTR_TEXTCALLBACK。在控制項顯示該結點時會通過發送TVN_GETDISPINFO來取得所需要的字元,在處理該訊息時先將參數pNMHDR轉換為LPNMLVDISPINFO,然後填充其中item.pszText。通過item中的iItem,iSubITem可以知道當前顯示的為那一項。下面的代碼示範了這種方法: 

char szOut[8][3]={"No.1","No.2","No.3"}; 
//添加結點 
m_list.InsertITem(LPSTR_TEXTCALLBACK,) 
m_list.InsertITem(LPSTR_TEXTCALLBACK,) 
//處理訊息 
void CParentWnd::OnGetDispInfoList(NMHDR* pNMHDR, LRESULT* pResult) 

    LV_DISPINFO* pLVDI = (LV_DISPINFO*)pNMHDR; 
    pLVDI->item.pszText=szOut[pTVDI->item.iItem];//通過iITem得到需要顯示的字元在數組中的位置 
    *pResult = 0; 

清單控制項的這種機制是為了支援大量資料而設計的。例如用清單控制項顯示資料庫中的資料,資料庫中的資料可能非常多,不太可能把所有資料添加到清單控制項裡面(因為需要大量記憶體和時間),這時可以只向清單控制項中添加少量資料,例如只添加1頁資料,把各個子項的文字都設定為LPSTR_TEXTCALLBACK,當清單控制項要顯示文字時,會向父控制項發送TVN_GETDISPINFO,在響應TVN_GETDISPINFO訊息時,根據當前的排序方式和要顯示的頁從資料庫中尋找相關的資料,並返回給清單控制項顯示。當資料項目數相對較小時,也可以使用虛擬列表的形式。

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.