Seite 1 von 1
Einen "Auswahlrahmen" um ein Fenster packen
Verfasst: 23.10.2006 14:21
von Tafkadasom2k5
Heyho allerseits
Ich habe ein Childwindow, und es ist Borderless. Ich möchte,
wenn das Fenster den Fokus bekommt, ihm einen Auswahlrahmen verpassen (so in der Art wie beim Dialog-Editor der Rahmen, der bei einem aktivierten Gagdet erscheint.)
Jetzt experimentiere ich die ganze Zeit mit denS tyles herum, aber irgendwie funktioniert nichts davon so richtig.
Code: Alles auswählen
SetWindowLong_(WindowID(0),#GWL_STYLE,GetWindowLong_(WindowID(0),#GWL_STYLE) | #WS_BORDER)
Irgendwie will dieser Style nicht auf mein Childwindow passen...
Hat irgendjemand einen Ratschlag, was für einen Style oder ähnliches ich dem Fenster hinzufügen muss, amit es "aktiv" aussieht, obwohl es keine Caption und co hat?
Gr33tz
Tafkadasom2k5
Verfasst: 23.10.2006 20:40
von Fluid Byte
Code: Alles auswählen
OpenWindow(0,0,0,400,300,"untitled",#WS_OVERLAPPEDWINDOW | 1)
SetWindowColor(0,$FF8844)
OpenWindow(1,20,20,240,140,"",#WS_CHILD,WindowID(0))
CreateGadgetList(WindowID(1))
TextGadget(0,80,60,100,20,"CLICK MICH !!")
Repeat
EventID = WaitWindowEvent()
If EventID = #WM_LBUTTONDOWN
Select EventWindow()
Case 0
SetWindowLong_(WindowID(1),#GWL_STYLE,#WS_CHILD | #WS_VISIBLE)
SetWindowPos_(WindowID(1),0,0,0,0,0,#SWP_NOMOVE | #SWP_NOSIZE | #SWP_FRAMECHANGED)
Case 1
SetWindowLong_(WindowID(1),#GWL_STYLE,#WS_CHILD | #WS_VISIBLE | #WS_BORDER)
SetWindowPos_(WindowID(1),0,0,0,0,0,#SWP_NOMOVE | #SWP_NOSIZE | #SWP_FRAMECHANGED)
EndSelect
EndIf
Until EventID = 16
Verfasst: 24.10.2006 09:48
von Tafkadasom2k5
Hey, scheint zu funktionieren

Eine Frage nur-
warum muss man dieses
Code: Alles auswählen
SetWindowPos_(WindowID(1),0,0,0,0,0,#SWP_NOMOVE | #SWP_NOSIZE | #SWP_FRAMECHANGED)
dazu einfügen? Die WinAPI sagt mir zwar, dass man damit das Fenster aktualisieren kann (und durch die Flags die Position und Größe nicht verändert werden)- aber warum kann man dann nicht einfach "UpdateWindow(WindowID(1))" machen?
Weil das scheint in der Konstellation nämlich nicht zu funktionieren...
Gr33tz
Tafkadasom2k5
Verfasst: 24.10.2006 12:39
von real
Weil Du nicht den Inhalt des Fensters bzw. Gadgets, sondern dessen Rahmen (=Style) geändert hast.
Verfasst: 24.10.2006 14:24
von Tafkadasom2k5
Ah, alles klar
Was ist das denn für ein Border-Style der auftritt, wenn man ein Objekt wie zum Beispiel bei PAINT den Auswahlrahmen hat?
Ich brauche um mein Fenster nämlich auch so ein Auswahlrahmen...
So einer mit Punkten an den markanten Ecken um es dort zu strecken o.Ä.
Oder muss ich mir sowas "selber basteln"?
Gr33tz
Tafkadasom2k5
Verfasst: 24.10.2006 17:46
von Fluid Byte
Tafkadasom2k5 hat geschrieben:
Was ist das denn für ein Border-Style der auftritt, wenn man ein Objekt wie zum Beispiel bei PAINT den Auswahlrahmen hat?
Der Rahmen bei Paint ist eine Kombination aus FrameRect() und DrawFocusRect(). Die Eckpunkte und die Funktionalität des Skalierens sind entweder OLE Objekte oder von Hand geschriebene Routinen.
Tafkadasom2k5 hat geschrieben:Oder muss ich mir sowas "selber basteln"?
Wenn es keine OLE Objekte sind ja. Schau dich mal ein wenig auf
MSDN um.
Verfasst: 25.10.2006 09:19
von Tafkadasom2k5
..hey, so langsam verstehe ich.. nur so wirklich vollständig auch noch nicht...
Code: Alles auswählen
DC_hWnd = GetDC_(hWnd)
hBrush = CreateHatchBrush_(#HS_CROSS, #BLACK)
GetWindowRect_(hWnd,rHwnd)
FrameRect_(DC_hWnd, rHwnd, hBrush)
DrawFocusRect_(DC_hWnd,rHwnd)
BringWindowToTop_(hWnd)
...aber da tut sich nichts..?
Habe ich am System was falsch verstanden? Oder habe ich das DC-System völlig missverstanden?
Gr33tz
Tafkadasom2k5
Verfasst: 25.10.2006 10:38
von bobobo
hmm .. geht doch
Code: Alles auswählen
rHWND.rect
hwnd=OpenWindow(0,0,0,400,400,"aha")
CreateGadgetList(WindowID(0))
DC_hWnd = GetDC_(hWnd)
hBrush = CreateHatchBrush_(#HS_CROSS, #Red)
GetWindowRect_(hWnd,rHwnd)
;etwas Behandlung damit man was sieht
rHWND\left+5
rHWND\top+5
rHWND\right-15
rHWND\bottom-100 ;etwas mehr, da die Titelzeile ja auch noch dabei ist
Repeat
FrameRect_(DC_hWnd, rHwnd, hBrush)
;DrawFocusRect_(DC_hWnd,rHwnd) ; ist mir toomuch
;BringWindowToTop_(hWnd) ; brauch so nicht
Until WaitWindowEvent()=#PB_Event_CloseWindow
das in ein Callback und die Welt is ok