Прошу совета вот в какой ситуации:
создано приложение, в котором зарегистрированы классы и создано frame window, client window и, затем, status bar, принадлежащий frame window. До этого момента все хорошо. Затем создаются mdi child windows и вот они, если их таскать мышью по frame window,
затирают собою status bar. В чем проблема и как ее решить — не понимаю
Может быть кто посоветует?
... *** WinMain ***
// Register the frame window class
wndclass.style = 0 ; //CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = FrameWndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (hInstance, szAppName) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) (COLOR_APPWORKSPACE + 1) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szFrameClass ;
...
// Register the child window class
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = CgWndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = sizeof (HANDLE) ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szCgClass ;
// Create the frame window
hwndFrame = CreateWindow (szFrameClass, szAppName,
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, hMenuInit, hInstance, NULL) ;
...
*** WndProc ***
case WM_CREATE:
hwndClient = CreateWindow (TEXT ("MDICLIENT"), NULL,
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
hwnd, (HMENU) 1, hInst,
(PSTR) &clientcreate) ;
hwndStatus = CreateWindowEx(0L, STATUSCLASSNAME,
"",
WS_CHILD | WS_BORDER | WS_VISIBLE | SBARS_SIZEGRIP,
0, 0, 0, 0,
hwnd,
(HMENU)IDS_STATUSBAR,
hInst,
NULL) ;
...
Миша
Здравствуйте, Misha5, Вы писали:
M>Прошу совета вот в какой ситуации:
M>создано приложение, в котором зарегистрированы классы и создано frame window, client window и, затем, status bar, принадлежащий frame window. До этого момента все хорошо. Затем создаются mdi child windows и вот они, если их таскать мышью по frame window, затирают собою status bar. В чем проблема и как ее решить — не понимаю
M>Может быть кто посоветует?
child windows не выходят за границы client window. Соответственно, нужно разместить client window и status bar в frame window так, что бы они не пересекались. Где-нибудь в обработчике WM_SIZE...
Здравствуйте, SergH, Вы писали:
SH>child windows не выходят за границы client window. Соответственно, нужно разместить client window и status bar в frame window так, что бы они не пересекались. Где-нибудь в обработчике WM_SIZE...
В обработчике WM_SIZE я делал так:
case WM_SIZE: GetClientRect(hwndStatus, &rc) ;
MoveWindow(hwndClient, 0, 0,
LOWORD(lParam), HIWORD(lParam) - abs(rc.top - rc.bottom), TRUE) ;
но это никак не изменяло ситуацию, status bar по-прежнему стирался дочерними окнами.
Здравствуйте, Misha5, Вы писали:
M>
M>M>case WM_SIZE: GetClientRect(hwndStatus, &rc) ;
M> MoveWindow(hwndClient, 0, 0,
M> LOWORD(lParam), HIWORD(lParam) - abs(rc.top - rc.bottom), TRUE) ;
M>
M>но это никак не изменяло ситуацию, status bar по-прежнему стирался дочерними окнами.
попробуй
GetWindowRect(hwndStatus, &rc);
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Misha5, Вы писали:
M>>
M>>M>>case WM_SIZE: GetClientRect(hwndStatus, &rc) ;
M>> MoveWindow(hwndClient, 0, 0,
M>> LOWORD(lParam), HIWORD(lParam) - abs(rc.top - rc.bottom), TRUE) ;
M>>
M>>но это никак не изменяло ситуацию, status bar по-прежнему стирался дочерними окнами.
А>попробуй
А>А>GetWindowRect(hwndStatus, &rc);
А>
Большое спасибо за советы. Они меня натолкнули на правильное решение. Ошибка была в том, что после переадресовки wm-size в status bar и пересчета новых размеров Client window я перенаправлял текущий wm-size в DefWindowProc, что не нужно делать. Сделал нормальный return и все стало работать как следует.
case WM_SIZE:
GetClientRect(hwndStatus, &rcS) ;
GetClientRect(hwnd, &rcC) ;
MoveWindow(hwndClient, 0, 0,
rcC.right, rcC.bottom - abs(rcS.bottom - rcS.top), TRUE) ;
MoveWindow(hwndStatus, 0, rcC.bottom - - abs(rcS.bottom - rcS.top),
rcC.right, rcC.bottom, TRUE) ;
SendMessage (hwndStatus, WM_SIZE, wParam, lParam);
SendMessage(hwndStatus, SB_SETPARTS, 3, (LPARAM)ptWidth);
...
return 0 ;