-
> oxffff © (23.03.08 23:08) [98]
Или делается копия в этом случае в RAM <--> VIDEO RAM.
-
oxffff © (23.03.08 23:08) [98]
> А как быть если часть операций поддерживается, а часть нет. > > Часть операций видеокартой в VIDEO буфере, а часть в RAM > буфере, > Как потом смешивать результаты? :)))))))
То, что не поддерживается, рисуется в буфере растра, потом они смешиваются. Адаптером.
-
> Игорь Шевченко © (23.03.08 23:15) [101]
Увы это можно сделать только для части операций. Операции могут иметь зависимости. :)
-
> Eraser © (23.03.08 23:10) [99] > > [97] oxffff © (23.03.08 23:05) > > пардон, моя вина.. невнимательность, но суть дела это не > поменяло.. даже если заменить WindowName = 'DMClient'; на > WindowName = 'Form2'; эффект тот же - скрытая часть окна > не копируется.
Однако если свернуть окно, то копируется начиная с несвернутого положения. Однако по данному примеру нельзя сделать вывод о количестве буферов или их отсутствии до попадания в front video buf.
-
oxffff © (23.03.08 23:23) [102]
> Увы это можно сделать только для части операций. > Операции могут иметь зависимости. :)
GDI тоже не дураки писали и о зависимостях представляют. Очевидно, что если нечто имеет зависимости и это нечто поддерживается аппаратно, а зависимости нет, то выбор делается в пользу целостности. Кроме того, набор функций, которые определяет драйвер, составлялся разработчиками GDI, поэтому зависимости они постарались исключить.
-
oxffff © (23.03.08 23:27) [103]
> Однако если свернуть окно, то копируется начиная с несвернутого > положения.
Что подтверждает тезис о том, что DC окна является дыркой в DC экрана. Правда, копируется то, что в данный момент видно с этого несвернутого положения. То есть, с того прямоугольника (или региона), который отсекает часть от общего экрана для DC окна.
-
> [103] oxffff © (23.03.08 23:27)
> Однако если свернуть окно, то копируется начиная с несвернутого > положения.
у меня копируется опять пустое место. вот модифицированный пример
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm2 = class(TForm)
Memo1: TMemo;
Button2: TButton;
Label1: TLabel;
Edit1: TEdit;
Timer1: TTimer;
procedure Button2Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
protected
procedure CreateParams (var Params: TCreateparams); override;
private
public
end;
var
Form2: TForm2;
implementation
procedure TForm2.Button2Click(Sender: TObject);
begin
Timer1.Enabled := True;
end;
procedure TForm2.CreateParams(var Params: TCreateparams);
begin
inherited;
Params.WindowClass.style := Params.WindowClass.style or CS_OWNDC;
end;
procedure TForm2.Timer1Timer(Sender: TObject);
const
WindowName = 'Form2';
var
hWnd: THandle;
bmp: TBitmap;
begin
Beep;
Timer1.Enabled := False;
hWnd := FindWindow(nil, WindowName);
bmp := TBitmap.Create;
try
bmp.Width := Width;
bmp.Height := Height;
StretchBlt(bmp.Canvas.Handle, 0, 0, Memo1.Width,
Memo1.Height,
GetDC(hWnd),
0, 0, Memo1.Width,
Memo1.Height, SRCCOPY);
bmp.SaveToFile('test.bmp');
finally
bmp.Free;
end;
end;
end.
> Однако по данному примеру нельзя сделать вывод о количестве > буферов или их отсутствии до попадания в front video buf.
нет у DC окна никаких буфферов.
-
Ну и спор у вас :) Даже если где-то система что-то и буферизует, то на кой ляд программисту gdi об этом знать? Если содержимое окна надо каждый раз перерисовывать, значит нет буфера :) Если буфер есть, то на кой хрен мы каждый раз перерисовывем? :)
-
Пора кому-то браться за книжку "О чём спорят на форумах по Delphi".... Я из этой ветки массу новых знаний почерпнул!!!!
-
> 31512 (24.03.08 07:52) [108]
У Фень Юаня то же самое все гораздо более строго и подробно расписано. Правда без учета висты пока. А здесь спор не ради истины, а ради самого спора скорее.
-
> нет у DC окна никаких буфферов.
Игорь Шевченко © (23.03.08 22:01) [82]
-
oxffff © (24.03.08 13:34) [110]
Ну все равно ведь нету :) у DC окна...
-
> Игорь Шевченко © (24.03.08 14:25) [111]
Как нету?
А как же HBM := GetCurrentObject(DC, OBJ_BITMAP);?
Ведь растр есть. И нет гарантии, что это сразу front поверхность Так же как и что это back поверхность.
-
> Игорь Шевченко © (24.03.08 14:25) [111] > oxffff © (24.03.08 13:34) [110] > > Ну все равно ведь нету :) у DC окна...
oxffff © (22.03.08 14:17) [21]
-
> [112] oxffff © (24.03.08 20:17)
читаем еще раз литературу, оконный DC не совместим с DC, который может рисовать на битмапах.
-
> Eraser © (24.03.08 20:24) [114]
Чего???????
-
> Eraser © (24.03.08 20:24) [114]
Вообще речь во всей ветке шла о количестве буферов перед тем попадет изображение на Front поверхность видеопамяти.
-
> Eraser © (24.03.08 20:24) [114] > > [112] oxffff © (24.03.08 20:17) > > читаем еще раз литературу, оконный DC не совместим с DC, > который может рисовать на битмапах.
Ты хочь понял что сказал, скажи почему есть битмап в оконном DC? И почему функции Bitblt в примерах выше работают?
-
> [116] oxffff © (24.03.08 20:28)
> Вообще речь во всей ветке шла о количестве буферов перед > тем попадет изображение на Front поверхность видеопамяти.
давай не будем касаться фронт-буфферов, драйверов и т.п., т.к. это совершенно другая тема, мало пересекающаяся с прикладным уровнем DC.
> скажи почему есть битмап в оконном DC?
не знаю почему он там есть.
> И почему функции Bitblt в примерах выше работают?
как они работают то? копируют ровно то, что есть в экранном контексте, легко доступном через CreateDC(PChar('DISPLAY'), nil, nil, nil); ни каких бэк-буфферов в этом битмапе или где либо еще на прикладном уровне я не наблюдал. если знаешь, где этот буффер - покажи, не знаешь - о чем тогда спор?
-
> давай не будем касаться фронт-буфферов, драйверов и т.п. > , т.к. это совершенно другая тема, мало пересекающаяся с > прикладным уровнем DC.
Речь шла как раз об этом.
> > скажи почему есть битмап в оконном DC? > > не знаю почему он там есть.
А чем ты рисуешь?
> > как они работают то? копируют ровно то, что есть в экранном > контексте, легко доступном через CreateDC(PChar('DISPLAY'), > nil, nil, nil); > ни каких бэк-буфферов в этом битмапе или где либо еще на > прикладном уровне я не наблюдал. > если знаешь, где этот буффер - покажи, не знаешь - о чем > тогда спор?
Разговор начался в самом самом начале о количестве буферов перед попаданием из MemDC в окно. То что буфер есть можно узнать по HBM := GetCurrentObject(DC, OBJ_BITMAP). А то что он необычный по провалу при вызове GetObject
|