В MFC новичек, сталкнулся с проблемой — не могу найти способ узнать высоту StatusBar, метод GetWindowRect возвращает непонятно что.
Создаю программу в которой таблица (CListCtrl) должна быть развернута на все окно, поэтому по событию главного окна ON_WM_PAINT задаю новые размеры таблице отталкиваясь от размеров самого окна, но таблица перекрывает StatusBar, нужно знать высоту StatusBar что бы скоректировать высоту таблицы.
Здравствуйте, Дмитрий Кентерберийский, Вы писали:
ДК>Приветствую.
ДК>В MFC новичек, сталкнулся с проблемой — не могу найти способ узнать высоту StatusBar, метод GetWindowRect возвращает непонятно что.
ДК>Создаю программу в которой таблица (CListCtrl) должна быть развернута на все окно, поэтому по событию главного окна ON_WM_PAINT задаю новые размеры таблице отталкиваясь от размеров самого окна, но таблица перекрывает StatusBar, нужно знать высоту StatusBar что бы скоректировать высоту таблицы.
Я так понял вы испоользуете CStatusBar, попробуйте вызвать GetItemRect может вам поможет.
Здравствуйте, Дмитрий Кентерберийский, Вы писали:
ДК>Создаю программу в которой таблица (CListCtrl) должна быть развернута на все окно, поэтому по событию главного окна ON_WM_PAINT задаю новые размеры таблице отталкиваясь от размеров самого окна, но таблица перекрывает StatusBar, нужно знать высоту StatusBar что бы скоректировать высоту таблицы.
Не самая удачная идея двигать контролы в ответ на WM_PAINT — лучше это делать сначала в OnInitialUpdate а затем в OnSize. Что за тип приложения? Как определяется размер окна?
Здравствуйте, Дмитрий Кентерберийский, Вы писали:
ДК>Приветствую.
ДК>В MFC новичек, сталкнулся с проблемой — не могу найти способ узнать высоту StatusBar, метод GetWindowRect возвращает непонятно что.
ДК>Создаю программу в которой таблица (CListCtrl) должна быть развернута на все окно, поэтому по событию главного окна ON_WM_PAINT задаю новые размеры таблице отталкиваясь от размеров самого окна, но таблица перекрывает StatusBar, нужно знать высоту StatusBar что бы скоректировать высоту таблицы.
надо отталкиваться от размеров клиентской части окна и не париться с высчитыванием позиции и размером таблицы
GetClientRect() возвращает эти самые размеры — вызывай ее для окна и просто юзай полученные данные как позицию/размер таблицы
Здравствуйте, GPF, Вы писали:
GPF>Я так понял вы испоользуете CStatusBar, попробуйте вызвать GetItemRect может вам поможет.
Насколько я понимаю GetItemRect возвращает рамку одного из индикаторов StatusBar'a и при том эти координаты относительны от верхней левой координаты самого StatusBar'a.
Здравствуйте, Bell, Вы писали:
B>Не самая удачная идея двигать контролы в ответ на WM_PAINT — лучше это делать сначала в OnInitialUpdate а затем в OnSize. Что за тип приложения? Как определяется размер окна?
Точно! Как говорится зачем жрать капусту если есть картошка )
Окно приложения самое простое — таблица во весь экран + StatusBar. Размеры главного окна определяю методом GetWindowRect().
Здравствуйте, kankan, Вы писали:
K>надо отталкиваться от размеров клиентской части окна и не париться с высчитыванием позиции и размером таблицы K>GetClientRect() возвращает эти самые размеры — вызывай ее для окна и просто юзай полученные данные как позицию/размер таблицы
Насколько я понял метод GetClientRect() возвращает рамку клиентской области, но StatusBar при создании размещается в ней же. Проверил в отладчике вызов GetClientRect() до создания StatusBar'a и после возвращает один и тот-же результат.
...
Rect rcMain, rcStBar, rcLsCtrl;
GetClientRect(&rcMain);
m_wndStatusBar.GetItemRect(0,&rcStBar); // оказывается высота элемента = высоте клиенской части элемента + ширина рамки самого Бара * 2
rcLsCtrl.left = rcMain.left;
rcLsCtrl.top = rcMain.top;
rcLsCtrl.right = rcMain.right;
rcLsCtrl.bottom = rcMain.bottom-rcStBar.bottom;
m_wndListCtrl.Create(...,rcLsCtrl,...);
...