Re: Floating window beside the main app window
Sorry, but I have to raise a new question now.
Well, my floating window does what I need, but there are now some
different problems...
The shown below func gets invoked on the main thread in the
OnInitDialog().
static void CreateScreenWindow(HINSTANCE hInst) {
const char* className = "ScreenWindow";
WNDCLASS wc;
memset(&wc, 0, sizeof(WNDCLASS));
wc.style = CS_OWNDC;
wc.lpfnWndProc = (WNDPROC)WndProc;
wc.hInstance = hInst;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.lpszClassName = className;
if (RegisterClass(&wc) == 0) {
char buf[128];
sprintf(buf, "Failed to register class (%d)",
GetLastError());
MessageBox(NULL, buf, NULL, MB_OK);
return;
}
RECT clientSize;
clientSize.top = 0;
clientSize.left = 0;
clientSize.right = 400;
clientSize.bottom = 250;
DWORD style = WS_BORDER | WS_CAPTION;
AdjustWindowRect(&clientSize, style, FALSE);
int winWidth = clientSize.right - clientSize.left;
int winHeight = clientSize.bottom - clientSize.top;
int winLeft = (GetSystemMetrics(SM_CXSCREEN) - winWidth) / 2;
int winTop = (GetSystemMetrics(SM_CYSCREEN) - winHeight) / 2;
hScreen = CreateWindow(className, "toolscreen", style,
winLeft,
winTop, winWidth, winHeight, 0, 0, hInst, 0);
if (hScreen == 0) {
char buf[128];
sprintf(buf, "Failed to create window (%d)",
GetLastError());
MessageBox(NULL, buf, NULL, MB_OK);
return;
}
UpdateWindow(hScreen);
MoveWindow(hScreen, winLeft, winTop, winWidth, winHeight,
TRUE);
}
The created window does not get shown until a worker thread tells it
to do so somewhen by means of ShowWindow(TRUE). Well, then it
obediently appears on the screen - but the system gets overloaded at
the same moment and stays so till the window disappears through
invoking ShowWindow(FALSE) by the worker thread.
I checked the reason and found that the floating window receives en
masse messages WM_PAINT - several hundreds a second. Gradually
modifying the window proc I made it to contain only the following
code :
case WM_PAINT :
return 0;
The system stays hopeless overloaded. If altering this code this way:
case WM_PAINT :
return DefWindowProc(hWnd, msg, wParam, lParam);
the overloading does not take place any more... but the window does
not perform its work any more, too.
My questions now are :
(a) What is the crucial difference between 'return 0' and 'return
DefWindowProc()' in this case that can lead to this drastical
difference in the behaviour?
(b) What - at least theoretically - can cause the flood of WM_PAINT's?
Thanks in advance for everybody who could give me an enlightening
idea.
Victor