Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi [nonVCL]Bildschirmschoner Vorschau verschieben & schließen (https://www.delphipraxis.net/114965-%5Bnonvcl%5Dbildschirmschoner-vorschau-verschieben-schliessen.html)

rollstuhlfahrer 3. Jun 2008 15:51


[nonVCL]Bildschirmschoner Vorschau verschieben & schließ
 
Liste der Anhänge anzeigen (Anzahl: 3)
HI,

ich hab mich mal daran gemacht, einen Bildschirmschoner per nonVCL zu proggen. Schön und gut. Wenn ich das Fenster "Eigenschaften von Anzeige" verschiebe, so wandert der nonVCL-Bildschirmschoner nicht mit. Der, der auf VCL aufsetzt, schon. Wenn ich jetzt das Fenster "Eigenschaften von Anzeige" schließe, bleibt der Bildschirmschoner immernoch online. Im Anhang mal 3 Screenshots.

Wie kann ich
1. das Fenster so mitbewegen, dass es "mitläuft" und
2. das Fenster rechtzeitig beenden?


Ich glaub die Fragen haben etwas gemein, nämlich dass ein Event nicht richtig behandelt wird

Codeausschnitt:
Delphi-Quellcode:
// Window-Prozedur
function WndProc(hWnd: HWND; uMsg: UINT; wParam: wParam; lParam: LParam): lresult; stdcall;
begin
  Result := 0;
  case uMsg of
    WM_DESTROY:   WMDestroy(hWnd);  // Timer löschen und PostQuitMessage();
    WM_CREATE:    hTimer := WMCreate(hWnd); // Timer erstellen
    WM_CLOSE:     PostQuitMessage(0);

    WM_TIMER:     WMTimer(hWnd); // Timer zum neuzeichnen
  else
    Result := DefWindowProc(hWnd, uMsg, wParam, lParam);
  end;
end;

// Preview-Main
procedure PreView;
var
  parentwindow: HWND;
  Rec: TRect;
begin
Window.hbrBackground := CreateSolidBrush(RGB(0, 0, 0));
Window.hInstance := hInstance;
Window.hIcon := LoadIcon(hInstance,MAKEINTRESOURCE(100));
Window.hCursor := LoadCursor(0, IDC_ARROW);
Window.lpszClassName := ClassName;
Window.lpfnWndProc := @WndProc;
RegisterClassEx(Window);

parentwindow := StrToIntDef(ParamStr(2), 0);
GetWindowRect(parentwindow, Rec);
Width := Rec.Right - Rec.Left;
Height := Rec.Bottom - Rec.Top;

CreateWindowEx(0, ClassName, AppName,
    WS_VISIBLE or WS_CHILD or WS_POPUP,
    Rec.Left, Rec.Top, Width, Height,
    parentwindow, 0, hInstance, nil);

// [...] weiter mit nachrichtenschleife
end;
Bernhard

lbccaleb 3. Jun 2008 15:57

Re: [nonVCL]Bildschirmschoner Vorschau verschieben & sch
 
schau mal hier, das gute template vom turboPASCAL, denk mal das kann dir da weiter helfen ;-)

bildschirm schoner template

turboPASCAL 3. Jun 2008 17:14

Re: [nonVCL]Bildschirmschoner Vorschau verschieben & sch
 
Zitat:

Zitat von lbccaleb
schau mal hier, das gute template vom tuboPASCAL ...

Wir wollen doch die Sache beim Namen nennen.
;)

Auf den selbigen wollte ich nach dem lesen des Beitrags gerade auch verweisen. :mrgreen:

SirThornberry 3. Jun 2008 17:18

Re: [nonVCL]Bildschirmschoner Vorschau verschieben & sch
 
für mich klingt es einfach nur danals das der parent nicht wirklich gesetzt wurde.

lbccaleb 3. Jun 2008 17:39

Re: [nonVCL]Bildschirmschoner Vorschau verschieben & sch
 
Zitat:

Zitat von turboPASCAL
Zitat:

Zitat von lbccaleb
schau mal hier, das gute template vom tuboPASCAL ...

Wir wollen doch die Sache beim Namen nennen.
;)

Auf den selbigen wollte ich nach dem lesen des Beitrags gerade auch verweisen. :mrgreen:

ohh sorry, sicher doch turboPASCAL oben geändert^^

rollstuhlfahrer 3. Jun 2008 20:02

Re: [nonVCL]Bildschirmschoner Vorschau verschieben & sch
 
Auf das Beispiel von turboPascal bin ich schon gestoßen. (Habs auch grad noch offen)
Das handle wird genauso wie im Beispiel (siehe Codeausschnitt) zugewiesen.

Immerhin hab ich das programm jetzt soweit bekommen, dass essich gleichzeitig beendet. Der Vorschau-Bildschirm bleibt aber schwarz

Bernhard

rollstuhlfahrer 4. Jun 2008 14:04

Re: [nonVCL]Bildschirmschoner Vorschau verschieben & sch
 
HI,

ich hab mitlerweile die Fensterklasse gewechselt, CreateWindowEx und CreateWindow ausprobiert. Problem ist: sobald als Stil WS_Popup dazukommt, wird die Vorschau angezeigt, ist es nicht dabei, wird die vorschau nicht angezeigt, aber entsprechend geschlossen. Weil ich nicht weiterkomme, häng ich den bisherigen Code an.

