Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

За 2005-05-10

3D графика

Hello comp,

с чего лучше начать изучение 3D графики? Задачу для начала ставлю
такую - написание простейшего 3d движка, реализующего перемещение
в одной или нескольких комнатах.
С удивлением обнаружил, что в инете практически ни исходников таких
программ, ни каких-либо книг для скачивания... Если знаете
какие-нибудь ресурсы по теме - подскажите!
И еще - что лучше - Direct3D или OpenGL?

   2005-05-10 23:04:09 (#365227)

Re[8]: вывод текста на рабочий стол

Unit Hello,World!;
uses
Dialogs;
От Tue, 10 May 2005 02:06:08 +0400 "Victor V. Vakchturov" <forum-moderat***@m*****.ru>
Типа
Здравствуйте !

> VVV> мые иконки отображает (это просто виндовый список -
VVV> SysListView32). Получать контекст через GetDC(0) вроде, то же самое
VVV> что и через GetDC(GetDesktopWindow()) и рисоваться все будет поверх
VVV> всего, хоть контекст и получен для окна, находящегося в Z-порядке
VVV> ниже окна, отображающего иконки.

Тут подсказывают мне код
procedure WriteDC(s: string);
var
c: TCanvas;
begin
c := TCanvas.Create;
c.Brush.Color := clBlue;
c.Font.color := clYellow;
c.Font.name := 'Fixedsys';
c.Handle := GetDC(GetWindow(GetDesktopWindow, GW_OWNER));
c.TextOut(screen.Width - c.TextWidth(s) - 2, screen.Height - 43, s);
c.free;
end;
******************************************
а вдругое ухо
program Name_on_screen;

{$APPTYPE CONSOLE}

uses
windows, graphics;

procedure Name_on_screen;
const
name='Delphi World';
var
ScreenDC: hDC;
begin
ScreenDC := GetDC(0);
settextcolor(screendc,clred); // Устанавливаем цвет текста, в данном случае
// clRed - красный.
SetBkMode(screendc, TRANSPARENT); // Рисуем на прозрачном фоне,
// без этой строчки фон - белый.
textout(screendc,0,0,name,6); // Устанавливаем координаты вывода и длину
// строки (в нашем случае - 6 символов)
ReleaseDC(0,ScreenDC);
end;

begin
name_on_screen;
end.

************************
не знаю небыл не проверял
Всех с наступающим ... отрезвлением!

С уважением Валерий
AKA votum
I use OpenOffice.org! D7/FB

Номер выпуска : 4451
Возраст листа : 597 (дней)
Количество подписчиков : 516
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/364994
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

   2005-05-10 13:58:11 (#364994)

Re[8]: вывод текста на рабочий стол

Хаю ду ю ду Victor V. Vakchturov?

Смотрю и вижу, как ты печатаешь умные вещи и дай-ка, думаю,
тоже что-нибудь напечатаю:

VVV> Кстати, к ним может быть перекрыт доступ с помощью средств
VVV> администрирования.

Имхо, только админы-садисты запрещают смену обоев :)

>> PS: Все-таки этот способ гораздо проще чем внедрение в explorer,
>> которого тоже, кстати, может не быть :) - AstonShell например, правда
>> там и мой способ вроде не прокатит :)

VVV> В общем случае - конечно. Шелла может не быть вообще.

Тогда мой способ работает :)

   2005-05-10 07:14:48 (#364853)

Re[7]: вывод текста на рабочий стол

Здравствуйте !

> А нефиг раскидывать где попало :)
> Тем более что юзер ставя программу на свой комп принимает лицензию, а
> там можно и про порчу wallpaper-ов написать :)
> А если серьезно - backup никто не отменял.
Кстати, к ним может быть перекрыт доступ с помощью средств
администрирования.

> PS: Все-таки этот способ гораздо проще чем внедрение в explorer,
> которого тоже, кстати, может не быть :) - AstonShell например, правда
> там и мой способ вроде не прокатит :)

В общем случае - конечно. Шелла может не быть вообще.

--
С уважением, Вахтуров Виктор.

Номер выпуска : 4449
Возраст листа : 597 (дней)
Количество подписчиков : 515
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/364829
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

   2005-05-10 02:20:36 (#364829)

Re[7]: вывод текста на рабочий стол

Здравствуйте !

> VVV> Его может и не быть.
> VVV> Да и некрасиво это - юзеру такую свинью подкладывать - на его
> VVV> обоях рисовать :)

> Насколько мне известно GetDC(0) - есть дескриптор экрана: рисуешь
> поверх всего.
Ну да. Так оно и есть.

