Форум: "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