Delphi-Quellcode:
unit PreViewU;

interface

uses
  Windows,
  Messages,
  globals, // width, heigth, classname, appname
  MySysUtils; // IntTostr, StrToInt, Uppercase, strtointdef
//  CommCtrl;

var
  hTimer: HWND;
(*  Window: TWndClassEx = (
    cbSize         : SizeOf(TWndClassEx);
//    Style          : CS_HREDRAW or CS_VREDRAW;
    Style          : CS_VREDRAW or CS_HREDRAW or CS_SAVEBITS or CS_DBLCLKS;
//    lpfnWndProc    : @WndProc;
    cbClsExtra     : 0;
    cbWndExtra     : 0;
    hbrBackground  : COLOR_APPWORKSPACE;
    lpszMenuName   : nil;
    lpszClassName  : ClassName;
    hIconSm        : 0;
  );                             *)
  Window: TWndClass;
  Msg: TMsg;
  Width, Height: Integer;

procedure PreView;

implementation

// Create-Event
function WMCreate(hWnd: HWND): HWND;
begin
// Aus der TaskBar bannen
(*SetWindowLong(hWnd, GWL_EXSTYLE,
              GetWindowLong(hWnd, GWL_EXSTYLE)
              or WS_EX_TOOLWINDOW and not WS_EX_APPWINDOW);       *)

// Timer erstellen
Result := SetTimer(hWnd, IDC_TIMER, 1, nil);
end;

// Timer-Event
procedure WMTimer(hWnd: HWND);
var dc: HDC;
    Brush: HBRUSH;
    Color: COLORREF;
begin
dc := GetDC(hWnd);
if dc = 0 then MessageBox(0, 'Kein DC-Objekt', 'FEHLER', mb_iconwarning);
(*Inc(r);
TextOut(dc, 10, 10, PChar(IntToStr(r)), 3);
brush := CreateSolidBrush(RGB(r, 255, 255));
SelectObject(dc, brush);
SetBkColor(dc, RGB(r, 255, 255));*)

Color := RGB(Random(255), Random(255), Random(255));
Brush := CreateSolidBrush(Color);
FillRect(dc, Rect(0, 0, WindowWidth, WindowHeight), Brush);
ReleaseDC(hWnd, dc);
end;

// Fenster wird geschlossen
procedure WMDestroy(hwnd: HWND);
begin
KillTimer(hwnd, IDC_Timer);
ShowCursor(true);
PostQuitMessage(0);
end;

// Window-Prozedur
function WndProc(hWnd: HWND; uMsg: UINT; wParam: wParam; lParam: LParam): lresult; stdcall;
begin
  Result := 0;
  case uMsg of
    WM_DESTROY:   WMDestroy(hWnd);
    WM_CREATE:    hTimer := WMCreate(hWnd);
    WM_CLOSE:     PostQuitMessage(0);

    WM_TIMER:     WMTimer(hWnd);
  else
    Result := DefWindowProc(hWnd, uMsg, wParam, lParam);
  end;
end;

// Screensaver-Main
procedure PreView;
var
  parentwindow: HWND;
  apphwnd: HWND;
  Rec: TRect;
begin
Window.style := CS_VREDRAW or CS_HREDRAW or CS_SAVEBITS or CS_DBLCLKS;
Window.lpfnWndProc := @WndProc;
Window.cbClsExtra := 0;
Window.cbWndExtra := 0;
Window.hInstance := HInstance;
Window.hIcon := LoadIcon(hInstance,MAKEINTRESOURCE(100));
Window.hCursor := LoadCursor(0, IDC_ARROW);
Window.hbrBackground := GetStockObject(BLACK_BRUSH);
Window.lpszMenuName := nil;
Window.lpszClassName := ClassName;

(*Window.hbrBackground := GetStockObject(BLACK_BRUSH);
Window.hInstance := hInstance;
Window.hIcon := LoadIcon(hInstance,MAKEINTRESOURCE(100));
Window.hCursor := LoadCursor(0, IDC_ARROW);
Window.lpszClassName := ClassName;
Window.lpfnWndProc := @WndProc;
RegisterClassEx(Window);       *)
RegisterClass(Window);

parentwindow := StrToIntDef(ParamStr(2), 0);

GetWindowRect(parentwindow, Rec);
Width := Rec.Right - Rec.Left;
Height := Rec.Bottom - Rec.Top;

CreateWindowEx(0, ClassName, AppName,
    WS_VISIBLE or WS_CHILD,
    Rec.Left, Rec.Top, Width, Height,
    parentwindow, 0, hInstance, nil);

(*Apphwnd := CreateWindow(
        ClassName,
        AppName,
        WS_VISIBLE or WS_Child,
        Rec.Left,
        Rec.Top,
        Width,
        Height,
        parentwindow,
        0,
        hInstance,
        nil);

if GetParent(apphwnd) <> parentwindow then
begin
  MessageBox(0, 'Parent nicht zugewiesen', 'FEHLER', MB_ICONSTOP);
  SetParent(apphwnd, parentwindow);
end;          *)

{Nachrichtenschleife starten}
while GetMessage(msg,0,0,0) do
begin
  TranslateMessage(msg);
  DispatchMessage(msg);
end;
end;

end.
Bernhard


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:01 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz