![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Рисование с помощью API. [D7, WinXP]
Новичек © (2005-04-30 15:59:00)Уважаемые Мастера, запутался совсем в MSDN с рисованием примитивов :-(
Подскажите, пожалуйста, как нарисовать на форме окружность, прямоугольник и т.п. средствами API. День, очевидно, сегодня не мой - не могу нарисовать, хоть тресни :-(
Cobalt (2005-04-30 21:03:00) [1]2 Новичек © (30.04.05 18:42) [15]
Это ресурс. Взял ресурс - освободил.
Не освободил - меньше ресурсов остаётся. после дестка тысяч неосвобождений система тебе скажет - ошибка, нет доступных ресурсов. Отрисовки не будет.
Новичек (2005-04-30 18:59:00) [2]
> Grell
Эх... Да читал я :-) Последую твоему совет. Все-таки Windows - он и в Африке Windows :-)
Grell (2005-04-30 18:51:00) [3]Блин=) Не думай что будет если.Просто освобождай.Так того требует Windows!Почитай Windows SDK, если интересно, там написано:
The ReleaseDC function releases a device context (DC), freeing it for use by other applications.
......
The application must call the ReleaseDC function for each call to the GetWindowDC function and for each call to the GetDC function that retrieves a common device context.
Новичек (2005-04-30 18:42:00) [4]
> Grell
Ну, хорошо... А для чего освобождать? Это объект? А что будет при неосвобождении? Простите за обилие вопросов, я учусь еще...
Grell (2005-04-30 18:38:00) [5]Да нет, просто ты обязан после отрисовки освободить контекст устройства, так как он больше не нужен, а при следующей опять его получить.Тоесть схема получается такая:
1.Получаеш конеткст GetDC
2.Если надо выбираеш в контексте какойнить объект (кисть,шрифт),SelectObject()
3.Рисуеш текст,примитивы,изображения...
4.Удаляеш объекты выбраные в контексте, DeleteObject()
5.Освобождаеш контекст, ReleaseDC()
Новичек (2005-04-30 18:12:00) [6]
> Grell
Хм... То есть, при неосвобождении контекста прорисовка становится проблематичной?
Grell (2005-04-30 18:07:00) [7]Как я понимаю функция ReleaseDC освобождает контекст, чтоб им могли воспользоватся другие приложения.
Новичек (2005-04-30 17:32:00) [8]
> Grell
Это я уяснил... Не понял только назначение ReleaseDC.
Grell (2005-04-30 17:24:00) [9]Так ты сам код отрисовки елипса вызывай в OnPaint формы и все ОК будет!
Новичек (2005-04-30 17:02:00) [10]Написал так:
var
DC_Panel: HDC;
begin
DC_Panel := GetDC(Panel1.Handle);
Ellipse(DC_Panel, 0, 0, 100, 80);
ReleaseDC(Panel1.Handle, DC_Panel);
Только разницы не заметил :-(
MBo (2005-04-30 16:49:00) [11]>Ellipse(GetDC(pnl1.Handle),
Так нельзя. Нужно освобождать контекст ReleaseDC
Новичек (2005-04-30 16:46:00) [12]Ага, получилось: Ellipse(GetDC(pnl1.Handle), 0, 0, 100, 80); рисует заполненный эллипс. Вот только метод Repaint стирает его. Но лиха беда начало, докопаюсь, след взят :-)
Новичек (2005-04-30 16:28:00) [13]Пробую...
MBo (2005-04-30 16:20:00) [14]Panel1.Handle - дескриптор окна панели, а нужен дескриптор графического контекста. GetDC поможет.
MBo (2005-04-30 16:19:00) [15]Если знаешь метод TCanvas, но сомневаешься, какая API-функция используется - смотри в исходники Graphics.pas
Новичек (2005-04-30 16:19:00) [16]А почему не работает Ellipse(Panel1.Handle,10,10,100,80); ?
То есть, почему не рисуется на панели?
Новичек (2005-04-30 16:11:00) [17]А я уперся в CrerateRectRgn и ей подобным... Воитину, не мой день.
Спасибо. Как всегда - просто до гениальности :-)
MBo (2005-04-30 16:06:00) [18]Ellipse(Canvas.Handle,10,10,100,80);