drukowanie - dodanie haka w oknie

0

Podczas drukowania odpalamy ten standardowy dialogbox, o taki:

user image

i chciałbym umieścić tam swój jeden, niewielki checkbox,
pt. 'drukuj ptaka', albo 'pokaż błędy na wydruku', cokolwiek.

Miałoby to być tam na dole w wolnym miejscu, powiedzmy z lewa od OK, albo pod tymi karteczkami.

Da radę to wstawić - ot, tak ciach i już?
Podczepię tam oczywiście hooka w PRINTDLG:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms646843%28v=vs.85%29.aspx

pod ten lpfnPrintHook i będę widział jak ten hak stoi przed zamknięciem okna, znaczy po OK.

0

Poczytaj więcej o WinAPI

CreateWindow('InstName', 'drukuj ptaka', WS_CHILD or WS_VISIBLE or BS_CHECKBOX, 10,10,100,40, Handle, 105, hInstance, 0);
0

@hzmzp: jak już to pierwszy parametr powinien być Button żeby uzyskać CheckBox.

@stukpuk: nie mam dużego doświadczenia w obsłudze wydruku pod WinAPI. Ale według dokumentacji, to jeżeli dobrze zrozumiałem - bardziej powinieneś użyć lpfnSetupHook. Natomiast dalej postępujesz tak, jak opisał poprzednik. Czyli tworzysz sobie żądane kontrolki i dodajesz kod do ich obsługi. Tyle "magii" :)

0

Sorki za zmyłkę, linijkę żywcem wyciągnięciem z mojej appki xD
a tu masz ładnie opisane jak korzystać z WinAPI
http://4programmers.net/Delphi/Kompendium/Rozdzia%C5%82_12

0

Ja tak myślę czy dla CheckBoxa warto bawić się w pisane WinApi hooki skoro praktycznie bez żadnej znajomości WinApi (z wyjątkiem podstaw obsługi komunikatów) można sobie zrobić własny PrintDialog dziedziczący po TPrintDialog.

type
  TMyPrintDialog = class(TPrintDialog)
  private
    fMyCheckBox: TCheckBox;
    fMyCheckBoxState: Boolean;
  protected
    procedure WndProc(var Message: TMessage); override;
  public
    property MyCheckBoxState: Boolean read fMyCheckBoxState;
  end;
procedure TMyPrintDialog.WndProc(var Message: TMessage);
var
  R: TRect;
begin
  case Message.Msg of
  WM_INITDIALOG:
    begin
     fMyCheckBoxState:= False;
     GetClientRect(Self.Handle, R);
     fMyCheckBox:= TCheckBox.Create(Self); //ten CheckBox zostanie automatycznie zwolniony
     fMyCheckBox.ParentWindow:= Self.Handle;
     fMyCheckBox.Visible:= True;
     fMyCheckBox.Left:= 20;
     fMyCheckBox.Top:= R.Bottom - 30;
     fMyCheckBox.Caption:= 'Drukuj ptaka';
    end;
  WM_COMMAND:
    begin
      if (Message.WParamHi = BN_CLICKED) and
        (Message.LParam = fMyCheckBox.Handle) then
      begin
        fMyCheckBox.Checked:= not fMyCheckBox.Checked;
        fMyCheckBoxState:= fMyCheckBox.Checked;
      end;
    end;
  end;
  inherited;
end;
0

@kAzek: masz rację, faktycznie tak jest łatwiej, jeżeli możemy skorzystać z VCL. Jednak @stukpuk pisał od razu o elementach stricte WinAPI, które chce użyć, więc zasugerowałem się tym w mojej odpowiedzi.

0

Dobry skecz, ale tam jest chyba zbędny kod:

kAzek napisał(a):

WM_COMMAND:
begin
if (Message.WParamHi = BN_CLICKED) and
(Message.LParam = fMyCheckBox.Handle) then
begin
fMyCheckBox.Checked:= not fMyCheckBox.Checked;
fMyCheckBoxState:= fMyCheckBox.Checked;
end;
end;
end;
inherited;
end;



Po co to jest?
Autocheck chyba sam sobie da radę.

Wystarczy chyba OK łapać i wtedy sprawdzić ustawienie: is Checked or not.

