2009-12-11 23:13
問(wèn)題:
我在一個(gè)對(duì)話框里有一個(gè) LISTCTRL (其ID為IDC_LIST1)并增加了以下消息映射:
ON_NOTIFY(HDN_ITEMCHANGING, IDC_LIST1, OnItemchangingList1)
ON_NOTIFY(HDN_ITEMCLICK, IDC_LIST1, OnItemclickList1)
ON_NOTIFY(HDN_ITEMCHANGED, IDC_LIST1, OnItemchangedList1)
ON_NOTIFY(HDN_TRACK, IDC_LIST1, OnTrackList1)
并且 IDC_LIST1 具有 LVS_REPORT 風(fēng)格。
但是程序執(zhí)行過(guò)程中,對(duì)應(yīng)的消息處理函數(shù)一個(gè)也不會(huì)執(zhí)行,不管我對(duì) LISTCTRL 中的 HEADCTRL 如果操作也沒有一個(gè)消息處理函數(shù)被執(zhí)行。
回答:
1、把ON_NOTIFY(HDN_ITEMCHANGING, IDC_LIST1, OnItemchangingList1)改為
ON_NOTIFY(HDN_ITEMCHANGING, 0, OnItemchangingList1)
試試...
理由見此:http://www.codeproject.com/KB/list/headerctrl.aspx
摘:
Handling Notification Messages
Handling CHeaderCtrl messages in a CListCtrl strains ClassWizard's magic powers. The problem is that ClassWizard considers the CHeaderCtrl embedded in a CListCtrl to be of the same "message depth" as any other Common Control (CButton or CEdit Control, for instance). In practice however, the CHeaderCtrl is actually a child of the CListCtrl in which it resides. While the CListCtrl's immediate parent is the CDialog in which it is instantiated, the CHeaderCtrl's immediate parent is the CListCtrl. This is also suggested by the following two points:
Unlike other Common Controls on a CDialog, the CHeaderCtrl in the CListCtrl is not given an explicit resource ID;
The existence of the CListCtrl::GetHeaderCtrl(...) method
This problem arises when you use ClassWizard to create CHeaderCtrl handlers in a CDialog derived class. To create a CHeaderCtrl message handler, you first right click the CListCtrl object in the Resource Editor and select ClassWizard from the popup menu. ClassWizard then enumerates all the messages for this CListCtrl, including those sent by the CHeaderCtrl window. These messages are handled through the ON_NOTIFY macro construction. The list looks something like this:
Attempting to implement a message handler for HDN_<X> messages using Class Wizard will then generate an incorrect Message Map entry. For instance, creating a message handler for the HDN_ENDDRAG message will create an entry such as: ON_NOTIFY(HDN_ENDDRAG, IDC_LIST_CTRL, OnEnddragListCtrl). Unfortunately, the IDC_LIST_CTRL is not responsible for notifying the parent of a HDN_ENDDRAG message. It is the embedded CHeaderCtrl which sends the message, so the ON_NOTIFY macro should use the ID of the CHeaderCtrl. Using Spy++, we can determine that the ID of the CHeaderCtrl is 0, so the ON_NOTIFY entry needs to be manually edited to the following: ON_NOTIFY(HDN_ENDDRAG, 0, OnEnddragListCtrl). This roundabout way connects the WM_NOTIFY messages of the CHeaderCtrl to the "second-level" parent of the CHeaderCtrl, which is often where message processing is handled.
回答2、

對(duì)于繼承的類從ClassWizard添加HDN_ITEMCLICK消息響應(yīng),默認(rèn)是ON_NOTIFY_REFLECT(HDN_ITEMCLICK, OnItemclick)
結(jié)果響應(yīng)不上...改為
ON_NOTIFY(HDN_ITEMCLICK,0, OnItemclick)
后就響應(yīng)了
愛華網(wǎng)



