Entwickler-Ecke

Multimedia / Grafik - Canvas ohne Forms.pas


Delete - Di 25.06.02 21:10
Titel: Canvas ohne Forms.pas
Hey was geht?
Folgende Frage: Wie kann ich ohne dir Forms.pas in ein Fenster malen?
Ihr wisst schon was ich meine: Nur mit HWND und so... 8)

Dank im Vorraus

Shadow


Torsten - Di 25.06.02 23:15

Moinsen!

Ich habe ein Buch von Andreas Kosch mit folgendem Code.
Selber habe ich das Programm auch schon gebastelt, doch ich gebe Dir mal den Originalcode. Samt Kommentare und Co.


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
{ ****************************************************************
  Source File Name :  Generic.dpr
  Typ              :  Formular-unit
  Autor            :  Andreas Kosch
  Erstellt am      :  14.05.96
  Compiler         :  Delphi 3.0
  Betriebssystem   :  Windows 95
  Beschreibung     :  Generisches Win32-API-Programm
                      (hat Borland bei Delphi 97 anscheinend vergessen)
                      Hart - aber klein. GENERIC.EXE belegt nur
                      28 kByte auf der Festplatte - und das ohne
                      Package-DLLs !!!
  Revisionen       :  31.03.97 Ivory
                      07.06.97 Delphi 3.0 C/S
 **************************************************************** }

program Generic;

{$R GENRES.RES}

uses SysUtils, Windows, Messages;

const
  szClassName = 'DelGen';            // Name der Fensterklasse
  szTitle     = 'Das Grundgerüst';   // Fenstertitel

(* WindowProc ist die Fensterprozedur des generischen Fensters.
   Es wird nur eine einzige Windows-Botschaft ausgewertet, um
   das Programm über das Systemmenü schließen zu können. *)

function WindowProc(Window: HWnd; Message : UINT; wParam: WPARAM;
                    LParam: LPARAM): Longint; stdcall;
begin
  Result := 0;
  case Message of
    wm_Destroy: begin
                  PostQuitMessage(0); // Programm beenden
                  Exit;
                end;
  end;
  Result := DefWindowProc(Window, Message, WParam, LParam);
end;

(* Die Procedure WinMain registriert die Fensterklasse und
   erzeugt ein sichtbares Hauptfenster für das Programm. *)

procedure WinMain;
var
  aWindow     : HWnd;
  WindowClass : TWndClassEx;
  Message     : TMsg;
begin
  // InitApplication
  WindowClass.cbSize := SizeOf(TWndClassEx);
  WindowClass.Style := CS_HRedraw OR CS_VRedraw;
  WindowClass.hInstance := HInstance;
  WindowClass.lpfnWndProc := @WindowProc;
  WindowClass.cbClsExtra := 0;
  WindowClass.cbWndExtra := 0;
  WindowClass.hIcon := LoadIcon(hInstance, PChar('BIG'));
  WindowClass.hIconSm := LoadImage(hInstance, PChar('SMALL'),
                                   IMAGE_ICON, 16, 16, 0);
  WindowClass.hCursor := LoadCursor(0, idc_Arrow);
  WindowClass.hbrBackground := COLOR_WINDOW + 1;
  WindowClass.lpszMenuName := nil;
  WindowClass.lpszClassName := szClassName;
  // Rückgabewert 0 -> Fehlschlag
  if RegisterClassEx(WindowClass) = 0 then
    Halt(1);
  // InitInstance
  aWindow := CreateWindow(szClassName, szTitle, WS_OverlappedWindow,
                          CW_UseDefault, 0, CW_UseDefault, 0,
                          0, 0, HInstance, nil);
  // aWindow = 0 -> Fehlschlag
  if aWindow = 0 then
    Halt(2);
  // Aha - das Fensterhandle ist gültig -> zeigt dich !
  ShowWindow(aWindow, SW_SHOW);
  UpdateWindow(aWindow);
  // Message-Loop wartet auf das Programmende
  while GetMessage(Message, 0, 0, 0) do
  begin
    TranslateMessage(Message);
    DispatchMessage(Message);
  end;
  Halt(Message.wParam);
end;

begin
  WinMain;  // Ein sehr kurzes Hauptprogramm
end.


Grüße

Torsten


Torsten - Di 25.06.02 23:18

Ach ja, die Zeile
{$R GENRES.RES}
kannst Du auskommentieren. In der Datei befinden sich lediglich zwei Icons. Werden nicht wirklich benötigt

Grüße

Torsten


Delete - Mi 26.06.02 10:06
Titel: NEEEEIN
Das kann ich doch alles. Ich meine Wie kann ich Canvas und Bitblt und soweiter benutzen? Zumbeispiel einen Kreis in diese Form malen???


Torsten - Mi 26.06.02 10:18

Moinsen!

Sorry, da habe ich Dich wohl falsch verstanden.
Da muss ich mich selber erst einmal erkundigen.

Grüße

Torsten


mortus - Mi 26.06.02 12:10

Tach :)
du musst dir das handle des device context holen:

Quelltext
1:
2:
3:
4:
5:
6:
7:
var dc:HDC;
begin
 dc:=GetDC(handle);
 ellipse(dc,10,10,100,100);
 //bsp: bitblt(dc,0,0,windowwidth,windowheight,dctmp,0,0,srccopy);
 ReleaseDC(handle,dc);
end;


Delete - Mi 26.06.02 19:20
Titel: Danke
Yo Danke Man.
Hätte ich doch Selber drauf kommen müssen, :oops:
Aber wie ändere ich jetzt die Stift farbe und so??


mortus - Do 27.06.02 14:04


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
var
pen:HPEN;
brush:HBRUSH;
begin
 pen:=CreatePen(PS_SOLID,1,$FF0000);
 brush:=CreateSolidBrush($0000FF);
 SelectObject(dc,brush);
 {oder zb SetBKMode(dc,TRANSPARENT) wenn der kreis nicht gefuellt  
 werden soll}
 SelectObject(dc,pen);
 Ellipse(dc,10,10,100,100);
 DeleteObject(pen);
 DeleteObject(brush);
end;


man sollte auch die handle der alten pens, brushes speichern.
schau dir dazu am besten mal die hilfe (Platform SDK) an.