Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Titelleiste eines Fensters ausblenden (https://www.delphipraxis.net/10203-titelleiste-eines-fensters-ausblenden.html)

graphicar 29. Jul 2004 18:46

Re: Titelleiste eines Fensters ausblenden
 
Es geht speziell um die Zeile:


Delphi-Quellcode:
SetWindowLong (HMainWnd, GWL_STYLE, GetWindowLong (HMainWnd, GWL_STYLE) and not WS_CAPTION);
Du hast die Schlüsselwörter and not verwendet. Dies ergibt nur Schmarn.
Wenn du aber nur or anwendest, kommt eine klare Ausführung zu Stande.

Delphi-Quellcode:
SetWindowLong (HMainWnd, GWL_STYLE, GetWindowLong (HMainWnd, GWL_STYLE) or WS_CAPTION);
Cii jaa©$me
graphicar

Niko 29. Jul 2004 19:52

Re: Titelleiste eines Fensters ausblenden
 
Hi,

wenn ich or verwende füge ich die Konstante (bzw. das entsprechende Bit) ja hinzu. Da ich WS_CAPTION aber entfernen will muss ich doch and not verwenden.

(Verbessert mich bitte wenn ich hier falsch liege!)

SirThornberry 29. Jul 2004 20:01

Re: Titelleiste eines Fensters ausblenden
 
muss ich niko recht geben, mit "and not" sollten die Bits eigentlich entfernt werden..

Luckie 29. Jul 2004 23:27

Re: Titelleiste eines Fensters ausblenden
 
Zitat:

Zitat von Niko
@Luckie:
So funktioniert's, wenn ich aber WS_POPUP weggelassen habe ging es nicht mehr und ich weiß nicht, warum.

Nun ja, was soll ich dazu sagen. WS_POPUP hat eben den Effekt, den du wünscht. Damit erreichst du doch dein Ziel. Was willst du mehr? Das verstehe ich jetzt nicht ganz. :gruebel:

graphicar 30. Jul 2004 11:19

Re: Titelleiste eines Fensters ausblenden
 
Hmm, das ärgert mich aber langsam. Eurer and not ist falsch. Ich habe
diese Nacht mit einem Studenten für Elektrotechnik und einem für
technische Informatik darüber diskutiert. Sie meinen es gibt gewisse
Vorschiften nach denen dort kein and stehen darf, bzw. muss es anders
positioniert/kombiniert werden. Eure Programme schmieren jedes Mal
ab und der Monitor macht störende Bildschirmfehler. Dennoch klammert
ihr euch immernoch an falsche Befehle. Jedem das seine.

BEISPIEL:

Hier nun ein vollständiges Beispiel, was Fensterstil-Parameter addiert
und subtrahiert. Addition mit "or" und Substration von Parametern mit
"xor". "WS_CAPTION" ist ein schlechtes Anschauungsbeispiel. Ich habe
daher als Beispiel "WS_SIZEBOX" genommen. Damit man sieht, dass die
Befehlsreihe richtig ausgeführt werden. Und jeder auf die Richtigkeit der
Befehle bauen und damit nun seine Ideen realisieren kann. "WS_SIZEBOX"
stellt die Möglichkeit dar, mit der Maus die Fenstergröße zu ändern.


Delphi-Quellcode:
[...]

// HAUTPROGRAMM.
/////////////////

var
  FormMain_hWnd : DWord;         // Handle-Variable für das Fenster.
  FormMain_style : Cardinal;      // Ausleseort für den jeweils aktuellen Fensterstil.

[...]

// Erstellung eines Standardfensters.
  FormMain_hWnd := CreateWindowEx (0, ClassName, AppName, WS_CAPTION or WS_VISIBLE or WS_SYSMENU,
                     CW_USEDEFAULT, CW_USEDEFAULT, WindowWidth, WindowHeight, 0, 0,
                     hInstance, nil);

// Akutalisierung der Stil-Variable des Fensters.
  FormMain_style := GetWindowLong(FormMain_hWnd, GWL_STYLE);

[...]

// NACHRICHTENSCHLEIFE.
////////////////////////
// Es werden zwei Buttons benötigt, die als Konstanten
// IDC_BUTTON und IDC_BUTTON2 gesetzt haben.
///////////////////////////////////////////////////

IDC_BUTTON : Begin

                // Aus dem Fensterstil wird die Eigenschaft "WS_SIZEGROUP" entfernt.
                  SetWindowLong(FormMain_hWnd, GWL_STYLE, FormMain_style xor WS_SIZEBOX);

                // Akutalisierung der Stil-Variable des Fensters.
                  FormMain_style := GetWindowLong(FormMain_hWnd, GWL_STYLE);

              End;
IDC_BUTTON2 : Begin

                // Setzung einer weiteren Fenstereigeneschaft: Fenster wird größenveränderbar.
                  SetWindowLong(FormMain_hWnd, GWL_STYLE, FormMain_style or WS_SIZEBOX);

                // Akutalisierung der Stil-Variable des Fensters.
                  FormMain_style := GetWindowLong(FormMain_hWnd, GWL_STYLE);

              End;

[...]


Mag sein, dass sich Windows bei Veränderungen von Grundparametern wie WS_CAPTION
während der Lautzeit ein wenig krumm stellt. Mag sein, dass diese Theorie nie praktisch
umsetzbar sein wird. Jedenfalls klappt mein Weg. Sekundäre Parameter lassen sich gut
damit editieren. Nehme den Tipp von Luckie, erstelle gewisse Einstellungen während der
Entwicklung und den Rest während der Laufzeit.

Cii jaa©$me
graphicar

Luckie 30. Jul 2004 11:36

Re: Titelleiste eines Fensters ausblenden
 
Also bei allen Respekt, Fensterstile habe ich bisher unter Delphi immer mit and not gelöscht und ich hatte nie Probleme. Und das es so auch richtig ist zeigt folgendes Beispiel:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Dummy: DWORD;
begin
  Dummy := WS_POPUP;
  Showmessage(IntToStr(dummy));
  Dummy := WS_POPUP or WS_CAPTION;
  Showmessage(IntToStr(dummy));
  Dummy := dummy xor WS_CAPTION;
  Showmessage(IntToStr(dummy));
end;
Zum Schluss hat dummy wieder den ursprünglichen Wert. Mit xor mag es auch gehen, aber üblicherweise löscht man in Delphi mit and not ein Bit.

Man muss nur beachten, dass man wenn die Flags schon gesetzt sind, dass man sie sich vorher mit MSDN-Library durchsuchenGetWindowLong holt und dann bei MSDN-Library durchsuchenSetwindowlong einsetzt und dann das Flag mit and not entfernt.

graphicar 30. Jul 2004 11:51

Re: Titelleiste eines Fensters ausblenden
 
Der Respekt sei dir erbracht. Gut dass du das gesagt hattest.
Bis jetzt hatte ich niemanden der einen Kommentar dafür abgab,
dass etweilger Quellcode bei ihm funktioniert hätte.

Gut, dann nehme ich natürlich meine Aussage zurück. Für alle
weiteren User die das hier lesen, verwendet [and not] oder [xor].
Falls die eine Variante nicht klappt, dann nehmt die andere.

Luckie, ich habe eine alte Delphiversion, kommen daher vielleicht
die Differenzen in der Ausführung beider Befehle? *grübel,grübel*

Cii jaa©$me
graphicar

Niko 30. Jul 2004 20:37

Re: Titelleiste eines Fensters ausblenden
 
xor und and not sind äquivalent, vorausgesetzt, dass das Bit das man entfernen möchte auch wirklich enthalten ist, sonst wird es durch xor gesetzt. Bei and not kann man sich darauf verlassen, dass es hinterher weg ist.

Code:
a := 00101000
b := 00001000


a and not b =
00101000 and not 00001000 = | Umkehren von b
00101000 and    11110111 = | überall da 1 setzen, wo in beiden Operanden 1, sonst 0
00100000


a xor b =
00101000 xor 00001000 = | überall da 1 setzen, wo in genau einem Operanden 1, sonst 0
00100000


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:04 Uhr.
Seite 2 von 2     12   

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