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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите.Как корректно поймать двойной щелчок мыши, (не одинарный) 
:(
    Опции темы
Dmitriy2k
Дата 22.4.2009, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шустрый
*


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

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



Привет! Подскажите, что делать.

Дело в том, что главный интерфейс(окно с меню и кодом) написан на Delphi.
Оттуда двойным щелчком на нужном пункте я запускаю плагин(DLL, написанная на VC++60)

Код


//Запускаем плагин!
extern "C" __declspec(dllexport) StartPlugin(HINSTANCE hClient)
{   
       hDialogThread = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)threadDialog, &hClient, 0, &hDialogThreadId);
}



Код

//создаем диалоговое окно плагина(IDD_MAIN)
int threadDialog(HINSTANCE *hClient)
{
        DialogBox(*hClient, MAKEINTRESOURCE(IDD_MAIN), 0, DLGPROC(DlgProc));
        return 0;
}


//оконная процедура
BOOL CALLBACK DlgProc(HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam)
{  
        switch(wMsg)                                
        {
                 case WM....    :break;
                 ..............
                 case WM_LBUTTONDOWN:                //case WM_NCLBUTTONDBLCLK: и так проборвал.
                        //мне нужен двойной щелчок
                        MessageBox(NULL,"OK","OK",MB_OK);
                        break;
                 ................                                
         }
   return FALSE; 
}



Сначала вылетает <<MessageBox(NULL,"OK","OK",MB_OK);>> наверное потому что я запустил плагин двойным щелчком.
Потом я тупо тыкаю несколько раз на появляющиеся MessageBox'ы.

Почему вылетает MessageBox, ведь дочернее окно(окно плагина, код которового приведен выше) даже не появилось?

Затем появляется дочернее окно.
...



PM MAIL   Вверх
586
Дата 23.4.2009, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

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



Цитата(Dmitriy2k @  23.4.2009,  00:11 Найти цитируемый пост)
extern "C" __declspec(dllexport) StartPlugin(HINSTANCE hClient)
{   
       hDialogThread = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)threadDialog, &hClient, 0, &hDialogThreadId);
}

потоконебезопасный код. При выходе из функции StartPlugin переменная hClient может быть стёрта, а другой поток будет обращаться к ней. Делай так:
Код
hDialogThread = CreateThread( NULL, 0, threadDialog, (LPVOID)hClient, 0, &hDialogThreadId);

DWORD CALLBACK threadDialog(LPVOID phClient)   // 1. было пропущено слово CALLBACK
{                                              // 2. функция возвращает не int, а DWORD - см. документацию.
    HINSTANCE hClient = (HINSTANCE)phClient;
    //...
}


Цитата(Dmitriy2k @  23.4.2009,  00:11 Найти цитируемый пост)
DialogBox(*hClient, MAKEINTRESOURCE(IDD_MAIN), 0, DLGPROC(DlgProc));

чем функция CreateDialog не устраивает?

И обрабатывай WM_LBUTTONDBLCLK.
WM_LBUTTONDOWN пока заккоментируй.
Цитата
Почему вылетает MessageBox, ведь дочернее окно(окно плагина, код которового приведен выше) даже не появилось?

Может, где-нибудь после case'ов break не поставлен?

Это сообщение отредактировал(а) 586 - 23.4.2009, 00:28
PM   Вверх
Dmitriy2k
Дата 23.4.2009, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шустрый
*


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

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



Цитата(586 @  23.4.2009,  00:17 Найти цитируемый пост)
При выходе из функции StartPlugin переменная hClient может быть стёрта,

Ах, да. Я не совсем правильно показал код. Хотелось, как проще.


это выглядело примерно так:
Код


HINSTANCE hGlobalClient;

extern "C" __declspec(dllexport) StartPlugin(HINSTANCE hClient)
{   
         hGlobalClient=hClient;
         hDialogThread = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)threadDialog, &hGlobalClient, 0, &hDialogThreadId);
}



В общем то я попробовал, как ты показал, так, конечно будет правильней,
но эффект один и тот же - все работает нормально, за исключением двойного клика мыши


Цитата(586 @  23.4.2009,  00:17 Найти цитируемый пост)
чем функция CreateDialog не устраивает?

С СreateDialog - диалоговое окно вообще не появляется(или появляется, но тут же закрывается - для глаза не заметно)
Что то искать и переделывать не хочу, DialogBox меня вполне устраивает.


с WM_LBUTTONDBLCLK - то же самое, почему то это сообщение срабатывает при одинарном клике.
И получается вот что:

Первый раз щелкаю на Дэлфевском окне, далее должно появиться окно плагина.
срабатывает WM_LBUTTONDBLCLK, появляется MessageBox, 

жму мышью "OK" - срабатывает WM_LBUTTONDBLCLK, появляется MessageBox, 
опять жму "OK" - опять появляется то же самое.
 

 



PM MAIL   Вверх
GremlinProg
Дата 23.4.2009, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Dmitriy2k @  23.4.2009,  01:11 Найти цитируемый пост)

case WM_LBUTTONDOWN:                //case WM_NCLBUTTONDBLCLK: и так проборвал.

а зачем пробовал WM_NCLBUTTONDBLCLK?
это же не двойной клик по клиенту
используй WM_LBUTTONDBLCLK


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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

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



Цитата(Dmitriy2k @  23.4.2009,  14:35 Найти цитируемый пост)
С СreateDialog - диалоговое окно вообще не появляется(или появляется, но тут же закрывается - для глаза не заметно)

В опциях диалога посмотри свойство Visible.
Цитата(Dmitriy2k @  23.4.2009,  14:35 Найти цитируемый пост)
Что то искать и переделывать не хочу, DialogBox меня вполне устраивает.

Там достаточно поменять только название функции - это избавит от необходимости создавать поток (вызывать CreateDialog нужно в функции StartPlugin, поток не нужен).
PM   Вверх
Dmitriy2k
Дата 23.4.2009, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шустрый
*


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

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



Цитата(586 @  23.4.2009,  18:57 Найти цитируемый пост)
Там достаточно поменять только название функции - это избавит от необходимости создавать поток (вызывать CreateDialog нужно в функции StartPlugin, поток не нужен). 

Да, я попробывал и так, диалоговое окно появляется и виснет, а в потоке работает нормально.
В общем то меня все устраивает.

Мне не понятно, почему при одинарном щелчке мыши срабатывает WM_LBUTTONDBLCLK - сообщение о двойном щелчке.
PM MAIL   Вверх
GremlinProg
Дата 23.4.2009, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Dmitriy2k @  24.4.2009,  01:13 Найти цитируемый пост)
Мне не понятно, почему при одинарном щелчке мыши срабатывает WM_LBUTTONDBLCLK - сообщение о двойном щелчке.

потому что двойной щелчок его не блокирует и не должен, это правило:
DOWN
DOWN
DOUBLE

Добавлено через 1 минуту и 43 секунды
если ты что-то другое имел ввиду, показывай код


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


Эксперт
****


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

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



поспешил:
Цитата(WM_LBUTTONDBLCLK @ MSDN)

Double-clicking the left mouse button actually generates a sequence of four messages: WM_LBUTTONDOWN, WM_LBUTTONUP, WM_LBUTTONDBLCLK, and WM_LBUTTONUP. 



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
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.0750 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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