| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Visual C++/MFC/WTL > Управление окном при создании |
| Автор: GGoga 1.7.2007, 17:40 | ||
| Здравствуйте, уважаемые господа программисты. Помогите разобраться с проблемой начинающему программисту. А проблема заключается в следующем: С помощью мастера MFC создаю SDI приложение, представление которого наследую от CFormView. Я хочу, чтобы запускаемое окно имело свойства, которые требуются мне, а именно: положение окна центрировалось относительно экрана, имело высоту и ширину пропорциональную экрану, а также загружало иконку, которую создал я. Чтобы это реализовать, я прописываю следующий код в обработчике InitInstance() класса приложения:
Однако, при запуске программы сначала запускается стандартное окошко (созданное приложением), которое имеет собственные размеры, положение на экране и иконку, потом оно исчезает и запускается мое окно с прописанными свойствами (появление и исчезновение первого окна длится около 1 сек. - мелочь, но не приятно...). Я хочу этого в своем мелком проекте избежать, пусть он хоть и небольшой и пишется для получения навыков в программировании, но будет, по крайней мере, красивым Так вот у меня вопрос, что мне нужно сделать, чтобы добиться требуемого результата? Может мой код прописать в другом обработчике, или что-то добавить для скрытия из виду стандартного окна, или убрать что-то в автоматически сгенерированном коде? Подскажите, кто знает решение проблемы, заранее ОГРОМНОЕ СПАСИБО!!! |
| Автор: Прохожий 2.7.2007, 10:02 | ||
В CMainFrame есть такая функция где и задаётся нужный стиль и положение окна
|
| Автор: GGoga 2.7.2007, 11:18 | ||||
А как тогда загрузить иконку, чтобы не появлялась иконка по умолчанию? Это можно сделать в PreCreateWindow? И еще такой вопрос: можно ли установить позицию окна в центре относительно экрана не производя расчетов? Просто переменная CREATESTRUCT& cs имеет для этого 2 свойства: x и y, и чтобы разместить собственное окно центрировано, необходимо произвести соответствующие расчеты координат левого верхнего угла прямоугольника... Можно ли это сделать не производя расчетов, в том смысле, есть ли уже какая-нибудь стандартная функция для этого? Заранее спасибо! |
| Автор: Прохожий 2.7.2007, 12:17 | ||||
Проще всего заменить имеющуюся своей или использовать SetIcon(AfxGetApp()->LoadIcon(IDI_ICON1), FALSE); Тамже в функции int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
Есть что-то с ходу не могу сказать. Может как-то можно использовать вот это CenterWindow(CWnd*); навскидку? |
| Автор: GGoga 2.7.2007, 17:17 | ||||||||
У меня еще вот такой вопрос: почему я из обработчика BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) не могу получить указатель на главное окно? И вообще, можно ли это сделать? А делаю я это следующим образом:
Вот так я пытаюсь (выделено жирным) управлять главным окном из вышеуказанного обработчика, только не могу получить на него (на главное окно) указатель... Подскажите, можно ли так делать, а если можно, то почему в результате возвращается 0-вой результат? Заранее СПАСИБО!!! Добавлено через 5 минут и 38 секунд Иконку сделал как Вы и говорили - изменил ту, что по умолчанию, но все равно, хотелось бы знать, как это можно сделать программно. |
| Автор: GGoga 2.7.2007, 18:48 |
| Проблему с предыдущим вопросом решил, оказывается, что главное окно еще не существует в момент вызова обработчика BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) класса CMainFrame (формы). И как всегда, решение одного вопроса порождает новый... :( А можно ли (если можно, то в каком обработчике) вообще в этом классе (классе формы) в момент, когда окно еще не является видимым для пользователя произвести его настройки (центрировать, установить размеры, загрузить иконку и т.д.)? Просто я еще не совсем разбираюсь с принципами того, как и что за чем вызывается, поэтому, пожалуйста, не удивляйтесь моим столь тупым вопросам... Просто мне кажется слишком примитивным, например, центрировать окно с помощью вычисления соответсвующих координат левого верхнего угла, если для этого уже есть готовая функция (зачем изобретать велосипед?..), поэтому я и интересуюсь тем, как и где это можно сделать (получить указатель на главное окно) в классе формы? Заранее СПАСИБО! |
| Автор: Прохожий 3.7.2007, 06:53 | ||
Ну я тама указал и програмный способ вот в ф-и int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) SetIcon(AfxGetApp()->LoadIcon(IDI_ICON1), FALSE); А насчёт центрирования окна относительно экрана и вааще определения размеров относительно рабочего стола, просто никогда не занимался. Но может через GetDesktopWindow() Можно получить что. ? И ещё вот здесь http://www.firststeps.ru/ почитай тама МНОГО ОТВЕТОВ на МНОГО ВОПРОСОВ |
| Автор: GGoga 3.7.2007, 21:37 | ||||||||
Пробовал так, ничего не получилось :( Так что пришлось менять саму иконку, чтобы не было мелькания. Добавлено через 4 минуты и 51 секунду
Да именно так я и делал, хотя можно еще так:
А вообще все реализовал следующим образом:
|
| Автор: Прохожий 4.7.2007, 12:33 | ||
Ну незнаю чем не работает смена иконки вот как здесь
Работает за всю мазуту |
| Автор: GGoga 4.7.2007, 19:07 |
| Да, действительно, так иконка устанавливается без проблем. Спасибо за полезный совет! |
| Автор: Gerk 9.7.2007, 20:28 | ||
Ну как еще один способ центрирования окна
|
| Автор: Earnest 10.7.2007, 09:39 |
| Попробуй еще переопределить функцию CFrameWnd::ActivateFrame: вроде бы она приходит до появления кона на экране, и там можно его отцентровать и т.д. |
| Автор: GGoga 11.7.2007, 12:23 | ||
Спасибо! Знать лишний способ никогда не помешает |
| Автор: GGoga 11.7.2007, 12:40 | ||
Спасибо |