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

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
Soliton
In need of some credit
In need of some credit
Posts: 2
Joined: Mon Sep 15, 2008 2:39 pm

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

Post by Soliton »

Коллеги, подскажите, пожалуйста, как можно решить следующую проблему.

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

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

В дочернем этом окошке тоже имеется кнопка (назовём её Дочерняя кнопка), и расположена она аккурат на том же самом месте, что и кнопка в родительском окне (в смысле размер и координаты на экране такие же). И всё хорошо работает, если нажимать на Родительскую кнопку один раз. Но проблема в том, что создание дочернего окошка требует определённого времени, и нетерпеливые пользователи начинают тыркать мышкой Родительскую кнопку ещё и ещё раз. И в итоге после открытия дочернего окошка сразу же нажимается Дочерняя кнопка, что совершенно не нужно. Порекомендуйте, в каком направлении копать?
Last edited by Soliton on Fri Sep 19, 2008 10:40 am, edited 1 time in total.
Soliton
In need of some credit
In need of some credit
Posts: 2
Joined: Mon Sep 15, 2008 2:39 pm

Post 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();
}
OS: Windows XP
Compiler: MSVC++
wxWidgets: 2.8.7
Post Reply