![]() |
Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe eine Demo gefunden was es einem sehr einfach macht "schnell mal" eine non-Vcl zu basteln, ein gutes Template hier aus dem Forum.
Was in dem Source steht ist für mich auch alles nachvollziehbar, soweit so gut. Nun wollte ich den Source erweitern, mit einem "Über" Knopf und demzufolge auch einem zweiten Window. Hierzu habe ich noch gar keine Erfahrung sammeln können. Nach dem kompilieren stellte ich fest das der Source noch nicht deutsch kompatibel ist, das "Ü" von "Über" wird falsch dargestellt. Kann mir jemand der sich damit auskennt helfen diese zwei Sachen zu erledigen? Im Anhang ist der komplette Source und ein Kompilat. Ps: Dieses non-Vcl basiert auf Code und nicht auf einen Resource Dialog. |
AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
Also wenn du mit WideChars arbeiten willst solltest du es auch verwenden.
CreateWindowEx zu CreateWindowExW Das!
Delphi-Quellcode:
WinMain(hInstance, System.hPrevInst, System.CmdLine, System.CmdShow);
ist veraltet verwende statt dessen
Delphi-Quellcode:
WinMain(hInstance, 0, nil, 0);
gruss |
AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
2 Anmerkungen
Ist D2009 die Delphi Version die du einsetzt? Der Source von uMain ist als UTF8 gespeichert. Ändere das auf Ansi dann kommt auch Dein Ü Alte Delphi Versionen hatten da öfter Schluckauf. Und überprüfe mal Deine wItems...... Du produzierst ein Speicherleck und die Font Zuweisung funktioniert so auch nicht ..... |
AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
Zitat:
Zitat:
gruss |
AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
Könnte es daran liegen dass der Sourcecode als Kodierung UTF-8 verwendet (laut Notepad++), und der Compiler den UTF-8 kodierten Windownamen dann vermutlich so wie er ist in der EXE Datei ablegt? Dann wird zur Laufzeit ein UTF-8 kodierter Text übergeben, wo LPCTSTR erwartet wird.
|
AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
Zitat:
|
AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
Zitat:
Zitat:
Zitat:
Delphi-Quellcode:
wItems[0] := CreateWindowEx(0, 'BUTTON', 'Beenden', WS_VISIBLE or WS_CHILD, 220, 130, 75, 25, hWnd, IDC_BTN_EXIT, hInstance, nil);
wItems[1] := CreateWindowEx(0, 'BUTTON', 'Über', WS_VISIBLE or WS_CHILD, 220, 100, 75, 25, hWnd, IDC_BTN_ABOUT, hInstance, nil); wItems[2] := CreateWindowEx(0, 'STATIC', '', WS_VISIBLE or WS_CHILD or SS_BITMAP, 20, 20, 32, 32, hWnd, IDC_STC_BMP, hInstance, nil); SendMessage(wItems[2], STM_SETIMAGE, IMAGE_BITMAP, INTEGER( Umlautproblem gelöst!:thumb::thumb::thumb: Zu meinem Delphi, ich nutze Version 2009, die Resourcen lagen dem Beispiel bei. Wenn mir jemand bitte noch helfen kann das ich mit diesem Code noch ein zweites Modalfenster öffnen kann, das wäre sehr hilfreich! |
AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
Liste der Anhänge anzeigen (Anzahl: 1)
Damit ihr seht woran es bei mir scheitert, hier mein 2 Fenster Kompilat plus Source.
Problem: Zweites Fenster ist nicht Modal. Beendet man zweites Fenster stirbt erstes Fenster und Programm ist Tot, nurnoch über Taskmanager zu beenden. Das ich Sachen total falsch mache ist mir schon klar, nur weiß ich noch nicht wie es korrekt sein müsste. |
AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
Zitat:
Da ist doch alles was du begehrst. Warum das Rad neu erfinden. Da du so gut in Englisch bist ![]() gruss |
AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
Ich meine, ich habe das mit zwei Fenstern in meinen Tutorials abgehandelt.
|
AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
Zitat:
1.1.7. Zwei Fenster erzeugen Zitat:
![]() Das in dem Archiv enthaltende Demo Win32API_Delphi_Demos\Samples\WindowsUI\Window\Two Windows.dproj Noch einfacher geht es nicht. @Luckie Ich mache Reklame für dich ;) gruss |
AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
Die Frage ist nur, ob auch modal. Da bin ich mir nicht mehr sicher. Aber im XP Usermanger habe ich modale Fenster/Dialoge benutzt. Und der ist Opensource. Vielleicht da mal gucken.
|
AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
Zitat:
Nun der ist wohl zu kompliziert für ihn im Moment. Artet nur in einer Copy\Paste Orgie aus. gruss |
AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage <GELÖST>
Das Example was Du da sagst ist auf jeden Fall besser als nichts!
Es erstellt kein Modal Fenster, man kann jederzeit zum Hauptfenster um noch eins und noch eins und noch eins zu erstellen. Ich lese mich da mal rein da es zumindest mehr als ein Fenster kann :thumb: Das PDF habe ich von diesem Server aber mit den Erklärungen darin für Fenster, um ein zweites zu erstellen fehlt da was bzw konnte ich es alleine nicht hinbiegen, man siehts ja im Zip. Vielen Dank an EWeiss für den "mit den Gesicht ins Ziel drücken" Link, das tat gut!!! Und logischerweise auch an Luckie für die Arbeit und das bereitstellen mit all den Dingen, das ist nicht selbstverständlich!! Ich verdaue das alles erst mal, wenn ich mehr Hilfe brauche lasse ich es Euch Wissen, Danke an alle! |
AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
Zitat:
Das ist eine Super Idee da mal reinzuschaun, Danke! |
AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
Zitat:
Verhindere einfach dass das darunter liegende Fenster aktiv ist. Also ein einfaches
Delphi-Quellcode:
EnableWindow(ParentWindow, false);
aber vergesse nicht es wieder einzuschalten wenn du das 2 Window schließt.
Delphi-Quellcode:
EnableWindow(ParentHandle, True);
bzw. Das Sample ist modal denn das zweite Fenster liegt über dem Parent und bleibt auch drüber. Du musst halt nur dafür sorgen das dein Parent nicht aktiviert werden kann. Zitat:
Zumal da ich ganz andere Wege beschreite als das Luckie tut. gruss |
AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
So hab ich es jetzt momentan, es macht genau das was ich wollte.
Vielen Dank nochmal!! Ist DestroyWindow() das richtige Mittel um das Fenster zu schließen oder sollte da ein anderer Befehl hin?
Delphi-Quellcode:
{******************************************************************************}
{ } { TwoWindows } { } { Copyright (c) 2001 Michael Puff } { www.luckie-online.de } { mpuff@luckie-online.de } { } {******************************************************************************} program TwoWindows; {$R resource.res} uses Windows, Messages; const ClassName1 = 'Wnd1Class'; ClassName2 = 'Wnd2Class'; Window1Name = 'Window 1'; Window2Name = 'Window 2'; WindowWidth1 = 500; WindowHeight1 = 400; WindowWidth2 = 300; WindowHeight2 = 200; IDC_BUTTON1 = 1; var hWnd1: DWORD; hWnd2: DWORD; hwndButton1: DWORD; {Fensterfunktion für Fenster 1} function Wnd1Proc(_hWnd1: HWND; uMsg: UINT; wParam: wParam; lParam: LParam): lresult; stdcall; var x, y : integer; begin Result := 0; case uMsg of WM_CREATE: begin {Fenster zentrieren} x := GetSystemMetrics(SM_CXSCREEN); y := GetSystemMetrics(SM_CYSCREEN); MoveWindow(_hWnd1, (x div 2) - (WindowWidth1 div 2), (y div 2) - (WindowHeight1 div 2), WindowWidth1, WindowHeight1, true); hwndButton1 := CreateWindowEx(0, 'BUTTON', 'Klick mich', WS_CHILD or WS_VISIBLE, 200, 160, 100, 25, _hWnd1, IDC_BUTTON1, hInstance, nil); end; WM_COMMAND: begin if hiword(wParam) = BN_CLICKED then case loword(wParam) of IDC_BUTTON1: {Fenster 2 erzeugen und anzeigen} begin EnableWindow(_hWnd1, false); hwnd2 := CreateWindowEx(0, ClassName2, Window2Name, WS_OVERLAPPEDWINDOW or WS_VISIBLE, 40, 10, 300, 200, _hWnd1, 0, hInstance, nil); end; end; end; WM_DESTROY: begin PostQuitMessage(0); end; else Result := DefWindowProc(_hWnd1, uMsg, wParam, lParam); end; end; {Fensterfunktion für Fenster 2} function Wnd2Proc(_hWnd2: HWND; iMsg: UINT; wParam: wParam; lParam: LParam): lresult; stdcall; var x, y : integer; begin Result := 0; case iMsg of WM_CREATE: begin {Fenster zentrieren} x := GetSystemMetrics(SM_CXSCREEN); y := GetSystemMetrics(SM_CYSCREEN); MoveWindow(_hWnd2, (x div 2) - (WindowWidth2 div 2), (y div 2) - (WindowHeight2 div 2), WindowWidth2, WindowHeight2, true); end; WM_CLOSE: begin EnableWindow(hWnd1, True); DestroyWindow( _hWnd2 ); end; else Result := DefWindowProc(_hWnd2, iMsg, wParam, lParam); end; end; {WindowStruktur für beide Fenster} var wc: TWndClassEx = ( cbSize : SizeOf(TWndClassEx); Style : CS_HREDRAW or CS_VREDRAW; lpfnWndProc : @Wnd1Proc; //Fensterfunktion für Fenster 1 cbClsExtra : 0; cbWndExtra : 0; hbrBackground : COLOR_APPWORKSPACE; lpszMenuName : nil; lpszClassName : ClassName1; //Klassenname für Fenster 1 hIconSm : 0; ); msg: TMsg; begin {Struktur mit Infos für Fenster 1 füllen} wc.hInstance := hInstance; wc.hIcon := LoadIcon(hInstance,MAKEINTRESOURCE(100)); wc.hCursor := LoadCursor(0, IDC_ARROW); {Fenster 1 registrieren} RegisterClassEx(wc); {Fenste 1 erzeugen und hWnd1 zuweisen} hWnd1 := CreateWindowEx(0, ClassName1, Window1Name, WS_VISIBLE or WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WindowWidth1, WindowHeight1, 0, 0, hInstance, nil); {Struktur mit Infos für Fenster 2 füllen} wc.hInstance := hInstance; wc.lpfnWndProc := @Wnd2Proc; //Fensterfunktion für Fenster 2 wc.hIcon := LoadIcon(0, IDI_INFORMATION); wc.hCursor := LoadCursor(0, IDC_ARROW); wc.lpszClassName := ClassName2; //Klassenname für Fenster 2 {Fenster 2 registrieren} RegisterClassEx(wc); while GetMessage(msg,0,0,0) do begin TranslateMessage(msg); DispatchMessage(msg); end; ExitCode := msg.wParam; end. |
AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
Zitat:
Bei Dialogen zum Beispiel würde ich EndDialog verwenden. ![]() Aber nicht verwechseln mit CreateDialogIndirectParam dieser Dialog ist nicht MODAL deshalb musst du auch hier DestroyWindow verwenden. ![]() Das hier
Delphi-Quellcode:
EnableWindow(_hWnd1, false);
besser hier hin. in WM_CREATE der zweiten Winproc besser noch in der Funktion wo das neue Window erstellt wird. anstelle das..
Delphi-Quellcode:
EnableWindow(_hWnd1, false);
hwnd2 := CreateWindowEx(0, ClassName2, Window2Name, WS_OVERLAPPEDWINDOW or WS_VISIBLE, 40, 10, 300, 200, _hWnd1, 0, hInstance, nil);
Delphi-Quellcode:
erstelle zuerst das zweite Fenster dann deaktiviere das erste.
hwnd2 := CreateWindowEx(0, ClassName2, Window2Name,
WS_OVERLAPPEDWINDOW or WS_VISIBLE, 40, 10, 300, 200, _hWnd1, 0, hInstance, nil); // erste erstellen EnableWindow(_hWnd1, false); // dann deaktivieren So wie du es machst könnte es zu einem Deadlock führen.. (Muss nicht, je nach dem was man im alten Fenster dann noch abarbeiten muss) gruss |
AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
Zitat:
Zitat:
Damit ist für mich ein cooles Template entstanden für zwei Hobbyprojekte, bei einem weiß ich nicht ob ichs verteilen darf beim anderen handelt es sich um eine detailierte WhoIs Abfrage, das stelle ich bald vor da ich in DP irgendwie nur nicht funktionierende Programme dazu hier fand. Vielen Dank an alle die sich die Zeit zum helfen nahmen! |
AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
Zitat:
So ist es dann der letzte Vorgang im alten Fenster danach passiert ja nichts mehr und du hast alles abgearbeitet. gruss |
AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
Zitat:
Von daher glaube ich schon das im WM_CREATE des zweiten Window das erste Window erst deaktiviert werden müsste oder irre ich mich da? Das war es als ich meinte das es Sinn ergibt, nun machst Du meine heile Welt kaputt *schmunzel* Das ist jetzt mein momenter Template Hauptteil, muss nur noch Positionen der Buttons anpassen.
Delphi-Quellcode:
{Fensterfunktion für Fenster 1}
function Wnd1Proc(hWnd1: HWND; uMsg: UINT; wParam: wParam; lParam: LParam): lresult; stdcall; var x, y : integer; begin Result := 0; case uMsg of WM_CREATE: begin {Fenster zentrieren} x := GetSystemMetrics(SM_CXSCREEN); y := GetSystemMetrics(SM_CYSCREEN); MoveWindow(hWnd1, (x div 2) - (Window1Width div 2), (y div 2) - (Window1Height div 2), Window1Width, Window1Height, true); hwndBtnExit := CreateWindowEx(0, 'BUTTON', 'Beenden', WS_CHILD or WS_VISIBLE, 200, 300, 100, 25, hWnd1, IDC_BTNEXIT, hInstance, nil); hwndBtnAbout := CreateWindowEx(0, 'BUTTON', 'Über', WS_CHILD or WS_VISIBLE, 200, 160, 100, 25, hWnd1, IDC_BTNABOUT, hInstance, nil); end; WM_COMMAND: begin if HiWord(wParam) = BN_CLICKED then case LoWord(wParam) of IDC_BTNEXIT: SendMessage(hWnd1, WM_CLOSE, 0, 0); IDC_BTNABOUT: {Fenster 2 erzeugen und anzeigen} begin hWndAbout := CreateWindowEx(0, ClassName2, Window2Name, WS_OVERLAPPEDWINDOW or WS_VISIBLE, 40, 10, 300, 200, hWnd1, 0, hInstance, nil); end; end; end; WM_DESTROY: begin PostQuitMessage(0); end; else Result := DefWindowProc(hWnd1, uMsg, wParam, lParam); end; end; {Fensterfunktion für Fenster 2} function Wnd2Proc(hWnd2: HWND; iMsg: UINT; wParam: wParam; lParam: LParam): lresult; stdcall; var x, y : integer; begin Result := 0; case iMsg of WM_CREATE: begin EnableWindow(hWndMain, false); {Fenster zentrieren} x := GetSystemMetrics(SM_CXSCREEN); y := GetSystemMetrics(SM_CYSCREEN); MoveWindow(hWnd2, (x div 2) - (Window2Width div 2), (y div 2) - (Window2Height div 2), Window2Width, Window2Height, true); hwndBtnExit := CreateWindowEx(0, 'BUTTON', 'Beenden', WS_CHILD or WS_VISIBLE, 100, 100, 100, 25, hWnd2, IDC_BTNEXIT, hInstance, nil); end; WM_COMMAND: begin if HiWord(wParam) = BN_CLICKED then case LoWord(wParam) of IDC_BTNEXIT: SendMessage(hWnd2, WM_CLOSE, 0, 0); end; end; WM_CLOSE: begin EnableWindow(hWndMain, True); DestroyWindow(hWnd2); end; else Result := DefWindowProc(hWnd2, iMsg, wParam, lParam); end; end; |
AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
Zitat:
Und wo bekommt beim erstellen des neuen Fensters das alte den Focus wenn es sich erst danach selbst deaktiviert? Es hat diesen bereits (Dein Button auf dem du klickst) und zwar solange bis das neue erstellt wird\wurde. Du must das eigene Fenster aus der Funktion deaktivieren wo du das neue Window erstellst aber nicht vorher (vorher = Deadlock) je nach dem was du danach noch tun willst und das Fenster es nicht kann weil deaktiviert sondern nach dem erstellen und EnableWindow die letzte Aktion ist die im ButtonClick Event ausgeführt wird. ... Ok mach wie du es willst. EDIT: Beispiel. Du klickst auf Button und erstellst ein neues Fenster. In dem Fenster das erstellt wird deaktivierst du das ParentWindow. Jetzt möchte ich aber im ParentWindow was das neue Fenster erstellt noch etwas zeichnen nach dem das neue Fenster erstellt wurde. Nun.. Was denkst du zeichnet sich dann noch nachdem du das Fenster von außerhalb deaktiviert hast? Klassischer Todesstoß gruss |
AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
Nebenbei.. das ist auch nicht richtig.
Delphi-Quellcode:
CW_USEDEFAULT.. DWORD <> Integer. Du verletzt die untere Grenze.
{Fenste 1 erzeugen und hWnd1 zuweisen}
hWnd1 := CreateWindowEx(0, ClassName1, Window1Name, WS_VISIBLE or WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WindowWidth1, WindowHeight1, 0, 0, hInstance, nil); entweder die Konstanten ganz weg lassen also mit 0 ersetzen oder aber zu integer konvertieren. gruss |
AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
Zitat:
Delphi-Quellcode:
Habe das so abgeändert, korrekt oder völlig falsch?
{Fenste 1 erzeugen und hWnd1 zuweisen}
hWndMain := CreateWindowEx(0, ClassName1, Window1Name, WS_VISIBLE or WS_OVERLAPPEDWINDOW, Integer(CW_USEDEFAULT), Integer(CW_USEDEFAULT), Window1Width, Window1Height, 0, 0, hInstance, nil); |
AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
Zitat:
Ja, ja der EWeiss ist mit nichts zugfrieden.
Delphi-Quellcode:
LOL :)
{Fenste 1 erzeugen und hWnd1 zuweisen}
hWnd1 := CreateWindowEx(0, ClassName1, Window1Name, WS_VISIBLE or WS_OVERLAPPEDWINDOW, LPARAM(CW_USEDEFAULT), LPARAM(CW_USEDEFAULT), WindowWidth1, WindowHeight1, 0, 0, hInstance, nil); gruss |
AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
Danke fürs Aufpassen und Deine Hilfe dabei!
Nachtrag, Integer() mit LPARARM() ersetzt, kannst Du mir auch den Unterschied dabei sagen, das Versteh ich gerade irgendwie nicht so ganz? Als Du sagtest "Du verletzt die untere Grenze." weil Integer gefordert wird, dachte ich, naiv wie ich bin, Caste ich mir den als Integer. LPARARM ist für mich gleichzusetzen wie ein LongWord also ein cast ala LongWord(CW_USEDEFAULT) |
AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
Zitat:
LPARAM ist bei mir immer noch INT_PTR. INT_PTR = Integer; LongWord := 0..4294967295; Minus Bereiche ausgeschlossen deshalb Verletzung der Untergrenze. Integer := -2147483648..2147483647 gruss |
AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
Vielleicht bringe ich da auch etwas durcheinander. War nicht LParam = 32bit LongWord und wParam = 16bit Word. Ich bin da bestimmt nicht auf dem aktuellen Stand der Dinge.
Hab gerade mal in Delphi geschaut, LParam ergibt ein Interger, jupp! Deine Erklärung reicht mir völlig aus, Vielen Dank dafür, ich aktualisiere mich mal selbst ^_^ edit Ps: Deswegen hatte ich es ja Gedanklich erst nicht Verstanden, weil ich da LParam mit LongWord irgendwie verankert hatte was ja keinen Negativ-Wert zulässt wo ich dann wieder bei "Du verletzt die untere Grenze." wäre. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:28 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-2025 by Thomas Breitkreuz