To checkbox można chyba zwyczajnie postawić, za pomoco CreateWindow, bez tej zmiennej fMyCheckBox?

A inny dialogbox, taki dowolny i własny - z tego .res, też można tak capnąć?
0
stiopan napisał(a):

Dobry skecz, ale tam jest chyba zbędny kod:

kAzek napisał(a):

WM_COMMAND:
begin
if (Message.WParamHi = BN_CLICKED) and
(Message.LParam = fMyCheckBox.Handle) then
begin
fMyCheckBox.Checked:= not fMyCheckBox.Checked;
fMyCheckBoxState:= fMyCheckBox.Checked;
end;
end;
end;
inherited;
end;

> 
> 
> Po co to jest?
> Autocheck chyba sam sobie da radę.


A może tak sprawdzisz czy VCLowy checkbox da sobie radę a później będziesz pisał bzdury? Co chcesz udowodnić? Wyższość WinApi nad VCL tak się składa że dobrze znam WinApi ale i VCL i wiem że gdzie można to zrobić szybciej pod VCL mimo że wiem że czasem (i tylko czasem) zasadne jest użycie WinApi.
0
kAzek napisał(a):

A może tak sprawdzisz czy VCLowy checkbox da sobie radę a później będziesz pisał bzdury?

Jaki VCLowy?
Nie ma VCLowych - sprawdź co masz w oknach, np. winsight'em można to zrobić.

Jest taka stara prawda ludowa:
Nie potrzeba drukować ptaka na papierze... żeby latał w polu. :)

1
stukpuk napisał(a):
kAzek napisał(a):

A może tak sprawdzisz czy VCLowy checkbox da sobie radę a później będziesz pisał bzdury?

Jaki VCLowy?
Nie ma VCLowych - sprawdź co masz w oknach, np. winsight'em można to zrobić.

Jak to nie ma jak VCLowych wszystkie wizualne komponenty Delphi są VCL niezależnie czy są to tylko obudowane w obiekt standardowe kontrolki Windows (typu Button, ListBox, Edit itd) czy jakieś nie posiadające uchwytu robione od podstaw.

0

To tak nie działać.
Wyjmij user32.dll z systema i odpal programa z tymi VCLs, i zobacz co widać.

0

Ogarnij się chcesz mi wmówić że VCL to nie VCL już wytłumaczę łopatologicznie jak stworzę sobie kontrolkę wywołując funkcję WinApi CreateWindow (CreateWindowEx) to będzie ona kontrolką Windows ale jak ją stworzę w Delphi z jakiegoś obiektu wywołując jej konstruktor to chcąc nie chcąc należy ona do VCL (mimo że jest to kontrola Windows i oczywiście pochodzi z user32 lub comctl32.dll)

0

To tak nie działać.
Wyjmij user32.dll z linuxa albo innego systema i odpal programa z tymi VCLs, i zobacz co widać.

Widzę tu nowy problem: jaki właściwie dialog należy odpalać przed wydrukiem,
bo tam są różne:

  • PrintDlg, i to jest to co tu pokazałem na starcie, ale w MSDM mówią że to jest stare i może nie działać wkrótce
  • PrintDlgEx - ten wyświetla zakładki, ale tam nie można wsadzić hookproc, lecz jakieś te interface z ole: IUnknow.
  • PageSetupDlg, ale nie wiem dokładnie do czego to ma służyć

http://msdn.microsoft.com/en-us/library/windows/desktop/ms646842%28v=vs.85%29.aspx
marginesy ustalać na stronie?
Do czego to ma służyć?

Przecież gdy mam ten device context, np. hdc = CreateDC(driver, itd.),
wtedy interesują mnie tylko rozmiary, i np. w pikselach:

dx = GetDeviceCaps(hdc, HORZRES), albo w milimetrach, i rozdzielczość podobnie wyznaczam.

I nie ma tu żadnych marginesów: drukujemy od 0 do dx,
a obiekty drukowane, np. obrazek, użytkownik ustawiał sobie odpowiednio, np. x,y = 1cm, 1cm,
co sobie przeliczamy na pixele i cześć.

1 użytkowników online, w tym zalogowanych: 0, gości: 1