Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.01;
Скачать: CL | DM;

Вниз

DC   Найти похожие ветки 

 
Snap ©   (2004-06-22 21:34) [0]

Сразу скажу что я наверное чего-то непонимаю в винапи, так что не говорите что вопрос неправильный, просто попытайтесь понять чего мне надо.
Значит у меня есть форма, я рисую на ней с помощью апи. В программе рисуется текст на текстуре, и довольно часто приходится перерисовывать всю форму, а поскольку сначала нужно наложить текстуру а потом текст, всё мелькает. Поэтому я хочу сначала рисовать на внутреннем, не видном "буфере" а потом когда надо выводить с буфера уже на форму.
В качестве буфера должен выступать dc, правильно? Так вот как его создать, невидимый DC, с нужными размерами и т.д. Чтобы на на нём можно было рисовать как на обыкновенном DC? ПРробовал CreateCompatibleDC вроде не получается...


 
Aramis   (2004-06-22 21:45) [1]

Бери Bitmap, создавай в run-Time, рисуй на его Canvas и потом копируй на Canvas формы, например с помощью Draw. DC совсем другая вешь


 
Dimaxx   (2004-06-22 21:47) [2]

Лучче создай tbitmap и рисуй на его DC. Потом скопируй на форму.


 
jack128 ©   (2004-06-22 21:47) [3]

Скажи а зачем ты рисуешь на апи, если используешь VCL ?


>  ПРробовал CreateCompatibleDC вроде не получается...

код давай. в VCL именно так реализуется DoubleBuffered. Посмотри procedure TWinControl.WMPaint(var Message: TWMPaint);


 
DVM ©   (2004-06-22 21:53) [4]

А какой функцией рисуется текстура? Если это BitBlt(), то вряд ли можно достичь заметного снижения мелькания при выводе в память, а затем на окно из памяти. Поможет мало. Если же это StretchBlt, то поможет. Для текстур (особенно повторяющихся) самое то - FillRect() работает во мноооого раз быстрее BitBlt(), но возможности маленькие. Но попробуй все равно.
Итак:
1) Надо создать MemDC совместимый с DC окна (CreateCompatibleDC)
2) Надо также создать MemBitmap совместимый (CreateCompatibleBitmap)
3) Выбрать MemBitmap в MemDC (SelectObject)
4) На MemDC рисуешь, что надо (фон, текст)
5) BitBlt с MemDC на DC окна (копируешь то есть)
6) Удаляешь временный DC и Bitmap (DeleteDC, DeleteObject)

Вот, вроде ничего не забыл.

Успехов!


 
jack128 ©   (2004-06-22 22:01) [5]


> Если это BitBlt(), то вряд ли можно достичь заметного снижения
> мелькания при выводе в память, а затем на окно из памяти

?? Это почему? В VCL именно так и делается и все вполне работает..


 
DVM ©   (2004-06-22 22:14) [6]


> ?? Это почему? В VCL именно так и делается и все вполне
> работает..

Мелькание возникает из-за того, что текст выводится медленно. Если же прикинуть, то с промежуточным DC в памяти мы 2 раза рисуем одну и ту же текстуру - один раз в память, второй раз на окно. Но она рисуется очень быстро. По крайней мере для BitBlt.
Так вот, мерцание уменьшится, если потеря времени на рисование текстуры по второму разу будет ниже, чем время вывода текста. Так, что все зависит от сложности рисования того, что будет поверх текстуры. Для несложного рисования выигрыша не будет, а будет даже возможно потеря в скорости, для сложной графики будет.
Но есть возможность не удалять DC с текстурой в памяти, тогда ее не надо будет рисовать два раза и выигрыш будет.

P. S. Я на этом рисовании собаку съел - когда приходилось отрисовывать несколько объектов с прозрачными и полупрозрачными областями и антиалиазингом поверх друг друга :)


 
Snap ©   (2004-06-22 22:22) [7]

Так, спасибо всем.
Рисую я на апи потому что так быстрее и ресурсов меньше, да и гибче.
Сделал так подсказал ДВМ. Только картинку я сначала не создавал по CreateCompatibleBitmap, а по обычному CreateBitmap, потом выбирал её и рисовал на контексте. Это чем-то хуже? (Всмысле я просто сам подставлял в CreateBitmap нужные размеры чтобы подошло, а биты выставил в 32)

Кстати, ДВМ у меня текстура рисуется BitBlt, а мелькание убралось совершенно... не знаю, может мы друг друга не поняли.

Оказалось что всё таки CreateCompatibleDC надо использовать, просто я не умел с ним обращаться. :)


 
Snap ©   (2004-06-22 22:27) [8]

Заодно вопрос : подскажите пожалуйста какой функцией установить шрифт текста выводимого по ExtTextout.


 
Игорь Шевченко ©   (2004-06-22 22:34) [9]


> подскажите пожалуйста какой функцией установить шрифт текста
>


SelectObject ?



Страницы: 1 вся ветка

Текущий архив: 2004.08.01;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.028 c
1-1090406223
Dm_S
2004-07-21 14:37
2004.08.01
xl_1:=CreateOLEObject( Excel.Application в консольном приложении


1-1089870421
Pavelkq
2004-07-15 09:47
2004.08.01
Страшные тормоза при работе программы.


14-1089722530
mOOx_
2004-07-13 16:42
2004.08.01
Сбор статистики по более чем 300 логам


6-1085918955
Klev
2004-05-30 16:09
2004.08.01
Отправка письма с вложением средствами Winsock API


1-1090243039
Natalie_Q
2004-07-19 17:17
2004.08.01
Из Delphi в HTML