> Как получить дескриптор канвы, которая находится между иконками
> рабочего стола и обоями, чтобы рисовать на рабочем столе, но ниже
> иконок?
Боюсь, что никак кроме сабклассинга окна, рисующего эти иконки.
Дело в том, что окно десктопа (получаемое через GetDesktopWindow)
является родителем (но не непосредственным) окна FolderView,
которое эти самые иконки отображает (это просто виндовый список -
SysListView32). Получать контекст через GetDC(0) вроде, то же самое
что и через GetDC(GetDesktopWindow()) и рисоваться все будет поверх
всего, хоть контекст и получен для окна, находящегося в Z-порядке
ниже окна, отображающего иконки.

> Вопрос не совсем по теме: Когда подготавливаешь рисунок в буфере
> (TBitMap), а потом с помощью BitBlt выкидываешь его на форму
> - всё хорошо, но
> только до того момента, когда форму ничего не перекрывает, после этого
> рисунок приходится перерисовывать. Как вывести рисунок на форму, чтобы
> при требуемой перерисовки формы - форма перерисовывала всё сама (как
> бы это рисовалась Form.Canvas.LineTo...)?

Это надо ловить сообщение WM_PAINT (должен быть обработчик типа OnPaint)
и рисовать в нем. Сообщение WM_PAINT приходит каждый раз, когда окну нужна
перерисовка.


--
С уважением, Вахтуров Виктор.

Номер выпуска : 4448
Возраст листа : 597 (дней)
Количество подписчиков : 515
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/364822
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

   2005-05-10 02:08:40 (#364822)

Re: CClientDC

Здравствуйте !

> Есть проект, в котором нужно многократно выводить графку...
> 1. Сам проект основан на CFormView

А почему именно на CFormView ?
CFormView служит для несколько иных целей чем вывод графики -
это фактически диалоговое окно, на котором надо размещать
свои элементы управления. Для этого оно и сделано. Если нужно просто
рисовать что то, то гораздо правильнее использовать CScrollView
(там реализованы механизмы пересчета координат с учетом заданных
метрик и текущей позиции скроллинга).

> 2. Вывод осуществляется с помошью примерно следующей конструции:
>
> CClientDC pDraw;
> pDraw.MoveTo(100,100);
> pDraw.LineTo(200,200);
>
> Рисовать-то он рисует, но вот через 2-3 тысячи циклов, вывод заметно
> тормозится, а ещё через столько же выдаёт "Запрашиваемый ресурс не
> доступен" и внаглую, закрывается...

> CClientDC pDraw;
Такая конструкция не прокатит (у CClientDC нет дефолтового конструктора
и надо передавать при его создании какое то окно).
Значит, код приведен не полностью.
Также могу предположить, что pDraw - указатель (отчего же ему быть p...),
следовательно где то под него память должна выделяться. Так вот если
его не убивать, то и контекст операционной системы не освободиться.
Отсюда - утечка ресурсов GDI и такой вот эффект.
То есть не надо делать так:

{
...
CClientDC *pDraw = new CClientDC(this);
pDraw->MoveTo(100,100);
...
}
надо либо так:
{
...
CClientDC dcDraw(this);
dcDraw.MoveTo(100,100);
...
}
тут dcDraw при выходе из функции разрушится.
либо так:
{
...
CClientDC *pDraw = new CClientDC(this);
pDraw->MoveTo(100,100);
delete pDraw;
...
}

И еще контекст, наверно, может не освобождаться если в него выбрать
какие либо объекты GDI, и потом не выбрать в него то что там было ранее.

То есть вот так делать не надо:
{
...
CClientDC dcDraw(this);
CPen pen;
pen.CreatePen(PS_SOLID, 1, RGB(0x00, 0x33, 0x66));
dcDraw.SelectObject(&pen);
dcDraw.MoveTo(100,100);
...
}
надо так:
{
...
CClientDC dcDraw(this);
CPen pen, *pOldPen;
pOldPen = pen.CreatePen(PS_SOLID, 1, RGB(0x00, 0x33, 0x66));
dcDraw.SelectObject(&pen);
dcDraw.MoveTo(100,100);
dcDraw.SelectObject(pOldPen);
...
}

> Если я правильно понимаю, то вся графика выводится поверх старого
> контекста...Может, есть какая-то функция, которая бы обнуляла всё
> содержимое?

Нет никакого старого контекста. Контекст устройства - абстракция (точнее
даже
механизм абстрагирования от особенностей конкретного устройства). Контекст
создается соответствующими функциями API и уничтожается. Если контексты
создавать, но не освобождать, то система скоро перестанет создавать новые
объекты GDI (есть ограниченный и не особо большой пул объектов - вроде
16384). То есть всего в винде можно создать 16384 перьев/кистей/контекстов/
регионов/... На уровне процесса всего около 10000. Кстати, где то в реестре
есть ключ, в котором указывается максимальное количество объектов GDI на
уровне процесса.

А в Вашем случае ресурсы GDI текут - это очевидно.


--
С уважением, Вахтуров Виктор.
(

Номер выпуска : 4447
Возраст листа : 597 (дней)
Количество подписчиков : 515
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/364818
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

   2005-05-10 01:42:11 (#364818)