Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.08.01;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.08.01;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.032 c
1-1089956774
Valeri
2004-07-16 09:46
2004.08.01
Не запускается программа...


14-1089300168
Рома_ДЖ
2004-07-08 19:22
2004.08.01
Подскажите как можно защитить прогу. от размножения


3-1089363561
Vladimiruss
2004-07-09 12:59
2004.08.01
Поиск и фильтрация данных


14-1089885307
Artem123
2004-07-15 13:55
2004.08.01
как вставить запись в таблицу из DBGrid и ....


14-1089700442
leonidus
2004-07-13 10:34
2004.08.01
Как MMS-сообщение из инета на телефон послат





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский