Autor |
Beitrag |
Popov
Gast
Erhaltene Danke: 1
|
Verfasst: Do 23.01.03 03:34
Natürlich meine ich hier die API Variante. Was ich habe ist das Fensterhandle. Jetzt würde ich gerne wissen ob es ein Dialogfenster ist.
Kennt einer so eine Funktion.
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 23.01.03 10:34
Schau mal nach dem Klassennamen des Fensters.
Dialogfenster haben meist #32???. Die genaue Nummer habe ich leider nicht im Kopf.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 23.01.03 10:38
Aber nur die mit VC erzeugten. Ich wollte das auch erst antworten, dann habe ich mal eine Delphi-Form genommen und ihr den Stil bsDialog gegeben und die Klasse war natürlich immer noch TForm1. So geht es also nicht.
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 23.01.03 10:49
Sind das nicht zwei Paar Schuhe?
Ob nun mit VC (bzw. dem VS-Editor) erstellt oder nicht, wenn du einen Dialog mit Borland´s BRCC32 kompilierst, dann sollte der Klassenname wieder den gewohnten Wert #32??? haben.
Mit VCL-Dialogen hat das IMHO nichts zu tun.
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 23.01.03 11:34
So, ich noch mal.
1. Dialog-Ressourcen haben, wie bereits erwähnt, den Klassennamen #32770. Zusätzlich ließe sich noch prüfen, ob
Quelltext 1:
| procpointer := pointer(integer(GetWindowLong(aWnd,DWL_DLGPROC))); |
ungleich nil ist oder nicht. Der gleiche Aufruf liefert bei VCL-Forms und VCL-Dialogen nämlich nil zurück, da es dort offenbar eine WndProc aber wohl keine DlgProc gibt.
2. Wenn du mal in die "Forms.pas" schaust, Luckie, dann findest du unter "TCustomForms.CreateParams" folgende Zeilen:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| bsDialog: begin Style := Style or WS_POPUP or WS_CAPTION; ExStyle := WS_EX_DLGMODALFRAME or WS_EX_WINDOWEDGE; AddBiDiModeExStyle(ExStyle); if not NewStyleControls then Style := Style or WS_DLGFRAME or DS_MODALFRAME;
{ ... } |
Einen VCL-Dialog mit dem Stil "bsDialog" kann man also mit Hilfe von
Quelltext 1: 2: 3:
| dwExStyle := GetWindowLong(aWnd,GWL_EXSTYLE); if(dwExStyle and WS_EX_DLGMODALFRAME > 0) then ShowMessage('VCL-Dialogstil'); |
"enttarnen".
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 23.01.03 11:39
Sag ich doch, dass es nicht nur mit #32770 geht.
So jetzt die 500.000 und 1.000.000 Fragen:
Wie sieht es beim BCB aus und bei VB?
Nachtrag: Ich kann nicht in die Forms.pas kucken, da nicht vorhanden. 
|
|
AndyB
      
Beiträge: 1173
Erhaltene Danke: 14
RAD Studio XE2
|
Verfasst: Do 23.01.03 20:10
Luckie hat folgendes geschrieben: | Wie sieht es beim BCB aus |
Da sieht es genauso aus, wie bei Delphi, da der BCB auf die Pascal-Units der VCL zugreift.
_________________ Ist Zeit wirklich Geld?
|
|
Popov
Gast
Erhaltene Danke: 1
|
Verfasst: Do 23.01.03 22:14
Wenn ich ehrlich bin, so dachte ich wirklich, daß es eine API Funktion gibt die mir sowas sagen kann. So kann man sich irren.
Was mich angeht, so hab ich das Problem inzwischen anders gelöst.
Das soll aber nich heißen, daß dieses interesante Thema nicht weiter verfolgt werden sollte. Nur ist die Frage inzwischen nicht mehr akut.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 23.01.03 22:17
Und wie hast du es gelöst?
|
|
Popov
Gast
Erhaltene Danke: 1
|
Verfasst: Do 23.01.03 22:46
Die Lösung selbst hat mit Dialogfenstern nichts zu tun. Du kannst dich doch an mein Problem erinnern in dem ich das Childwindow über ChildWindowFromPoint gesucht habe. Dabei hatte ich das Problem, daß ChildWindowFromPoint sich auf den Null-Punkt des Parentfensters bezieht. Leider hat ein leeres Normalfenster und Dialogfenster einen anderen Client-Null-Punkt. Also wollte ich über das prüfen nach Dialogfenster zwischen Normalen- und Dialogfenster unterscheiden.
Auf der Suche nach einer IsDialog-Funktion hab ich eine Funktion gefunden die mir direkt den Clientbereich angibt.
Wie du siehst, anders gelöst. Sorry für die Mühe, aber so funktioniert das. Wen man es nicht so lösen kann, dann so.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 23.01.03 23:02
Und welche Funktion liefert dir den direkten Client-Bereich?
|
|
Popov
Gast
Erhaltene Danke: 1
|
Verfasst: Do 23.01.03 23:48
Sorry, ich hab mich vertan. Die Funktion die ich eingebaut habe ist eine Funktion, mit der die Bildschirmkoordinaten eines gegebenen Punktes auf dem Bildschirm in Client-Koordinaten umgerechnet werden (ScreenToClient). Allerdings ist es kein Problem draus den Rectbereich zu berechen, bezogen auf das ChildFenster:
Quelltext 1: 2: 3:
| ScreenToClient(Hwnd, Pos); HwndCh := ChildWindowFromPoint(Hwnd, Pos); GetWindowRect(HwndCh, Rec); |
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 23.01.03 23:56
Alles klar, aber pos würde ich nicht als Variablennamen nehmen. Denk mal an die Funktion pos!
|
|