Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
Цитата(Earnest @ 16.2.2009,  16:55)
А зачем растры выводить непосредственно на диалог? Это фоновая картинка? Тогда попробуй малой кровью обойтись: поставь диалогу стиль WS_CLIPCHILDREN. 
Если растры у тебе занимают весь диалог, то нужно еще избавиться от стирания фона: переопредели обработчик WM_ERASEBACKGND и просто верни там true.
Рисовать (в смысле на настоящий контекст выводить) нужно в OnPaint, а в виртуальный - когда угодно.
А если растры выводятся в ограниченную область диалога, лучше сделать там свой контрол.

А вообще, чтобы вывести окно в заданный контекст, используй сообщение WM_PRINT. Где-то в форуме WinAPI это обсуждалось.

     Диалог как главное окно программы. Визуализация  технологического процесса. В зависимости от вх\вых на промышленном контроллере меняю рисунки в окне. Вывожу виртуальный экран на настоящий в OnPaint и там же закрашиваю фон. Все нормально выводится пока не помещаю на диалог какой-нибудь элемент типа статика или кнопки ,после чего кнопка(или статик) начинают мерцать. Хотелось бы все это как то выводить одновременно, и виртуальный контекст ,в котором уже что-то нарисовал, и кнопку отрисовать.   

Автор: Earnest 16.2.2009, 17:31
Если картинки занимают прямоугольную область, которая не перекрывается другими контролами (кнопками), то лучше сделать отдельный контрол (на основе статика). Это проще всего.

Автор: ej0804 16.2.2009, 18:13
Цитата(Earnest @ 16.2.2009,  17:31)
Если картинки занимают прямоугольную область, которая не перекрывается другими контролами (кнопками), то лучше сделать отдельный контрол (на основе статика). Это проще всего.

Извиняюсь за глупый вопрос, контрол (на основе статика) это как. Тоже типа картинки в прямоугольной области и отлавливать нажатие в OnMouseMove?

Автор: Earnest 16.2.2009, 18:48
Зачем тебе нажатие отлавливать для вывода картинки?
Делаешь свой контрол, на основе статика, пишешь ему метод OnPaint (все тоже самое, что в диалоге, только координаты поправь: 
Код

class CMyPicture: public CStatic
{
   DECLARE_MESSAGE_MAP();
   afx_msg void 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
Спасибо вроде получается. А как программно определить размеры загруженного битмапа? И почему когда я вывожу несколько своих контролов(статиков с рис.) выводится только первый? И как быть если картинки занимают прямоугольную область, которая перекрывается другими контролами?

Автор: Earnest 18.2.2009, 10:47
А MSDN почитать? Если битмап - это CBitmap или HBITMAP, то можно спросить его параметры функцией GetBitmap.
Цитата(ej0804 @  17.2.2009,  16:55 Найти цитируемый пост)
И почему когда я вывожу несколько своих контролов(статиков с рис.) выводится только первый?

это у тебя спросить надо, как ты их выводишь.

Цитата(ej0804 @  17.2.2009,  16:55 Найти цитируемый пост)
И как быть если картинки занимают прямоугольную область, которая перекрывается другими контролами?

Нужно Z-order правильно выставить, чтобы эти контролы были сверху. И попробуй поставить контролу с картинкой стиль CLIPSIBLINGS.

Автор: ej0804 18.2.2009, 11:44
Спасибо разобрался.

С размерами битмапа что-то я действительно затупил.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)