|
| БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО! |
|
|
Processing the WM_NOTIFY Message
A list view control notifies its parent window of events by sending a WM_NOTIFY message. The wParam parameter is the identifier of the list view control, and the lParam parameter is the address of an NMHDR structure (or to a larger structure that has an NMHDR structure as its first member). The example in this section processes the LVN_GETDISPINFO, LVN_ENDLABELEDIT, and LVN_COLUMNCLICK notification messages.
A list view control sends the LVN_GETDISPINFO notification message to retrieve information about an item or subitem from the parent window. This notification is sent, for example, when an item with the LPSTR_TEXTCALLBACK value needs to be displayed. A list view control sends the LVN_ENDLABELEDIT notification message when the user completes or cancels editing of an item's label. This notification is only sent if the list view control has the LVS_EDITLABELS window style. If editing is being canceled, the parent window typically does nothing. If editing is being completed, the parent window should set the item label to the new text, unless the item label is LPSTR_TEXTCALLBACK. In that case, the parent window should simply update the application-defined data it maintains for the list item.
If the user clicks a column header in report view, a list view control sends the LVN_COLUMNCLICK notification message. Typically, an application sorts a list view by the specified column when this clicking occurs. To sort, use the LVM_SORTITEMS message, specifying an application-defined comparison function. The following example shows the portion of the application's window procedure that processes the WM_NOTIFY message.
case WM_NOTIFY: // Branch depending on the specific notification message. switch (((LPNMHDR) lParam)->code) { // Process LVN_GETDISPINFO to supply information about // callback items. case LVN_GETDISPINFO: Main_OnGetDispInfo((LV_DISPINFO *) lParam); break; // Process LVN_ENDLABELEDIT to change item labels after // in-place editing. case LVN_ENDLABELEDIT: return Main_OnEndLabelEdit(
(LV_DISPINFO *) lParam ); // Process LVN_COLUMNCLICK to sort items by column. case LVN_COLUMNCLICK: #define pnm ((NM_LISTVIEW *) lParam) ListView_SortItems( pnm->hdr.hwndFrom, ListViewCompareFunc, (LPARAM) (pnm->iSubItem) ); #undef pnm break; } break;
The following example shows the application-defined functions that the window procedure uses to process list view notification messages.
// Main_OnGetDispInfo - processes the LVN_GETDISPINFO // notification message. // pnmv - value of lParam (points to an LV_DISPINFO structure) VOID WINAPI Main_OnGetDispInfo(LV_DISPINFO *pnmv) { // Provide the item or subitem's text, if requested. if (pnmv->item.mask & LVIF_TEXT) { MYITEM *pItem = (MYITEM *) (pnmv->item.lParam); lstrcpy(pnmv->item.pszText, pItem->aCols[pnmv->item.iSubItem]); } } // Main_OnEndLabelEdit - processes the LVN_ENDLABELEDIT
// notification message. // Returns TRUE if the label is changed or FALSE otherwise. // pnmv - value of lParam (points to an LV_DISPINFO structure) BOOL Main_OnEndLabelEdit(LV_DISPINFO *pnmv) { MYITEM *pItem; // The item is -1 if editing is being canceled. if (pnmv->item.iItem == -1) return FALSE; // Copy the new text to the application-defined structure, // a pointer to which is saved as item data. pItem = (MYITEM *) (pnmv->item.lParam);
pItem->aCols[0] = (PSTR) LocalReAlloc( (HLOCAL) (pItem->aCols[0]), lstrlen(pnmv->item.pszText) + 1, LMEM_MOVEABLE ); lstrcpy(pItem->aCols[0], pnmv->item.pszText); // No need to set the item text, because it is a callback item. return TRUE; } // ListViewCompareFunc - sorts the list view control. It is a // comparison function. // Returns a negative value if the first item should precede the // second item, a positive value if the first item should
// follow the second item, and zero if the items are equivalent. // lParam1 and lParam2 - item data for the two items (in this // case, pointers to application-defined MYITEM structures) // lParamSort - value specified by the LVM_SORTITEMS message // (in this case, the index of the column to sort) int CALLBACK ListViewCompareFunc( LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) { MYITEM *pItem1 = (MYITEM *) lParam1; MYITEM *pItem2 = (MYITEM *) lParam2;
// Compare the specified column. int iCmp = lstrcmpi(pItem1->aCols[lParamSort], pItem2->aCols[lParamSort]); // Return the result if nonzero, or compare the // first column otherwise. return (iCmp != 0) ? iCmp : lstrcmpi(pItem1->aCols[0], pItem2->aCols[0]); }
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
Обработка Сообщения WM_NOTIFY
Управление вида списка уведомляет свое родительское окно о событиях посылая сообщение WM_NOTIFY. Параметр wParam является идентификатором управления вида списка, и параметр lParam является адресом структуры NMHDR (или в большую структуру, что имеет структуру NMHDR как первый член). Пример в этой секции обрабатывает LVN_GETDISPINFO, LVN_ENDLABELEDIT, и сообщения уведомления LVN_COLUMNCLICK.
Управление вида списка посылает сообщение уведомления LVN_GETDISPINFO, чтобы извлекать информации о пункте или подэлементе из родительского окна. Это уведомление послано, например, когда пункт с величиной LPSTR_TEXTCALLBACK должен быть отображен. Управление вида списка посылает сообщение уведомления LVN_ENDLABELEDIT когда пользователь завершает или отменяет редактирование этикетки пункта. Это уведомление только послано если управление вида списка имеет стиль окна LVS_EDITLABELS. Если редактирование отменяется, родительское окно обычно делает ничто. Если редактирование завершается, родительское окно должно устанавливать этикетку пункта в новый текст, если этикетка пункта не - LPSTR_TEXTCALLBACK. В этом случае, родительское окно должно просто корректировать определенные прикладные данные, которые он поддерживается для пункта списка.
Если пользователь щелкает заголовок столбца с сообщения точки зрения, управление вида списка посылает сообщение уведомления LVN_COLUMNCLICK. Обычно, приложение сортирует вид списка определенным столбцом когда этот щелчок происходит. Для того, чтобы сортироваться, используйте сообщение LVM_SORTITEMS, определяя определенную прикладную функцию сравнения. Следующий пример показывает часть прикладной процедуры окна, которое обрабатывает сообщение WM_NOTIFY.
случай WM_NOTIFY: // Ветка в зависимости от специфического сообщения уведомления. ключ (((LPNMHDR) lParam)->code) { // Обработайте LVN_GETDISPINFO, чтобы поставлять информацию о // пунктах возврата. случай LVN_GETDISPINFO: Main_OnGetDispInfo((LV_DISPINFO *) lParam); прерывание; // Обработайте LVN_ENDLABELEDIT, чтобы изменять этикетки пункта после // в-редактировании места. случай LVN_ENDLABELEDIT: возврат Main_OnEndLabelEdit(
(LV_DISPINFO *) lParam ); // Обработайте LVN_COLUMNCLICK, чтобы сортировать пункты столбцом. случай LVN_COLUMNCLICK: #define pnm ((NM_LISTVIEW *) lParam) ListView_SortItems( pnm->hdr.hwndFrom, ListViewCompareFunc, (LPARAM) (pnm->iSubItem) ); pnm прерывание #undef; } прерывание;
Следующий пример показывает определенные прикладные функции, что процедура окна использует, чтобы обрабатывать сообщения уведомления вида списка.
// Main_OnGetDispInfo - обрабатывает сообщение уведомления LVN_GETDISPINFO //. // pnmv - величина lParam ПУСТОТЫ (точки на структуру LV_DISPINFO) WINAPI Main_OnGetDispInfo(LV_DISPINFO *pnmv) { // Обеспечьте пункт или текст подэлемента, если запрошено. если (pnmv->item.mask & LVIF_TEXT) { MYITEM *pItem = (MYITEM *) (pnmv->item.lParam); lstrcpy(pnmv->item.pszText, pItem->aCols[pnmv->item.iSubItem]); } } // Main_OnEndLabelEdit - обрабатывает LVN_ENDLABELEDIT
// сообщение уведомления. // ИСТИНА Возврата если этикетка изменена или ЛОЖЬ в противном случае. // pnmv - величина lParam (точки на структуру LV_DISPINFO) BOOL Main_OnEndLabelEdit(LV_DISPINFO *pnmv) { MYITEM *pItem; // Пункт - -1 если редактирование отменяется. если (pnmv->item.iItem == -1) обратная ЛОЖЬ; // Копия новый текст в определенную прикладную структуру, // a указатель на которые сохранены как данные пункта. pItem = (MYITEM *) (pnmv->item.lParam);
pItem->aCols[0] = (PSTR) LocalReAlloc( (HLOCAL) (pItem->aCols[0]), lstrlen(pnmv->item.pszText) + 1, LMEM_MOVEABLE ); lstrcpy(pItem->aCols[0], pnmv->item.pszText); // Нет необходимости устанавливать текст пункта, поскольку это - пункт возврата. возвращайтесь ВЕРНО; } // ListViewCompareFunc - СОРТИРУЕТ управление вида списка. Это - // функция сравнения. // Возврат отрицательная величина если первый пункт должен предшествовать // пункту секунды, положительная величина если первый пункт должен
// последуйте за вторым пунктом, и нулем если пункты эквиалентные. // lParam1 и lParam2 - данные пункта для двух пунктов (в этому // случая, указателей в определенные прикладные структуры 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]); // Возврат результат если ненулево или сравнивать // первый столбец в противном случае. возврат (iCmp != 0)? iCmp : lstrcmpi(pItem1->aCols[0], pItem2->aCols[0]); }
|
|
|
|
| |