Toolbar doesn't react on first click.
Hello everyone. I create program with one toolbar and few CWnd objects
in CFrameWnd. Only one window (CWnd) is shown at time. When I start some
action on this window (OnLButtonUp and OnlButtonDown) program makes few
expensive calculation, next he hides window (SW_HIDE), and shows another
(SW_SHOW). But sometimes when I make double-click on window, everything
show OK, but toolbar freeze (doesn't react on first click and I must
click him once more). I try to override OnLButtonDblClk but my
application never goes in to. I thing the problem are messages that are
pushed to queue when program makes this calculation. I must fix this bug
as fast as possible, so I try to override Run method. Before program
start calculation I set semaphore up, then I start calculation, clear
message queue, and after calculations semaphore goes down. I don't know
it is good solution anyway I probably making something wrong because
i.e. WM_SETFOCUS messages are still received by window even when
semaphore is up. Any help will be great. This is my override Run method:
volatile bool someFocus = false;
// semaphore
volatile bool youCanPump = true;
int CDodaApp::Run()
{
youCanPump = true;
someFocus = false;
if (m_pMainWnd == NULL && AfxOleGetUserCtrl())
{
// Not launched /Embedding or /Automation, but has
no main window!
TRACE0("Warning: m_pMainWnd is NULL in CWinApp::Run
- quitting application.\n");
AfxPostQuitMessage(0);
}
ASSERT_VALID(this);
// for tracking the idle time state
BOOL bIdle = TRUE;
LONG lIdleCount = 0;
// acquire and dispatch messages until a WM_QUIT message
is received.
for (;;)
{
if(youCanPump == true)
{
// phase1: check to see if we can do idle work
while (bIdle && !::PeekMessage(&m_msgCur, NULL,
NULL, NULL, PM_NOREMOVE))
{
// call OnIdle while in bIdle state
if (!OnIdle(lIdleCount++))
bIdle = FALSE; // assume "no idle" state
}
// phase2: pump messages while available
do
{
if(m_msgCur.message == WM_SETFOCUS ||
m_msgCur.message == WM_KILLFOCUS)
someFocus = true;
// pump message, but quit on WM_QUIT
if (!PumpMessage())
return ExitInstance();
// reset "no idle" state after pumping
"normal" message
if (IsIdleMessage(&m_msgCur))
{
bIdle = TRUE;
lIdleCount = 0;
}
} while (::PeekMessage(&m_msgCur, NULL, NULL,
NULL, PM_NOREMOVE));
}
else
{
while(::PeekMessage(&m_msgCur, NULL, NULL, NULL,
PM_REMOVE))
if(m_msgCur.message == WM_SETFOCUS ||
m_msgCur.message == WM_KILLFOCUS)
someFocus = true;
}
}
ASSERT(FALSE); // not reachable
}