处理WM_NOTIFY讯息

【勇芳软件工作室】汉化HomePreviousNext

列表视图控件通过发送WM_NOTIFY消息来通知其父窗口的事件。【wParam中】参数是列表视图控件的标识符,【lParam的】参数是NMHDR结构的地址(或具有NMHDR结构作为其第一个成员的较大结构)的地址。本节中的示例处理LVN_GETDISPINFOLVN_ENDLABELEDITLVN_COLUMNCLICK通知消息。

列表视图控件发送LVN_GETDISPINFO通知消息以从父窗口检索有关项目或子项目的信息。例如,当需要显示具有LPSTR_TEXTCALLBACK值的项目时,会发送此通知。

当用户完成或取消对项目标签的编辑时,列表视图控件发送LVN_ENDLABELEDIT通知消息。仅当列表视图控件具有LVS_EDITLABELS窗口样式时才发送此通知。如果正在取消编辑,父窗口通常什么都不做。如果编辑完成,父窗口应将项目标签设置为新文本,除非项目标签为LPSTR_TEXTCALLBACK。在这种情况下,父窗口应该简单地更新它为列表项维护的应用程序定义的数据。

如果用户在报表视图中单击列标题,列表视图控件将发送LVN_COLUMNCLICK通知消息。通常,应用程序会在发生点击时按指定的列排序列表视图。要排序,请使用LVM_SORTITEMS消息,指定应用程序定义的比较功能。

以下示例显示处理WM_NOTIFY消息的应用程序窗口过程的部分。

case WM_NOTIFY:

//根据具体的通知信息进行分支。

switch(((LPNMHDR)lParam) - > code){

//处理LVN_GETDISPINFO以提供有关的信息

//回调项

case LVN_GETDISPINFO:

Main_OnGetDispInfo((LV_DISPINFO *) lParam);

break;

//处理LVN_ENDLABELEDIT以改变项目标签

//就地编辑。

case LVN_ENDLABELEDIT:

返回Main_OnEndLabelEdit(

(LV_DISPINFO *)lParam

);

//处理LVN_COLUMNCLICK按列排序项目。

case LVN_COLUMNCLICK:

#define pnm((NM_LISTVIEW *)lParam)

ListView_SortItems(

pnm- > hdr.hwndFrom,

ListViewCompareFunc,

(LPARAM)(pnm- > iSubItem)

);

// notification message.

break;

}

break;

以下示例显示了窗口过程用于处理列表视图通知消息的应用程序定义函数。

// Main_OnGetDispInfo - 处理LVN_GETDISPINFO

//通知消息。en

// pnmv - lParam的值(指向LV_DISPINFO结构)

VOID WINAPI Main_OnGetDispInfo(LV_DISPINFO * pnmv)

{

//如果请求,请提供项目或子项目的文本。

if(pnmv- > item.mask & LVIF_TEXT){

MYITEM *pItem = (MYITEM *) (pnmv->item.lParam);

lstrcpy(pnmv- > item.pszText,

pItem->aCols[pnmv->item.iSubItem]);

}

}

// Main_OnEndLabelEdit - 处理LVN_ENDLABELEDIT

//通知消息。en

//如果标签更改则返回TRUE,否则返回FALSE。

// pnmv - lParam的值(指向LV_DISPINFO结构)

BOOL Main_OnEndLabelEdit(LV_DISPINFO *pnmv)

{

MYITEM *pItem;

//如果正在取消编辑,该项目为-1。

if (pnmv->item.iItem == -1)

return FALSE;

//将新文本复制到应用程序定义的结构中,

//将指针保存为项目数据的指针。

pItem = (MYITEM *) (pnmv->item.lParam);

pItem->aCols[0] = (PSTR) LocalReAlloc(

(ADO)(Pitm- {989 796 004} {AKS 989 796 008});

lstrlen(pnmv- > item.pszText)+ 1,

LMEM_MOVEABLE

);

Lsatrkpi(Pitm- {989 796 004} {AKS 989 796 008},{Pnmv- 989 796 004} Aitmkpsztest);

//不需要设置项目文本,因为它是一个回调项。

return TRUE;

}

// ListViewCompareFunc - 对列表视图控件进行排序。它是一个

//比较功能。

//如果第一个项目应该在前面,则返回一个负值

//第二个项目,如果第一个项目应该是正值

//跟随第二个项目,如果项目是等效的,则为零。

// lParam1和lParam2 - 两个项目的项目数据(在此

// case,指向应用程序定义的MYITEM结构的指针)

// lParamSort - 由LVM_SORTITEMS消息指定的值

//(在这种情况下,要排序的列的索引)

int CALLBACK ListViewCompareFunc(

LPARAM lParam1,

LPARAM lParam2,

LPARAM lParamSort)

{

MYITEM *pItem1 = (MYITEM *) lParam1;

MYITEM *pItem2 = (MYITEM *) lParam2;

//比较指定的列。

int iCmp = lstrcmpi(pItem1->aCols[lParamSort],

pItem2->aCols[lParamSort]);

//返回结果如果非零,或者比较

//否则第一列。

return (iCmp != 0) ? iCmp :

LSTRCMPI(pItem1-助手{} {989796004 989796012} {pItem2- 989 796 004 989 796 013} {}助手);

}