![]() |
|
![]() ![]() ![]() |
|
ej0804 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 30.3.2007 Репутация: нет Всего: нет |
Подскажите пожалуйста как вывести стандартные элементы (кнопки. и т.д.) на виртуальный контекст. чтобы потом все вместе (с рисунками) плюхнуть на настоящий? Проблема такая - я на диалоговое окно вывожу много растров. чтобы при выводе они не мерцали вывожу их все в виртуальный контекст а затем одним махом на настоящий. Но дело в том что теперь стали мерцать стандартные элементы которые повидимому отрисовываются сразу на настоящий контекст. Как тут поступить? Заранее спасибо.
Это сообщение отредактировал(а) ej0804 - 16.2.2009, 16:13 |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
А зачем растры выводить непосредственно на диалог? Это фоновая картинка? Тогда попробуй малой кровью обойтись: поставь диалогу стиль WS_CLIPCHILDREN.
Если растры у тебе занимают весь диалог, то нужно еще избавиться от стирания фона: переопредели обработчик WM_ERASEBACKGND и просто верни там true. Рисовать (в смысле на настоящий контекст выводить) нужно в OnPaint, а в виртуальный - когда угодно. А если растры выводятся в ограниченную область диалога, лучше сделать там свой контрол. А вообще, чтобы вывести окно в заданный контекст, используй сообщение WM_PRINT. Где-то в форуме WinAPI это обсуждалось. -------------------- ... |
|||
|
||||
ej0804 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 30.3.2007 Репутация: нет Всего: нет |
Диалог как главное окно программы. Визуализация технологического процесса. В зависимости от вх\вых на промышленном контроллере меняю рисунки в окне. Вывожу виртуальный экран на настоящий в OnPaint и там же закрашиваю фон. Все нормально выводится пока не помещаю на диалог какой-нибудь элемент типа статика или кнопки ,после чего кнопка(или статик) начинают мерцать. Хотелось бы все это как то выводить одновременно, и виртуальный контекст ,в котором уже что-то нарисовал, и кнопку отрисовать. |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Если картинки занимают прямоугольную область, которая не перекрывается другими контролами (кнопками), то лучше сделать отдельный контрол (на основе статика). Это проще всего.
-------------------- ... |
|||
|
||||
ej0804 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 30.3.2007 Репутация: нет Всего: нет |
Извиняюсь за глупый вопрос, контрол (на основе статика) это как. Тоже типа картинки в прямоугольной области и отлавливать нажатие в OnMouseMove? |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Зачем тебе нажатие отлавливать для вывода картинки?
Делаешь свой контрол, на основе статика, пишешь ему метод OnPaint (все тоже самое, что в диалоге, только координаты поправь:
Потом в ресурсе диалоговом ставишь статик типа рамка куда надо и делаешь его нужного размера. Меняешь ему ид-р на какой-нибудь свой IDC_MYPICTURE (он по умолчанию будет IDC_STATIC). Можешь его вдавленным сделать, если хочешь (для красоты). Потом в коде DoDataExchange пишешь DDX_Control (pDX, IDC_MYPICTURE, m_swPicture), где m_swPicture - это член диалога типа CMyPicture. Ну, еще, видимо, тебе понадобиться метод этой пикчи, что-то вроде AddImage - диалог будет ему картинки добавлять по мере надобности. В общем, весь код работы с картинками выносишь в отдельный класс, вот и все. А если надо отлавливать нажатия и маус-мовы, то все то же самое, только делат нужно не на основе CStatic, а на основе CButton (или сразу CWnd). -------------------- ... |
|||
|
||||
ej0804 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 30.3.2007 Репутация: нет Всего: нет |
Проблема может будет в том что я все картинки масштабирую с помощью StretchBlt, чтобы отвязаться от размеров монитора и у меня на всех разрешениях все влазит на один экран, а будет ли так со своим контроллом?
|
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
А почему нет? Код остается тем же самым, только ты делаешь в координатах контрола, а не в кординатах диалога, вот и вся разница.
-------------------- ... |
|||
|
||||
ej0804 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 30.3.2007 Репутация: нет Всего: нет |
Спасибо вроде получается. А как программно определить размеры загруженного битмапа? И почему когда я вывожу несколько своих контролов(статиков с рис.) выводится только первый? И как быть если картинки занимают прямоугольную область, которая перекрывается другими контролами?
Это сообщение отредактировал(а) ej0804 - 17.2.2009, 20:34 |
|||
|
||||
Earnest |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
А MSDN почитать? Если битмап - это CBitmap или HBITMAP, то можно спросить его параметры функцией GetBitmap.
это у тебя спросить надо, как ты их выводишь.
Нужно Z-order правильно выставить, чтобы эти контролы были сверху. И попробуй поставить контролу с картинкой стиль CLIPSIBLINGS. -------------------- ... |
||||
|
|||||
ej0804 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 30.3.2007 Репутация: нет Всего: нет |
Спасибо разобрался.
С размерами битмапа что-то я действительно затупил. Это сообщение отредактировал(а) ej0804 - 18.2.2009, 15:35 |
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |