Главная страница
    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.097 c
14-1090046515
Int64
2004-07-17 10:41
2004.08.01
Menu


1-1090233757
Саша
2004-07-19 14:42
2004.08.01
Отключение клавиши ПУСК


1-1089961123
Senator
2004-07-16 10:58
2004.08.01
многоязыковая поддержка


9-1081859786
Goorus
2004-04-13 16:36
2004.08.01
3D колизии


4-1087812260
DimaT
2004-06-21 14:04
2004.08.01
MAPI in the Service NT





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский