EditorGadget Border Color ändern ?

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

EditorGadget Border Color ändern ?

Beitrag von hjbremer »

Weiß jemand wie man die Farbe des Rahmens eines EditorGadget ändert ?

Ich habe zwar gesucht aber nix gefunden :cry:
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
Shardik
Beiträge: 738
Registriert: 25.01.2005 12:19

Re: EditorGadget Border Color ändern ?

Beitrag von Shardik »

Erfolgreich getestet in Windows 10 Enterprise 22H2 x64 mit PB 6.00 x86 + x64 mit Asm- und C-Backend:

Code: Alles auswählen

EnableExplicit

Procedure DrawGadgetBorder(GadgetID.I, BorderColor.I)
  Protected BackImage.I

  BackImage = CreateImage(#PB_Any, GadgetWidth(GadgetID) + 4,
    GadgetHeight(GadgetID) + 4)

  StartDrawing(ImageOutput(BackImage))
    Box(0, 0, ImageWidth(BackImage), ImageHeight(BackImage), BorderColor)
  StopDrawing()

  ImageGadget(#PB_Any, GadgetX(GadgetID) - 2, GadgetY(GadgetID) - 2,
    GadgetWidth(GadgetID) + 4, GadgetHeight(GadgetID) + 4,
    ImageID(BackImage))
  FreeImage(BackImage)
  SetWindowLongPtr_(GadgetID(GadgetID), #GWL_STYLE,
    GetWindowLongPtr_(GadgetID(GadgetID), #GWL_STYLE) | #WS_CLIPSIBLINGS)
EndProcedure

OpenWindow(0, 270, 100, 170, 145, "Gadgets mit Rahmen")

CheckBoxGadget(0, 10, 20, 95, 18, "OptionGadget", #WS_CLIPSIBLINGS)
DrawGadgetBorder(0, #Blue)

EditorGadget(1, 10, 60, 150, 70, #WS_CLIPSIBLINGS)
DrawGadgetBorder(1, #Red)
SetGadgetText(1, "EditorGadget")

Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: EditorGadget Border Color ändern ?

Beitrag von hjbremer »

Danke für den Code ! Interressante Lösung

man könnte es so machen, aber man hat 2 Gadgets. das verschieben wird dann etwas aufwändiger.

Und wozu warum #WS_CLIPSIBLINGS ? Zudem es doppelt ist. Einmal als direktes flag und dann nochmal via Sendmessage
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
chi
Beiträge: 90
Registriert: 17.05.2007 09:30
Wohnort: Linz - Austria

Re: EditorGadget Border Color ändern ?

Beitrag von chi »

Probier mal...

Code: Alles auswählen

Global oldProc, brush1, brush2

Procedure WndCallback(hWnd, Msg, wParam, lParam)
  Select Msg
      
    Case #WM_NCPAINT
      GetWindowRect_(hWnd, cRect.RECT)
      OffsetRect_(cRect, -cRect\left, -cRect\top)
      hdc = GetDCEx_(hWnd, 0, #DCX_WINDOW|$10000)
      FrameRect_(hdc, cRect, brush1)
      InflateRect_(cRect, -1, -1)
      FrameRect_(hdc, cRect, brush2)
      ReleaseDC_(hWnd, hdc)
      ProcedureReturn 0
      
    Case #WM_NCDESTROY
      SetWindowLongPtr_(hWnd, #GWL_WNDPROC, @oldProc)
      ProcedureReturn DefWindowProc_(hWnd, Msg, wParam, lParam)
      
  EndSelect
  ProcedureReturn CallWindowProc_(oldProc, hWnd, Msg, wParam, lParam)
EndProcedure

OpenWindow(0, 0, 0, 320, 200, "", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)

EditorGadget(0, 10, 10, 300, 180)
brush1 = CreateSolidBrush_(#Blue)
brush2 = CreateSolidBrush_(#Cyan)
oldProc = SetWindowLongPtr_(GadgetID(0), #GWL_WNDPROC, @WndCallback())

While WaitWindowEvent() <> #PB_Event_CloseWindow : Wend

DeleteObject_(brush1)
DeleteObject_(brush1)

Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: EditorGadget Border Color ändern ?

Beitrag von hjbremer »

Danke der Mühe

aber funktioniert bei mir nicht unter Win 10 PB 5.72
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
chi
Beiträge: 90
Registriert: 17.05.2007 09:30
Wohnort: Linz - Austria

Re: EditorGadget Border Color ändern ?

Beitrag von chi »

Sorry, hab nicht auf Win10 getestet... Auf Win7 funktioniert es auch ohne SetWindowPos_(#SWP_FRAMECHANGED)

Code: Alles auswählen

Global oldProc, brush1, brush2

Procedure WndCallback(hWnd, Msg, wParam, lParam)
  Select Msg
      
    Case #WM_NCPAINT
      GetWindowRect_(hWnd, cRect.RECT)
      OffsetRect_(cRect, -cRect\left, -cRect\top)
      hdc = GetDCEx_(hWnd, 0, #DCX_WINDOW|$10000)
      FrameRect_(hdc, cRect, brush1)
      InflateRect_(cRect, -1, -1)
      FrameRect_(hdc, cRect, brush2)
      ReleaseDC_(hWnd, hdc)
      ProcedureReturn 0
      
    Case #WM_NCDESTROY
      SetWindowLongPtr_(hWnd, #GWL_WNDPROC, @oldProc)
      ProcedureReturn DefWindowProc_(hWnd, Msg, wParam, lParam)
      
  EndSelect
  ProcedureReturn CallWindowProc_(oldProc, hWnd, Msg, wParam, lParam)
EndProcedure

OpenWindow(0, 0, 0, 320, 200, "", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)

EditorGadget(0, 10, 10, 300, 180)
brush1 = CreateSolidBrush_(#Blue)
brush2 = CreateSolidBrush_(#Cyan)
oldProc = SetWindowLongPtr_(GadgetID(0), #GWL_WNDPROC, @WndCallback())
SetWindowPos_(GadgetID(0), 0, 0, 0, 0, 0, #SWP_NOSIZE|#SWP_NOMOVE|#SWP_NOZORDER|#SWP_NOACTIVATE|#SWP_FRAMECHANGED)

While WaitWindowEvent() <> #PB_Event_CloseWindow : Wend

DeleteObject_(brush1)
DeleteObject_(brush1)
Antworten