Status bar в MDI-приложении стирается дочерними окнами
От: Misha5  
Дата: 24.02.03 17:00
Оценка:
Прошу совета вот в какой ситуации:
создано приложение, в котором зарегистрированы классы и создано 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) ;
...


Миша
Re: Status bar в MDI-приложении стирается дочерними окнами
От: SergH Россия  
Дата: 24.02.03 17:39
Оценка:
Здравствуйте, 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...
Делай что должно, и будь что будет
Re[2]: Status bar в MDI-приложении стирается дочерними окнам
От: Misha5  
Дата: 24.02.03 19:15
Оценка:
Здравствуйте, 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 по-прежнему стирался дочерними окнами.
Re[3]: Status bar в MDI-приложении стирается дочерними окнам
От: Аноним  
Дата: 25.02.03 08:32
Оценка:
Здравствуйте, 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);
Re[4]: Status bar в MDI-приложении стирается дочерними окнам
От: Misha5  
Дата: 25.02.03 13:15
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, 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 ;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.