Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WM_LBUTTONDBCLK, Двойной клик мыши 
:(
    Опции темы
AlikV
  Дата 5.12.2005, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 25.10.2005

Репутация: нет
Всего: нет



У меня на главном окне есть ListView
В нем соответственно записи
Каким оразом чере двойной счелчек на оной из записи запустить
PropertySheet
Как отловить позицию мыши и какие флаги надо ставить
(еси надо)На WinAPI
PM MAIL   Вверх
2133
Дата 5.12.2005, 12:48 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











  Вверх
Aleksandor
Дата 5.12.2005, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Практик
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 22.11.2005
Где: россия, зеленогра д

Репутация: 10
Всего: 12



Придется субклассировать ListView smile
В процедуре субклассирования обрабатываем сообщение WM_LBUTTONDBLCLICK

С передачей параметров в PropertySheet
Код

LRESULT APIENTRY ListSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 

 static  MYSTRUCTURE param;
 LV_ITEM lvI;
 LVHITTESTINFO hittest;
 // другие переменные.......

 switch (uMsg) {
 case WM_LBUTTONDBLCLK:
    hittest.pt.x=GET_X_LPARAM(lParam); 
    hittest.pt.y=GET_Y_LPARAM(lParam); 
    member=ListView_HitTest(hwnd,&hittest);
              if (member==-1) return 0;
           lvI.iSubItem=0;              // узнаем имя выбранного элемента
           lvI.pszText =szName;
           lvI.cchTextMax=MAX_PATH;
        SendMessage(hwnd,LVM_GETITEMTEXT,(WPARAM)member,(LPARAM)&lvI);
        strcpy(param.szSearch,szName);
        // другое-флаги и т.п.
           pABookPage[0].lParam  = (LPARAM)&param;
           pABookPage[1].lParam  = (LPARAM)&param;
           pABookPage[2].lParam  = (LPARAM)&param;
        PropertySheet(&pABookHeader);
        break;
//  other processing
//............................
 }
    return CallWindowProc(wpListProc, hwnd, uMsg, wParam, lParam); 


Без передачи параметров
Код

 case WM_LBUTTONDBLCLK:
    hittest.pt.x=GET_X_LPARAM(lParam); 
    hittest.pt.y=GET_Y_LPARAM(lParam); 
    member=ListView_HitTest(hwnd,&hittest);
              if (member==-1) return 0;

       PropertySheet(&pABookHeader);
       break;



Это сообщение отредактировал(а) Aleksandor - 5.12.2005, 13:20


--------------------
Call out Gouranga be happy!!!
Gouranga Gouranga Gouranga ....
That which brings the highest happiness!!
PM MAIL   Вверх
AlikV
Дата 5.12.2005, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 25.10.2005

Репутация: нет
Всего: нет



Какого типа олжно быть member,
и что-то ругаеться на

Код

 static  MYSTRUCTURE param;


Цитата

error C2146: syntax error : missing ';' before identifier 'param'
error C2065: 'param' : undeclared identifier


Да и самое главное это в процедуре обработке всех сообщений надо описать или отделно создавать(если да то где вызывать)?
PM MAIL   Вверх
Aleksandor
Дата 5.12.2005, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Практик
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 22.11.2005
Где: россия, зеленогра д

Репутация: 10
Всего: 12



static int member;

на param будет ругаться, это моя структура, у Вас не определена smile
надо определить ее как свою структуру, например

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); )
для обработки остальных сообщений smile



--------------------
Call out Gouranga be happy!!!
Gouranga Gouranga Gouranga ....
That which brings the highest happiness!!
PM MAIL   Вверх
Earnest
Дата 5.12.2005, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Цитата(Aleksandor @ 5.12.2005, 13:02)
Придется субклассировать ListView

"Придется" - слишком сильно сказано.
Т.е. так тоже можно, но проще ловить уведомление WM_NOTIFY::MN_DBLCLK, которое приходит паренту, и в обработчике делать то, что Aleksandor предложил. В параметрах уведомления будет и точка клика, и итем.

Ловить уведомление лучше еще и потому, что существует некая стандартная обработка кликов, дабл-кликов и прочая, в зависимости от стилей контрола. И это надо учитывать, перехватывая эти сообщения. Тогда как ловля уведомлений ничем не грозит в смысле нарушения стандартного поведения.


--------------------
...
PM   Вверх
rsm
Дата 5.12.2005, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 999
Регистрация: 16.3.2005

Репутация: 4
Всего: 62



Кусок вполне рабочего кода из моей программы:
Код

// hKeys - хэндл окна ListView
// nCurSel - порядковый номер выделенной строки

case WM_NOTIFY:
    if(((LPNMHDR)lParam)->hwndFrom != hKeys)
        break;
    nCurSel = SendMessage(hKeys, LVM_GETNEXTITEM, -1, LVIS_SELECTED);
    if(nCurSel < 0)
        break;
    switch(((LPNMHDR)lParam)->code)
    {
        case NM_DBLCLK: // двойной клик мышью
            SendMessage(hDlg, WM_COMMAND, IDC_BTEDIT, 0);
            break;


Это сообщение отредактировал(а) rsm - 5.12.2005, 20:02
PM MAIL   Вверх
GremlinProg
Дата 6.12.2005, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Про подклассы писать не буду, слишком много, скажу лишь, что проще всего подставить процедуру окна можно на примере всем известной Delphi, а если про двойной щелчок, то NOTIFY переопределять необязательно, достаточно переопределить WM_LBUTTONDBLCLK


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Earnest
Дата 8.12.2005, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Цитата(GremlinProg @ 6.12.2005, 16:09)
NOTIFY переопределять необязательно, достаточно переопределить WM_LBUTTONDBLCLK

Фишка-то как раз в том, что для перехвата WM_LBUTTONDBLCLK требуется сабклассить контрол, а для обработки WM_NOTIFY достаточно добавить case (или отдельный обработчик - уж как кто пишет) - в оконную процедура парента, которая по-любому должна быть своя. Понимаешь разницу? Для обработки двойного клика не нужно добавлять новых сущностей - нового класса ListView.


--------------------
...
PM   Вверх
GremlinProg
Дата 10.12.2005, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



...да, верно, согласен, я просто обычно переадресовываю уведомления самому себе, для удобства, и все мои контролы уже изначально вкючают сукклассинг. Считаю этот метод самым гибким.


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1174 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.