Конференция "Прочее" » Двойная буфферизация(выдернуто из "Вакансия Delphi программист")
 
  • oxffff © (22.03.08 14:12) [20]

    > У кого есть Bitmap? У DC?


    Ты что читать не умеешь?

    DC is a structure that defines a set of graphic objects and their associated attributes, and the graphic modes that affect output. The graphic objects include a pen for line drawing, a brush for painting and filling, a bitmap for copying or scrolling parts of the screen, a palette for defining the set of available colors, a region for clipping and other operations, and a path for painting and drawing operations.
  • oxffff © (22.03.08 14:17) [21]

    > DVM ©   (22.03.08 14:01) [17]
    >
    > > tesseract ©   (22.03.08 12:32) [15]
    >
    > Это GDI использует аппаратное ускорение частично,


    С этим я могу согласиться.
    Существует возможность использования ускорения за счет делегирования функциональности интерфейса GDI -> драйверу видеокарты, либо непосредственного отображения области видео вывода окна на область RAM.
    Но это уже исключение. При таком раскладе разницы между GDI и DirectDraw нет. К этому естественно все и идет. А если видеокарта не поддреживает то область вывода окна формируется в DC. и BITMAP просто передается драйверу вместе с CLIP областью.
  • DVM © (22.03.08 14:55) [22]

    > oxffff ©   (22.03.08 14:12) [20]
    >
    > > У кого есть Bitmap? У DC?
    >
    >
    > Ты что читать не умеешь?

    В том то и дело что умею. Пока битмап не выбран в контекст его там нет.
  • tesseract © (22.03.08 15:21) [23]

    > В том то и дело что умею. Пока битмап не выбран в контекст
    > его там нет.


    В устройстве нет. В буфере есть. Или ты думаешь, что винда его не кэширует? Двойной буффер и есть в приложении. Один у системы второй у нас.  Там на самом деле ещё и HAL лепту вносит.
  • Игорь Шевченко © (22.03.08 16:13) [24]
    tesseract ©   (22.03.08 15:21) [23]


    > В устройстве нет. В буфере есть. Или ты думаешь, что винда
    > его не кэширует?


    Кто куда кого кеширует ?
  • Игорь Шевченко © (22.03.08 16:15) [25]
    oxffff ©   (22.03.08 14:12) [20]

    Эта...а у Device Context'а принтера тоже внутре битмап есть ? А у метафайла ?
  • oxffff © (22.03.08 21:05) [26]

    > DVM ©   (22.03.08 14:55) [22]
    >
    > > oxffff ©   (22.03.08 14:12) [20]
    > >
    > > > У кого есть Bitmap? У DC?
    > >
    > >
    > > Ты что читать не умеешь?
    >
    > В том то и дело что умею. Пока битмап не выбран в контекст
    > его там нет.


    Точно хорошо читаешь?

    см. SelectObject

    hgdiobj

    (Bitmaps can be selected for memory device contexts only, and for only one device context at a time.)

    Так что для остальных DC это сделать нельзя.
  • oxffff © (22.03.08 21:15) [27]

    > Игорь Шевченко ©   (22.03.08 16:15) [25]
    > oxffff ©   (22.03.08 14:12) [20]
    >
    > Эта...а у Device Context'а принтера тоже внутре битмап есть
    > ? А у метафайла ?


    А какое отношение имеет метафайл к DC?

    >Device Context'а принтера тоже внутре битмап есть

    Нет, а что окна выводятся на принтер?
  • oxffff © (22.03.08 21:19) [28]

    > А какое отношение имеет метафайл к DC?


    Я имею ввиду какое отношение имеет сериализация графических операций к непосредственному выводу?
  • Rouse_ © (22.03.08 21:30) [29]

    > Эта...а у Device Context'а принтера тоже внутре битмап есть
    > ? А у метафайла ?

    Эмм а при чем тут принтер? Вывод графики через драйвер устройства (vga.dll  и т.п.) идет, а DC это абстрактный уровень... В MSDN же описано в About Device Contexts
  • Игорь Шевченко © (22.03.08 22:08) [30]
    oxffff ©   (22.03.08 21:15) [27]


    > А какое отношение имеет метафайл к DC?


    Он (метафайл) его имеет.


    >
    > Нет, а что окна выводятся на принтер?


    У принтера тоже есть DC

    В посте 20 ты написал:

    "Ты что читать не умеешь?

    DC is a structure that defines a set of graphic objects and their associated attributes, and the graphic modes that affect output. The graphic objects include a pen for line drawing, a brush for painting and filling, a bitmap for copying or scrolling parts of the screen, a palette for defining the set of available colors, a region for clipping and other operations, and a path for painting and drawing operations."

    Все эти объекты применимы как к DC окна, так и к DC принтера, метафайла и еще чего-нибудь, у чего есть DC.

    В связи с этим у меня вопрос, а что у принтера или метафайла внутре его DC тоже битмап имеется, на котором рисуют ? А если принтер PostScript, тогда как ?

    oxffff ©   (22.03.08 21:19) [28]


    > Я имею ввиду какое отношение имеет сериализация графических
    > операций к непосредственному выводу?


    В системе есть очередь операций GDI. Про нее можно прочитать тут:
    http://msdn2.microsoft.com/en-us/library/ms534903(VS.85).aspx
  • Nobody (23.03.08 01:17) [31]

    > Игорь Шевченко ©   (22.03.08 11:29) [2]
    > у DC нету буфера.

    У DC есть буффер. Другое дело, что у окна обычно нет постоянного DC (если только ты не указал OWNDC).
  • Игорь Шевченко © (23.03.08 02:08) [32]
    Nobody   (23.03.08 01:17) [31]


    >  Другое дело, что у окна обычно нет постоянного DC (если
    > только ты не указал OWNDC).


    А если я указал CS_OWNDC, то что я могу сделать с буфером ?
  • oxffff © (23.03.08 16:07) [33]

    >
    > В связи с этим у меня вопрос, а что у принтера или метафайла
    > внутре его DC тоже битмап имеется, на котором рисуют ? А
    > если принтер PostScript, тогда как ?

    Я
    Отвечаю на ваш вопрос

    A printer DC is similar to a display DC in that it is an internal data structure that defines a set of graphic objects and their associated attributes and specifies the graphic modes that affect output. The graphic objects include a pen (for line drawing), a brush (for painting and filling), and a font (for text output).

    Как видите про Bitmap ни слова.

    А вы попробуйте качестве source для BitBlt указать DC принтера, а в качестве dest Window DC.
    Только не забудьте прочитать вот это

    BitBlt returns an error if the source and destination device contexts represent different devices. To transfer data between DCs for different devices, convert the memory bitmap to a DIB by calling GetDIBits. To display the DIB to the second device, call SetDIBits or StretchDIBits.

    А вы с какой целью упоминули про  DC принтера?
  • Игорь Шевченко © (23.03.08 16:31) [34]
    oxffff ©   (23.03.08 16:07) [33]

    Если у DC окна есть битмап, на котором все нарисовано, очевидно не составит труда сделать из него BitBlt в другое окно, вне зависимости от того, видно ли исходное окно ?

    Давай сделаем простой пример:

    unit AppMain;

    interface
    uses
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
     Dialogs, StdCtrls, ExtCtrls;

    type
     TForm1 = class(TForm)
       ListBox1: TListBox;
       PaintBox1: TPaintBox;
       Button1: TButton;
       procedure FormCreate(Sender: TObject);
       procedure Button1Click(Sender: TObject);
     end;

    var
     Form1: TForm1;

    implementation

    {$R *.dfm}

    function EnumWindowProc (Wnd: HWND; param: LPARAM): Integer; stdcall;
    var
     AClassName: array[0..255] of char;
    begin
     with TForm1(param) do
     begin
       GetClassName(Wnd, AClassName, SizeOf(AClassName));
       ListBox1.Items.AddObject(AClassName, TObject(Wnd));
     end;
     Result := 1;
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    var
     Wnd: HWND;
     ADC: HDC;
    begin
     if ListBox1.ItemIndex > -1 then
     begin
       Wnd := HWND(ListBox1.Items.Objects[ListBox1.ItemIndex]);
       if IsWindow(Wnd) then
       begin
         ADC := GetWindowDC(Wnd);
         try
           with PaintBox1.ClientRect do
             StretchBlt(PaintBox1.Canvas.Handle, Left, Top, Right - Left,
               Bottom - Top,
               ADC, 0, 0, Right - Left, Bottom - Top, SRCCOPY);
         finally
           ReleaseDC(Wnd, ADC);
         end;
       end;
     end;
    end;

    procedure TForm1.FormCreate(Sender: TObject);
    begin
     EnumWindows(@EnumWindowProc, LPARAM(Self));
    end;

    end.



    И нарисуем из DC каждого окна его картинку.
  • oxffff © (23.03.08 16:55) [35]

    > Давай сделаем простой пример:


    Давайте вы прочитаете документацию для начала. :)

    Если это Common Device Contexts. То вы ничего не увидите.
    Для начала надо заставить окно отрисоваться в DC.
    Либо использовать стиль CS_OWNDC.

    Я в разговоре о Double buf разделяю мнение, что буфера действительно два.
    Один MемD, второй window DC. В каждом есть битмап, на котором вы рисуете.
    Далее этот битмап отправляется драйверу видеокарты который копирует содержимое в Front buffer видеокарты.
  • oxffff © (23.03.08 17:01) [36]

    > Далее этот битмап отправляется драйверу видеокарты который
    > копирует содержимое в Front buffer видеокарты.


    То есть получается три буффера.

    MEM BITMAP -> WINDOW BITMAP -> VIDEO FRONT BUFFER.
  • Игорь Шевченко © (23.03.08 17:05) [37]
    oxffff ©   (23.03.08 16:55) [35]


    > Давайте вы прочитаете документацию для начала. :)
    >
    > Если это Common Device Contexts. То вы ничего не увидите.
    >
    > Для начала надо заставить окно отрисоваться в DC.
    > Либо использовать стиль CS_OWNDC.


    Нет проблем, меняем:

    function EnumWindowProc (Wnd: HWND; param: LPARAM): Integer; stdcall;
    var
     AClassName: array[0..255] of char;
     CS: DWORD;
    begin
     with TForm1(param) do
     begin
       GetClassName(Wnd, AClassName, SizeOf(AClassName));
       CS := GetClassLong(Wnd, GCL_STYLE);
       if (CS and (CS_OWNDC)) <> 0 then
         ListBox1.Items.AddObject(AClassName, TObject(Wnd));
     end;
     Result := 1;
    end;

  • oxffff © (23.03.08 17:09) [38]
    Часть операция может выполняет видеокарта.
    см. GetDeviceCaps.

    CC_CHORD Device can draw chord arcs.
     CC_CIRCLES Device can draw circles.
     CC_ELLIPSES Device can draw ellipses.
     CC_INTERIORS Device can draw interiors.
     CC_NONE Device does not support curves.
     CC_PIE Device can draw pie wedges.
     CC_ROUNDRECT Device can draw rounded rectangles.
     CC_STYLED Device can draw styled borders.
     CC_WIDE Device can draw wide borders.
     CC_WIDESTYLED Device can draw borders that are wide and styled.

    и т.д.

    А то что не может быть нарисовано силами видео карты, рисует Windows в
    в DC bitmap'e окна.

    Это мое IMHO.
  • Игорь Шевченко © (23.03.08 17:09) [39]
    До кучи еще тестовое окно запустим:

    unit main;

    interface

    uses
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
     Dialogs;

    type
     TForm1 = class(TForm)
     protected
       procedure CreateParams (var Params: TCreateparams); override;
     end;

    var
     Form1: TForm1;

    implementation

    {$R *.dfm}

    { TForm1 }

    procedure TForm1.CreateParams(var Params: TCreateparams);
    begin
     inherited;
     Params.WindowClass.style := Params.WindowClass.style or CS_OWNDC;
    end;

    end.

 
Конференция "Прочее" » Двойная буфферизация(выдернуто из "Вакансия Delphi программист")
Есть новые Нет новых   [134433   +22][b:0][p:0.002]