Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Visual C++/MFC/WTL > Вывод на виртуальный контекст |
Автор: ej0804 16.2.2009, 13:01 |
Подскажите пожалуйста как вывести стандартные элементы (кнопки. и т.д.) на виртуальный контекст. чтобы потом все вместе (с рисунками) плюхнуть на настоящий? Проблема такая - я на диалоговое окно вывожу много растров. чтобы при выводе они не мерцали вывожу их все в виртуальный контекст а затем одним махом на настоящий. Но дело в том что теперь стали мерцать стандартные элементы которые повидимому отрисовываются сразу на настоящий контекст. Как тут поступить? Заранее спасибо. |
Автор: Earnest 16.2.2009, 16:55 |
А зачем растры выводить непосредственно на диалог? Это фоновая картинка? Тогда попробуй малой кровью обойтись: поставь диалогу стиль WS_CLIPCHILDREN. Если растры у тебе занимают весь диалог, то нужно еще избавиться от стирания фона: переопредели обработчик WM_ERASEBACKGND и просто верни там true. Рисовать (в смысле на настоящий контекст выводить) нужно в OnPaint, а в виртуальный - когда угодно. А если растры выводятся в ограниченную область диалога, лучше сделать там свой контрол. А вообще, чтобы вывести окно в заданный контекст, используй сообщение WM_PRINT. Где-то в форуме WinAPI это обсуждалось. |
Автор: ej0804 16.2.2009, 17:22 | ||
Диалог как главное окно программы. Визуализация технологического процесса. В зависимости от вх\вых на промышленном контроллере меняю рисунки в окне. Вывожу виртуальный экран на настоящий в OnPaint и там же закрашиваю фон. Все нормально выводится пока не помещаю на диалог какой-нибудь элемент типа статика или кнопки ,после чего кнопка(или статик) начинают мерцать. Хотелось бы все это как то выводить одновременно, и виртуальный контекст ,в котором уже что-то нарисовал, и кнопку отрисовать. |
Автор: Earnest 16.2.2009, 17:31 |
Если картинки занимают прямоугольную область, которая не перекрывается другими контролами (кнопками), то лучше сделать отдельный контрол (на основе статика). Это проще всего. |
Автор: ej0804 16.2.2009, 18:13 | ||
Извиняюсь за глупый вопрос, контрол (на основе статика) это как. Тоже типа картинки в прямоугольной области и отлавливать нажатие в OnMouseMove? |
Автор: Earnest 16.2.2009, 18:48 | ||
Зачем тебе нажатие отлавливать для вывода картинки? Делаешь свой контрол, на основе статика, пишешь ему метод OnPaint (все тоже самое, что в диалоге, только координаты поправь:
Потом в ресурсе диалоговом ставишь статик типа рамка куда надо и делаешь его нужного размера. Меняешь ему ид-р на какой-нибудь свой IDC_MYPICTURE (он по умолчанию будет IDC_STATIC). Можешь его вдавленным сделать, если хочешь (для красоты). Потом в коде DoDataExchange пишешь DDX_Control (pDX, IDC_MYPICTURE, m_swPicture), где m_swPicture - это член диалога типа CMyPicture. Ну, еще, видимо, тебе понадобиться метод этой пикчи, что-то вроде AddImage - диалог будет ему картинки добавлять по мере надобности. В общем, весь код работы с картинками выносишь в отдельный класс, вот и все. А если надо отлавливать нажатия и маус-мовы, то все то же самое, только делат нужно не на основе CStatic, а на основе CButton (или сразу CWnd). |
Автор: ej0804 17.2.2009, 12:43 |
Проблема может будет в том что я все картинки масштабирую с помощью StretchBlt, чтобы отвязаться от размеров монитора и у меня на всех разрешениях все влазит на один экран, а будет ли так со своим контроллом? |
Автор: Earnest 17.2.2009, 13:36 |
А почему нет? Код остается тем же самым, только ты делаешь в координатах контрола, а не в кординатах диалога, вот и вся разница. |
Автор: ej0804 17.2.2009, 15:55 |
Спасибо вроде получается. А как программно определить размеры загруженного битмапа? И почему когда я вывожу несколько своих контролов(статиков с рис.) выводится только первый? И как быть если картинки занимают прямоугольную область, которая перекрывается другими контролами? |
Автор: ej0804 18.2.2009, 11:44 |
Спасибо разобрался. С размерами битмапа что-то я действительно затупил. |