Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Системное программирование и WinAPI > Создание Status Bar |
Автор: MenSem 9.8.2008, 11:03 |
del |
Автор: mekhanikus 9.8.2008, 13:15 | ||
|
Автор: MenSem 9.8.2008, 14:16 |
del |
Автор: 586 9.8.2008, 14:59 | ||||
Читай MSDN внимательнее:
|
Автор: MenSem 9.8.2008, 15:12 |
del |
Автор: MenSem 10.8.2008, 15:40 |
del |
Автор: 586 10.8.2008, 17:15 |
Телепаты в отпуске. Выкладывай код, как создаёшь statusbar, и что за ошибка. |
Автор: MenSem 10.8.2008, 18:37 |
del |
Автор: MenSem 10.8.2008, 18:58 |
del |
Автор: MenSem 10.8.2008, 21:08 |
del |
Автор: Dem_max 11.8.2008, 04:32 | ||
Попробуй так
|
Автор: MenSem 11.8.2008, 10:19 |
del |
Автор: MenSem 11.8.2008, 13:00 |
del |
Автор: Ant 12.8.2008, 08:38 |
Можно |
Автор: MenSem 12.8.2008, 09:04 |
del |
Автор: MenSem 12.8.2008, 10:42 |
del |
Автор: 586 12.8.2008, 11:10 |
http://msdn.microsoft.com/en-us/library/ms646352(VS.85).aspx Как работает это сообщение можешь в Spy++ посмотреть. Дескриптор верный? Проверял в отладчике значение переменной hWndSbar? Какая ОС? |
Автор: MenSem 12.8.2008, 11:26 |
del |
Автор: 586 12.8.2008, 12:16 | ||
В MSDN сказано, что такое сообщение можно посылать статусбару.
У меня всё работает. Имхо, у тебя где-то проблема. |
Автор: MenSem 12.8.2008, 12:28 |
del |
Автор: MenSem 12.8.2008, 12:45 |
del |
Автор: 586 12.8.2008, 13:07 |
И в чём же была ошибка? |
Автор: MenSem 12.8.2008, 15:30 |
del |
Автор: MenSem 13.8.2008, 14:35 |
del |
Автор: MenSem 14.8.2008, 15:08 |
del |
Автор: mekhanikus 15.8.2008, 11:37 | ||
Попробовал, действительно косяк, у меня тоже чилдрены закрывают статус бар или прячутся за него. Как это побороть пока не знаю. Может отлавливать момент сворачивания-разворачивания чилдов и направлять их в нужное русло? |
Автор: GremlinProg 15.8.2008, 13:01 | ||
попробуй создать статус не на клиенте, а на фрейме, но при этом, на WM_SIZE фрейма необходимо позиционировать клиент вручную Добавлено через 1 минуту и 32 секунды лучше вообще все контролы вручную позичионировать |
Автор: Dem_max 15.8.2008, 13:51 | ||
Для ограничения размеров окна MDI попробуй вот это, хотя я ниразу для MDI не пользовался
типа так: LPMINMAXINFO mmi; mmi->ptMinTrackSize.x=380; mmi->ptMinTrackSize.y=400; |
Автор: MenSem 15.8.2008, 14:51 |
del |
Автор: GremlinProg 15.8.2008, 14:59 | ||
Dem_max, речь не о ограничении внешних размеров фрейма, читай вопрос внимательно:
MDICLIENT - дочернее, а не перекрытое окно MenSem, поскольку статус - контрол простой до безобразия, в него практически никогда не суют контролы, есть еще более корректный и облегченный способ создания статус бара - это резервирование неклиентской области под статус в WM_NCCALCSIZE и рисование в нем чего-либо в WM_NCPAINT, тогда дополнительно ничего позиционировать не придется, т.к. статус уже не будет отображаться в клиентской области (не будет так же и лишней нагрузки - окна статус бара (по моему, этот контрол вообще создан только для очень ленивых программистов) на форуме и в MSDN достаточно подробной информации на эту тему, нужно только поискать |
Автор: MenSem 15.8.2008, 18:46 |
del |
Автор: GremlinProg 15.8.2008, 19:39 | ||||
см. пред-предыдущий пост, я уже писал как с этим бороться процедура фрейма:
здесь статус рисует всего лишь одна функция ::DrawEdge(...), если хочешь разнообразия, смени её на то, что нужно точно так же можно сделать и тулбар, но там сложнее, это не уложится ни в какой топик форума, принципы создания контролов в неклиентской области я уже не раз расписывал PS: код не проверял, но пока вроде ошибок не вижу, пиши, если что |
Автор: MenSem 15.8.2008, 19:46 |
del |
Автор: GremlinProg 15.8.2008, 19:58 |
status_bar_height - высота статус бара, status_rect - прямоугольник статус бара в неклиентской области задать изначально нужно только status_bar_height, остальное вычислится самостоятельно |
Автор: MenSem 15.8.2008, 20:26 |
del |
Автор: GremlinProg 15.8.2008, 20:33 |
в WM_NCPAINT ::DefWindowProc(...) вызови вернее DefFrameProc Добавлено через 1 минуту и 56 секунд стандартная обработка в любом случае должна быть, я ж ни где не писал return Добавлено через 3 минуты хотя в WM_NCCALCSIZE можно заменить break return'ом, т.к. используется префиксная форма |
Автор: MenSem 15.8.2008, 21:02 |
del |
Автор: GremlinProg 15.8.2008, 21:36 | ||
) посмотри внимательно на код, смотри, чтобы вызовы DefFrameProc не дублировались по скрину хорошо видно, что DefFrameProc вызван 2 раза, что привело к двойному вычету границ
"можно" заменить на "нужно" |
Автор: MenSem 16.8.2008, 08:16 |
del |
Автор: GremlinProg 16.8.2008, 12:25 |
это скорее всего связано с чем-то другим, показывай процедуру окна |
Автор: MenSem 16.8.2008, 13:12 |
del |
Автор: GremlinProg 16.8.2008, 13:48 |
на сообщение WM_NCCALCSIZE lParam всегда указывает как минимум на RECT, следовательно ошибка происходит на другое сообщение, убедись в том, что перед case WM_NCCALCSIZE стоит break здесь речь идет о создании статусбара, а не о том, где у тебя там синтаксические ошибки мы ведь здесь не можем исправлять их телепатически раз ты не хочешь показывать код, значит исправляй все сам Добавлено через 4 минуты и 23 секунды статус бар и не будет рисоваться, пока все ошибки не будут исправлены |
Автор: MenSem 16.8.2008, 14:14 |
del |
Автор: GremlinProg 16.8.2008, 19:19 |
думай, решай, я уже говорил, есть простой способ решить проблему: выложить код |
Автор: MenSem 16.8.2008, 19:26 |
del |
Автор: GremlinProg 16.8.2008, 21:10 |
мда уж, подходящего смайла винград просто не знает хороший код, красивый код, только зачем он тут? никакого отношения к процедуре окна фрейма он не имеет к тому же, отдельное окно статус бара уже давным давно не нужно, оно у тебя реализовано в неклиентской области двумя перехватами сообщений |
Автор: MenSem 16.8.2008, 21:28 |
del |
Автор: GremlinProg 16.8.2008, 21:31 |
если хочешь найти ошибку - вся Добавлено через 2 минуты и 23 секунды ну пошли её приватным сообщением, если уж так страшно |
Автор: MenSem 16.8.2008, 21:35 |
del |
Автор: GremlinProg 16.8.2008, 21:40 |
RECT status_rect; вынеси это определение глобально, вне процедуры окна, а локальные дубли убери Добавлено через 26 секунд это основная ошибка |
Автор: MenSem 16.8.2008, 21:41 |
del |
Автор: GremlinProg 16.8.2008, 21:44 | ||||
советую привести процедуру к виду:
сейчас она у тебя такого вида:
Добавлено @ 21:45 ну извини, не телепат это объявление ты сам сделал, я его не писал |
Автор: MenSem 16.8.2008, 21:47 |
del |
Автор: GremlinProg 16.8.2008, 21:50 | ||||
ну вот, это твой статус бар, сейчас он выглядит как кнопка, можешь стандартный сделать:
Добавлено @ 21:55 теперь можешь любой текст вывести, такм же, в сообщении WM_NCPAINT, после DrawEdge
|
Автор: MenSem 16.8.2008, 21:56 |
del |
Автор: GremlinProg 16.8.2008, 22:01 | ||
если нужен SIZE GRIP, то добавь такой код:
Добавлено через 50 секунд текст? смотри на пост выше Добавлено через 3 минуты и 28 секунд рисуешь, как хочешь, это уже независимая область, с клиентом он не соприкасается ресурсов для статусбара нет |
Автор: MenSem 16.8.2008, 22:09 |
del |
Автор: GremlinProg 16.8.2008, 22:14 |
поставь ::SetBkMode(hdc,TRANSPARENT); перед DrawText |
Автор: MenSem 16.8.2008, 22:27 |
del |
Автор: GremlinProg 16.8.2008, 22:37 |
ну, остальное уже сам, статус баром эта тема и должна закончиться |
Автор: MenSem 16.8.2008, 22:38 |
del |
Автор: Dem_max 19.8.2008, 18:51 | ||
Чет у вас сложно все со статус баром вот код
Результат ниже на картинке http://ipicture.ru/ |
Автор: MenSem 23.8.2008, 14:16 |
del |
Автор: MenSem 30.8.2008, 18:20 |
del |
Автор: 586 30.8.2008, 18:52 |
ShowWindow SW_SHOW / SW_HIDE |
Автор: Dem_max 30.8.2008, 19:04 |
ShowWindow(hWndStatusBar ,SW_HIDE); ShowWindow(hWndStatusBar ,SW_SHOW); |
Автор: GremlinProg 30.8.2008, 19:11 | ||||||||
нужно просто глобальный флаг завести, например
в WM_NCCALCSIZE этот флаг проверять: если флаг поднят(status_visible == TRUE), то в WM_NCCALCSIZE ncrc модифицировать как положено, если флаг опущен(status_visible == FALSE), то ncrc не должен быть затронут, т.е. SubtractRect вызывать не нужно (в принципе и status_rect расчитывать так же не надо) при рисовании в WM_NCPAINT смотрим так же на этот флаг: если флаг поднят, то рисуем статус бар в status_rect если флаг опущен, то ни чего не рисуем теперь, чтобы скрыть статус, нужно сделать 2 телодвижения:
Добавлено @ 19:11 показать - аналогично:
Добавлено @ 19:12 понятно, что изначально status_visible дожен быть поднят:
|
Автор: MenSem 6.9.2008, 07:08 |
del |