рисование без покраски с помощью gdi + inno - PullRequest
0 голосов
/ 02 декабря 2018

Я пытаюсь использовать gdi + inno, но не могу нарисовать вне события onpaint

MyDllCode:

int DrawLine(HWND hwnd, ARGB LineColor, int startX, int startY, int endX,
         int endY) {
  auto hDc = GetDC(hwnd);
  Graphics graphics(hDc);
  graphics.SetSmoothingMode(SmoothingModeHighQuality);
  Pen pen((Color(LineColor)));
  pen.SetWidth(100);
  auto r = graphics.DrawLine(&pen, startX, startY, endX, endY);
  ReleaseDC(hwnd, hDc);
  return r;
}

Функция выше при вызове внутри события onpaint успешнано ничего не рисует при вызове откуда-то еще, например InitializeWizard ();

Работает InnoCode, рисование проходит успешно:

function StartGDI(): Longword;
 external 'StartGDI@{#DLLPATH} stdcall delayload';
procedure ShutDownGDI(token: longword);
 external 'ShutDownGDI@{#DLLPATH} stdcall delayload';

function DrawLine(h : HWND; LineColor: ARGB;startX: integer;startY: integer;endX: integer;
         endY: integer): integer;
  external 'DrawLine@{#DllPATH} stdcall delayload';


var
  Token: Longword;

 procedure PaintWF(Sender: TObject);
 var
  col : ARGB;
 begin
  DrawLine(WizardForm.Handle,$ffFF00ff,10,10,900,900);
 end;

procedure InitializeWizard();
begin
  token := StartGDI;
  with WizardForm do
  begin
    ClientWidth:=854;
    ClientHeight:=576;
    Center;
    OuterNotebook.Hide;
    InnerNotebook.Hide;
    Bevel.Hide;
    PageNameLabel.Hide;
    PageDescriptionLabel.Hide;
    MainPanel.Hide;
    BackButton.SetBounds(0,0,0,0);
    NextButton.SetBounds(0,0,0,0);
    CancelButton.SetBounds(0,0,0,0);
    DirBrowseButton.SetBounds(0,0,0,0);
    GroupBrowseButton.SetBounds(0,0,0,0);
    OnPaint := @PaintWF;
  end;      
end;

не работает, но то, что мне нужно для работы

function StartGDI(): Longword;
 external 'StartGDI@{#DLLPATH} stdcall delayload';
procedure ShutDownGDI(token: longword);
 external 'ShutDownGDI@{#DLLPATH} stdcall delayload';

function DrawLine(h : HWND; LineColor: ARGB;startX: integer;startY: integer;endX: integer;
         endY: integer): integer;
  external 'DrawLine@{#DllPATH} stdcall delayload';


var
  Token: Longword;


procedure InitializeWizard();
begin
  token := StartGDI;
  with WizardForm do
  begin
    ClientWidth:=854;
    ClientHeight:=576;
    Center;
    OuterNotebook.Hide;
    InnerNotebook.Hide;
    Bevel.Hide;
    PageNameLabel.Hide;
    PageDescriptionLabel.Hide;
    MainPanel.Hide;
    BackButton.SetBounds(0,0,0,0);
    NextButton.SetBounds(0,0,0,0);
    CancelButton.SetBounds(0,0,0,0);
    DirBrowseButton.SetBounds(0,0,0,0);
    GroupBrowseButton.SetBounds(0,0,0,0);
  end;

  DrawLine(WizardForm.Handle,$ffFF00ff,10,10,900,900);

end;

полный код с dll кодом: https://drive.google.com/open?id=1_3Gn9Y6PD9iqxQCgZ8VXVrMM1-ncBTOs

1 Ответ

0 голосов
/ 02 декабря 2018

Что ты пытаешься нарисовать?Есть ли у вас какие-либо причины для реализации рисования так, как вы делаете?

Рассматривали ли вы вместо этого рисование на элементе управления TBitmapImage?

Например, см. Как изменитьцвет моего индикатора выполнения в Inno Setup?

...