![]() |
[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:
Bernhard
// 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; |
Re: [nonVCL]Bildschirmschoner Vorschau verschieben & sch
schau mal hier, das gute template vom turboPASCAL, denk mal das kann dir da weiter helfen ;-)
![]() |
Re: [nonVCL]Bildschirmschoner Vorschau verschieben & sch
Zitat:
;) Auf den selbigen wollte ich nach dem lesen des Beitrags gerade auch verweisen. :mrgreen: |
Re: [nonVCL]Bildschirmschoner Vorschau verschieben & sch
für mich klingt es einfach nur danals das der parent nicht wirklich gesetzt wurde.
|
Re: [nonVCL]Bildschirmschoner Vorschau verschieben & sch
Zitat:
|
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 |
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:
Bernhard
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:07 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz