Page 1 of 1

Сбросить mouse events при открытии нов

Posted: Thu Sep 18, 2008 1:56 pm
by Soliton
Коллеги, подскажите, пожалуйста, как можно решить следующую проблему.

Есть окошко - frame, на нём кнопка (назовём её Родительская кнопка). При нажатии на Родительскую кнопку создаётся и открывается в модальном режиме окошко - диалог. Примерно таким образом:

StartFrame* startFrame = new StartFrame(0);
startFrame->ShowModal();
startFrame->Destroy();

В дочернем этом окошке тоже имеется кнопка (назовём её Дочерняя кнопка), и расположена она аккурат на том же самом месте, что и кнопка в родительском окне (в смысле размер и координаты на экране такие же). И всё хорошо работает, если нажимать на Родительскую кнопку один раз. Но проблема в том, что создание дочернего окошка требует определённого времени, и нетерпеливые пользователи начинают тыркать мышкой Родительскую кнопку ещё и ещё раз. И в итоге после открытия дочернего окошка сразу же нажимается Дочерняя кнопка, что совершенно не нужно. Порекомендуйте, в каком направлении копать?

Posted: Fri Sep 19, 2008 9:00 am
by Soliton
Проблема решена. Если кому интересно - следующим образом:

1. Создан mouse hook, перехватывающий и блокирующий все мышинные события

Code: Select all

LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
{	
	if((nCode == HC_ACTION)) 	return -1;	 
	else return CallNextHookEx(hMouseHook, nCode, wParam, lParam);		
}
2. Созданы глобальные функции блокировки и разблокирования мыши:
//disable mouse
void disableMouse()
{
hMouseHook = SetWindowsHookEx(WH_MOUSE, &MouseProc, NULL, GetCurrentThreadId());
}

//enable mouse
void enableMouse()
{
UnhookWindowsHookEx(hMouseHook);
}
3. В родительском окне в обработчике нажатия на кнопку мыша блокируется:
disableMouse();
StartFrame* startFrame = new StartFrame(0);
startFrame->ShowModal();
startFrame->Destroy();
4. В дочернем окне создаётся обработчик события OnPaint

Code: Select all

void StartFrame::OnPaint(wxPaintEvent &event)
{
	enableMouse();
	event.Skip();
}