| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > WM_LBUTTONDBCLK |
| Автор: AlikV 5.12.2005, 12:08 |
| У меня на главном окне есть ListView В нем соответственно записи Каким оразом чере двойной счелчек на оной из записи запустить PropertySheet Как отловить позицию мыши и какие флаги надо ставить (еси надо)На WinAPI |
| Автор: 2133 5.12.2005, 12:48 |
| http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/listview/listview.asp |
| Автор: Aleksandor 5.12.2005, 13:02 | ||||
| Придется субклассировать ListView В процедуре субклассирования обрабатываем сообщение WM_LBUTTONDBLCLICK С передачей параметров в PropertySheet
Без передачи параметров
|
| Автор: AlikV 5.12.2005, 14:22 | ||||
| Какого типа олжно быть member, и что-то ругаеться на
Да и самое главное это в процедуре обработке всех сообщений надо описать или отделно создавать(если да то где вызывать)? |
| Автор: Aleksandor 5.12.2005, 14:43 |
| static int member; на param будет ругаться, это моя структура, у Вас не определена надо определить ее как свою структуру, например typedef struct _myparams { char szSearch[250]; //BOOL bSMode; //BOOL bAbook; //DWORD index; // может еще чего что нужно } MYSTRUCTURE; ListView надо субклассировать, т.е написать свою процедуру обработки для нужных сообщений, остальные передавать в default процедуру внутри Windows для субклассирования помимо процедуры нужно сначала объявить саму процедуру и переменную WNDPROC хранящую адрес "настоящей" процедуры в недрах windows WNDPROC wpListProc; LRESULT APIENTRY ListSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); потом когда у нас есть дескриптор окна ListView указываем адрес нашей процедуры- wpListProc=(WNDPROC)SetWindowLong(hwndListView,GWL_WNDPROC,(LONG)ListSubclassProc); собственно все... теперь вызывается сначала наша процедура, а потом та которая в Windows ( в конце нашей пишем - return CallWindowProc(wpListProc, hwnd, uMsg, wParam, lParam); ) для обработки остальных сообщений |
| Автор: Earnest 5.12.2005, 16:46 | ||
"Придется" - слишком сильно сказано. Т.е. так тоже можно, но проще ловить уведомление WM_NOTIFY::MN_DBLCLK, которое приходит паренту, и в обработчике делать то, что Aleksandor предложил. В параметрах уведомления будет и точка клика, и итем. Ловить уведомление лучше еще и потому, что существует некая стандартная обработка кликов, дабл-кликов и прочая, в зависимости от стилей контрола. И это надо учитывать, перехватывая эти сообщения. Тогда как ловля уведомлений ничем не грозит в смысле нарушения стандартного поведения. |
| Автор: rsm 5.12.2005, 20:00 | ||
Кусок вполне рабочего кода из моей программы:
|
| Автор: GremlinProg 6.12.2005, 16:09 |
| Про подклассы писать не буду, слишком много, скажу лишь, что проще всего подставить процедуру окна можно на примере всем известной Delphi, а если про двойной щелчок, то NOTIFY переопределять необязательно, достаточно переопределить WM_LBUTTONDBLCLK |
| Автор: Earnest 8.12.2005, 21:28 | ||
Фишка-то как раз в том, что для перехвата WM_LBUTTONDBLCLK требуется сабклассить контрол, а для обработки WM_NOTIFY достаточно добавить case (или отдельный обработчик - уж как кто пишет) - в оконную процедура парента, которая по-любому должна быть своя. Понимаешь разницу? Для обработки двойного клика не нужно добавлять новых сущностей - нового класса ListView. |
| Автор: GremlinProg 10.12.2005, 15:45 |
| ...да, верно, согласен, я просто обычно переадресовываю уведомления самому себе, для удобства, и все мои контролы уже изначально вкючают сукклассинг. Считаю этот метод самым гибким. |