Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.10.2011, 00:34   #1
RAZOR1703
Пользователь
 
Регистрация: 15.12.2010
Сообщений: 74
По умолчанию Вывод MessageBox после тройного и более нажатия ЛКМ

Собственно, есть программа, которая создает окно и, при помощи обработки событий, по нажатии ЛКМ создает меню. Также она закрывается при нажатии ПКМ. Нужно приделать такую штуку - вывод сообщения в MessageBox после более, чем троекратного нажатия ЛКМ. Не представляю, как это сделать.
Мой код, на всякий случай.

PHP код:
#define _WIN32_WINNT 0x501
#include <windows.h>
#define MENUITEM_0 101
#define MENUITEM_1 102
#define MENUITEM_2 103
#define MENUITEM_3 104
#define MENUITEM_4 105
#define MENUITEM_5 104
#define MENUITEM_6 105
#define MIIM_FTYPE 106
#define MIIM_STRING 107

LRESULT CALLBACK WndProc (HWNDUINTWPARAMLPARAM);
 
HMENU hMenu;

int WINAPI WinMain (HINSTANCE hInstanceHINSTANCE hPrevInstancePSTR szCmdLineint iCmdShow)
{
 static 
char szAppName[] = "My Window";
 
HWND hwnd;
 
MSG msg;
 
WNDCLASSEX wndclass;

 
wndclass.cbSize sizeof(wndclass);

 
wndclass.style CS_HREDRAW|CS_VREDRAW;
 
wndclass.lpfnWndProc WndProc;
 
wndclass.cbClsExtra 0;
 
wndclass.cbWndExtra 0;
 
wndclass.hInstance hInstance;
 
wndclass.hIcon LoadIcon(NULLIDI_APPLICATION);
 
wndclass.hCursor LoadCursor(NULLIDC_ARROW);
 
wndclass.hbrBackground = (HBRUSHGetStockObject(COLOR_BACKGROUND);
 
wndclass.lpszMenuName NULL;
 
wndclass.lpszClassName szAppName;
 
wndclass.hIconSm LoadIcon(NULLIDI_APPLICATION);
 
RegisterClassEx (&wndclass);

 
hwnd CreateWindow
  
(szAppName,
  
"My Window App",
  
WS_OVERLAPPEDWINDOW,
  
CW_USEDEFAULT,
  
CW_USEDEFAULT,
  
325,
  
200,
  
NULL,
  
hMenu,
  
hInstance,
  
NULL);
 
ShowWindow(hwnd,iCmdShow);
 
UpdateWindow (hwnd);
 while (
GetMessage(&msgNULL00))
 {
  
TranslateMessage(&msg);
  
DispatchMessage(&msg);
 }

 return 
msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwndUINT iMsgWPARAM wParamLPARAM lParam)
{
 
HDC hdc;
 
PAINTSTRUCT ps;
 
RECT rect;
 
LPCSTR MyStr "First Window";
 
HMENU hMenu1;
 
HMENU hMenu2;
 
HMENU hMenu3;
 
HMENU hMenu4;
 
int i=0;

 switch (
iMsg)
 {
 case 
WM_LBUTTONDOWN:
  
hMenu CreateMenu();
  
hMenu1 CreatePopupMenu();
  
hMenu2 CreatePopupMenu();
  
hMenu3 CreatePopupMenu();
  
hMenu4 CreatePopupMenu();
  
InsertMenu(hMenu1MF_BYPOSITION|MFT_STRING|MF_POPUP, (UINT)hMenu1"Menu");
  
InsertMenu(hMenu12MF_BYPOSITION|MFT_STRING|MF_POPUP, (UINT)hMenu2"First");
  
InsertMenu(hMenu23MF_BYPOSITION|MFT_STRINGMENUITEM_1"First-first");
  
InsertMenu(hMenu24MF_BYPOSITION|MFT_STRINGMENUITEM_2"First-second");
  
InsertMenu(hMenu15MF_BYPOSITION|MFT_STRING|MF_POPUP, (UINT)hMenu3"Second");
  
InsertMenu(hMenu36MF_BYPOSITION|MFT_STRINGMENUITEM_3"Second-first");
  
InsertMenu(hMenu37MF_BYPOSITION|MFT_STRINGMENUITEM_4"Second-second");
  
InsertMenu(hMenu18MF_BYPOSITION|MFT_STRING|MF_POPUP, (UINT)hMenu4"Third");
  
InsertMenu(hMenu49MF_BYPOSITION|MFT_STRINGMENUITEM_5"Third-first");
  
InsertMenu(hMenu410MF_BYPOSITION|MFT_STRINGMENUITEM_6"Third-second");
  
DrawMenuBar (hwnd);
  
SetMenu(hwnd,hMenu);
  return 
0;
  break;
       
 case 
WM_PAINT
  
hdc BeginPaint (hwnd, &ps);
  
DrawTextA (hdcMyStr, -1, &rectDT_SINGLELINE|DT_CENTER|DT_VCENTER);
  
EndPaint (hwnd, &ps);
  return 
0;
  break;
  
  
//MessageBox(NULL, "You've pressed MB 3 times!","You're genius!", 0);
 
case WM_CONTEXTMENU:
     
TrackPopupMenu(hMenuTPM_RIGHTBUTTON|TPM_TOPALIGN|TPM_LEFTALIGN,
         
LOWORD(lParam), HIWORD(lParam),0,hwnd,NULL);
     break;

 case 
WM_RBUTTONUP:
  
DestroyMenu(hMenu);
  
DestroyMenu(hMenu1);
  
PostQuitMessage (0);
  break;

 case 
WM_DESTROY:
  
DestroyMenu(hMenu);
  
DestroyMenu(hMenu1);
  
PostQuitMessage (0);

 }
 return 
DefWindowProc (hwndiMsgwParamlParam);

RAZOR1703 вне форума Ответить с цитированием
Старый 17.10.2011, 10:00   #2
haruhi
Форумчанин
 
Аватар для haruhi
 
Регистрация: 05.10.2011
Сообщений: 368
По умолчанию

надо завести две переменные в которые, будет заноситься время последнего и предпоследнего клика. при каждом клике сравнивать текущее время и время предпоследнего клика, если оно меньше времени отведённого под тройной клик, значит произошёл тройной клик

у меня нет под руками компилятора, но делать надо примерно вот так
Код:
 case WM_RBUTTONUP: 
  currenttime = GetTickCount();

  if  (currenttime-prelastclick <1000 )
  {
   //произошёл тройной клик
  }
  prelastclick = lastclick;
  lastclick = currenttime;

  DestroyMenu(hMenu); 
  DestroyMenu(hMenu1); 
  PostQuitMessage (0); 
  break;
пользователь должен успеть кликнуть три раза в течение одной секунды.
lastckick - время последнего клика
prelastckick - время предпоследнего клика
Не стоит будить спящего Бога! (с) Меланхолия Харухи Судзумии
haruhi вне форума Ответить с цитированием
Старый 17.10.2011, 12:32   #3
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

haruhi, вот это загнул...
counter вне форума Ответить с цитированием
Старый 17.10.2011, 16:20   #4
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

По приему сообщения о нажатии левой кнопки ставится сабкласс контрола/окна, запускается таймер на нужное вам время задержки. Проца сабкласса имеет счетчик нажатий левой кнопки, который при двух и более инкрементациях выдает мсгбокс. По истечению таймера сабкласс снимается, счетчик обнуляется.
Хотя, с другой стороны, при таком раскладе первым придет сообщение о двойном нажатии, а значит, ставим в данном обработчике таймер, скажем на 200мс, патчим "на лету" код обработчиков одинарного и двойного нажатия, так, чтобы в них был переход на выдачу мсгбокса, по истечению таймера патч снимается. Ваши извраты?
Нет, ну правда..

Последний раз редактировалось yuran666666; 17.10.2011 в 16:31.
yuran666666 вне форума Ответить с цитированием
Старый 17.10.2011, 18:19   #5
RAZOR1703
Пользователь
 
Регистрация: 15.12.2010
Сообщений: 74
По умолчанию

Дело в том, что мне нужно не по времени, а просто - подряд нажатия клавиши. То есть, если я нажал один раз ЛКМ, затем ПКМ и опять ЛКМ, то счетчик должен обнулиться. Попробовал приделать этот самый счетчик, и подставить под случай сообщения WM_LBUTTONDOWN, только не бейте ногами:
Код:
case WM_LBUTTONDOWN:
  i++;
  if (i>=2)
	MessageBox(NULL, "You've pressed MB 2 times!","You're genius!", 0);
Так вот i у меня не растет.
RAZOR1703 вне форума Ответить с цитированием
Старый 17.10.2011, 18:46   #6
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

haruhi описала самый простой способ. я делал подобное на какой-то лабораторке когда ещё учился
rpy3uH вне форума Ответить с цитированием
Старый 17.10.2011, 18:50   #7
RAZOR1703
Пользователь
 
Регистрация: 15.12.2010
Сообщений: 74
По умолчанию

Опять же, у меня время не должно быть ограничено. Зная своего преподавателя, он 100% к этому придерется.
И потом.
prelastclick и lastclick нужно объявлять в WndProc. С ними будет та же история, что и при использовании моего i. Они будут определяться по новой при повторном клике.

Последний раз редактировалось RAZOR1703; 17.10.2011 в 19:08.
RAZOR1703 вне форума Ответить с цитированием
Старый 17.10.2011, 19:43   #8
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

объявляй их как static
counter вне форума Ответить с цитированием
Старый 17.10.2011, 20:49   #9
RAZOR1703
Пользователь
 
Регистрация: 15.12.2010
Сообщений: 74
По умолчанию

Вот я пень. counter, блин, мужик, ты меня спас просто! Спасибо тебе огромное.
RAZOR1703 вне форума Ответить с цитированием
Старый 18.10.2011, 14:32   #10
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

Преподу должно понравиться
Вложения
Тип файла: rar wndclick2.rar (9.0 Кб, 20 просмотров)
Нет, ну правда..

Последний раз редактировалось yuran666666; 18.10.2011 в 15:33.
yuran666666 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать функцию MessageBox более умной assch Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 06.06.2011 22:50
Вывод переменных в messagebox() delphi/pascal Igor100 Помощь студентам 4 10.05.2011 19:25
Не работает SetFocus после MessageBox Fastex C++ Builder 1 03.02.2011 13:01
выход после нажатия joks Общие вопросы C/C++ 3 16.11.2010 23:56
Перехват нажатия ЛКМ [Delphi/Hooks] anGeee Win Api 1 07.12.2009 00:58