Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Win32 non-Vcl ein zweites Window Modal und Umlaute Frage (https://www.delphipraxis.net/196500-win32-non-vcl-ein-zweites-window-modal-und-umlaute-frage.html)

EWeiss 25. Mai 2018 22:28

AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
 
Zitat:

Zitat von Luckie (Beitrag 1403019)
Ich meine, ich habe das mit zwei Fenstern in meinen Tutorials abgehandelt.

Jo! ;)
1.1.7. Zwei Fenster erzeugen
Zitat:

Das komplette Beispiel für zwei Fenster finden Sie bei den Demos.
Nochmal der link
http://www.michael-puff.de/Programmi...lphi_Demos.zip
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

Luckie 25. Mai 2018 22:36

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.

EWeiss 25. Mai 2018 22:37

AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
 
Zitat:

Zitat von Luckie (Beitrag 1403021)
Die Frage ist nur, ob auch modal. Da bin ich mir nicht mehr sicher. Abe rim XP Usermanger hab eich modale Fenster benutzt. Und der ist Opensource.

Doch ist modal ;)

Nun der ist wohl zu kompliziert für ihn im Moment.
Artet nur in einer Copy\Paste Orgie aus.

gruss

KodeZwerg 25. Mai 2018 23:22

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!

KodeZwerg 25. Mai 2018 23:26

AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
 
Zitat:

Zitat von Luckie (Beitrag 1403021)
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.

Jetzt habe ich Dich glatt überlesen, Danke, den hab ich auch schon irgendwo gesehn bestimmt auch geladen.
Das ist eine Super Idee da mal reinzuschaun, Danke!

EWeiss 25. Mai 2018 23:47

AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
 
Zitat:

Es erstellt kein Modal Fenster
Wenn das dein einziges Problem ist?
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:

Vielen Dank an EWeiss für den "mit den Gesicht ins Ziel drücken" Link, das tat gut!!!
Na ja ist für mich einfacher als dir alles vorzukauen ;)
Zumal da ich ganz andere Wege beschreite als das Luckie tut.

gruss

KodeZwerg 26. Mai 2018 00:25

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.

EWeiss 26. Mai 2018 01:13

AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
 
Zitat:

Ist DestroyWindow() das richtige Mittel um das Fenster zu schließen oder sollte da ein anderer Befehl hin?
Ist ok.. kommt halt auf das Fenster an das man erstellt ;)
Bei Dialogen zum Beispiel würde ich EndDialog verwenden.
https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx

Aber nicht verwechseln mit CreateDialogIndirectParam
dieser Dialog ist nicht MODAL deshalb musst du auch hier DestroyWindow verwenden.
https://msdn.microsoft.com/en-us/lib...=vs.85%29.aspx

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:
                 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
erstelle zuerst das zweite Fenster dann deaktiviere das erste.
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

KodeZwerg 26. Mai 2018 01:36

AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
 
Zitat:

Zitat von EWeiss (Beitrag 1403031)
Bei Dialogen zum Beispiel würde ich EndDialog verwenden.

Hey, das ist ein toller Tipp wenn ich Dialoge aus Resource nutze, Danke!
Zitat:

Zitat von EWeiss (Beitrag 1403031)
in WM_CREATE der zweiten Winproc
erstelle zuerst das zweite Fenster dann deaktiviere das erste.

Jetzt wo Du es sagst, das ergibt mehr Sinn, Danke!


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!

EWeiss 26. Mai 2018 01:41

AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
 
Zitat:

Jetzt wo Du es sagst, das ergibt mehr Sinn, Danke!
Habe es nochmal aktualisiert.
So ist es dann der letzte Vorgang im alten Fenster danach passiert ja nichts mehr und du hast alles abgearbeitet.

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:01 Uhr.
Seite 2 von 3     12 3      

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