Seite 1 von 1

PanelGadget flackern beim wechseln

Verfasst: 06.06.2019 15:54
von Olafmagne
Hallo an alle

Ich habe mich seit einigen Tagen etwas intensiver mit der Api beschäftigt,
dank rsbasic's Api-Library,
und hab,natürlich, erst mal alles(fast) ausprobiert.
Ind bin auf 'dumme' Gedanken gekommen.
Dabei ist mir allerdings ein verhalten aufgefallen,von dem ich nicht rausbekomme,woher es kommt.
Anbei ein kleiner Test-Code,mit verschiedenen Dingen.
Das Problem:
das rechte PanelGadget arbeitet wie erwartet
das linke flackert aber beim hinzufügen oder wechseln
ich weiss einfach nicht,was ich da machen könnte

Ein kleiner Tip wäre nett

Code: Alles auswählen

;*******************************************
;*   Quick'n'Dirty- Code
;*
;*   Dank an und Anregung von
;*   rsbasic's "WinAPI Library"
;*
;*   und MicroSofts Api- Doc
;*
;*   und allen,die Code zur verfügung gestellt haben
;*
;*********************************************

EnableExplicit
Global ed,ed1,ed2,ed3,win,stts,sth,mssg,main,tool,men,fnt,fntol
Global vary,func,cons,var,deb
Global OldProc,ixs
Global defaultBrush = CreateSolidBrush_(GetSysColor_(#COLOR_3DFACE))
Define i,j,k,ev,pnlnr
Declare.s Format(Zahl)
Declare LineCallBack()
Declare CodeGadget(nr,x,y,xx,yy,fl)

  Structure MyGadget
    gdgtnr.i
    ed1.i
    ed2.i
    ed3.i
    x.i
    y.i
    xx.i
    yy.i
    fl.i
    anz.i
    tag.s
    iks.i
  EndStructure 
Global a=-1
Global Dim qced.MyGadget(15)

 ;**************************************************
Procedure myPGcallback(hwnd, msg, wParam, lParam) 
  Protected Result = CallWindowProc_(OldProc, hwnd, msg, wParam, lParam) 
  Protected Gadget
  Protected Color
  Protected tabText$
  Protected *PGdis.DRAWITEMSTRUCT
  Select msg 
    Case #WM_DRAWITEM 
      *PGdis.DRAWITEMSTRUCT = lParam 
      If *PGdis\CtlType = #ODT_TAB       
       Gadget = GetProp_(*PGdis\hwnditem, "PB_ID")
        If *PGdis\itemID = GetGadgetState(Gadget)         
            Color = #Red
            tabText$ = GetGadgetItemText(Gadget, *PGdis\itemID)
            FillRect_(*PGdis\hdc, *PGdis\rcItem, defaultBrush)
            SetTextColor_(*PGdis\hdc, Color) 
            SetBkMode_(*PGdis\hdc, #TRANSPARENT) 
            DrawText_(*PGdis\hdc, tabText$, Len(tabText$), *PGdis\rcItem, #DT_LEFT | #DT_SINGLELINE | #DT_VCENTER | #DT_NOCLIP) 
          Else 
            tabText$ = GetGadgetItemText(Gadget, *PGdis\itemID)
            FillRect_(*PGdis\hdc, *PGdis\rcItem, defaultBrush)
            SetTextColor_(*PGdis\hdc, #Black) 
            SetBkMode_(*PGdis\hdc, #TRANSPARENT) 
            DrawText_(*PGdis\hdc, tabText$, Len(tabText$), *PGdis\rcItem, #DT_LEFT | #DT_SINGLELINE | #DT_VCENTER | #DT_NOCLIP) 
        EndIf 
      EndIf 
  EndSelect 
  ProcedureReturn  Result
EndProcedure 
Procedure CodeGadget(nr,ax,ay,axx,ayy,afl)
   Protected gdgtnr
   Protected ret$
  a+1
  With qced(a)
    \x=ax
    \y=ay
    \xx=axx
    \yy=ayy
    \fl=afl
    \tag=" New"
    \anz=a 
  EndWith
  OpenGadgetList(main)
  AddGadgetItem(main,qced(a)\anz,qced(a)\tag)
  
  gdgtnr=ContainerGadget(nr,ax,ay,axx,ayy,afl)
  SetGadgetColor(gdgtnr,#PB_Gadget_BackColor,$B7BCBC)
  ed1=EditorGadget(#PB_Any, 36,0, GadgetWidth(gdgtnr)-42, GadgetHeight(gdgtnr)-32)
  ed2=TextGadget(#PB_Any, 0,0, 30, GadgetHeight(gdgtnr),Format(1))
  ed3=TextGadget(#PB_Any, GadgetWidth(ed2),0, 6, GadgetHeight(gdgtnr),"")
  With qced(a)
  \gdgtnr=gdgtnr
  \ed1=ed1
  \ed2=ed2
  \ed3=ed3
  EndWith
  SetWindowTheme_(GadgetID(ed1), @"", @"")
  SetWindowLongPtr_(GadgetID(ed1), #GWL_EXSTYLE, 0)
  SetWindowPos_(GadgetID(ed1), 0, 0, 0, 0, 0, #SWP_NOMOVE | #SWP_NOSIZE | #SWP_FRAMECHANGED)
  SetGadgetColor(ed1,#PB_Gadget_BackColor,$B7BCBC)  
  SetGadgetColor(ed2,#PB_Gadget_BackColor,$7D8585)
  SetGadgetColor(ed3,#PB_Gadget_BackColor,$7D8585)
  CloseGadgetList() 
  
  CloseGadgetList()
  LineCallBack()
  BindGadgetEvent(ed1,@LineCallBack())

  SetActiveGadget(qced(a)\ed1)
  ProcedureReturn qced(a)\anz
EndProcedure
Procedure.s Format(zahl)
  Protected ret$
  If zahl<10
    ret$="  "+Str(zahl)
  ElseIf zahl<100
    ret$=" "+Str(zahl)
  ElseIf zahl>=100
    ret$=Str(zahl)
  EndIf
  ProcedureReturn ret$
EndProcedure  
Procedure LineCallBack() 
  Protected POINT.POINT
  Protected char
  Protected lineindex
  Protected colindex
  Protected col
  Protected row
  Protected lnnr
  Protected fl
  Protected lntxt$
  Protected i
  GetCaretPos_(@POINT)
  char = SendMessage_(GadgetID(ed1), #EM_CHARFROMPOS, 0, @POINT)
  lineindex = SendMessage_(GadgetID(ed1), #EM_LINEFROMCHAR, char, 0)
  colindex = SendMessage_(GadgetID(ed1), #EM_LINEINDEX, lineindex, 0)
  col = char-colindex
  row = lineindex + 1
  StatusBarText(stts,0 ,"Zeile:" + Str(row) + "  Spalte:" + Str(col))
  lnnr=SendMessage_(GadgetID(ed1),#EM_GETLINECOUNT,0,0)
  fl=SendMessage_(GadgetID(ed1),#EM_GETFIRSTVISIBLELINE,0,0)+1
  For i=fl To lnnr-1
    lntxt$=lntxt$+Format(i)+Chr(13)+Chr(10)
  Next i
  lntxt$=lntxt$+Format(i) 
  SetGadgetText(ed2,lntxt$)
EndProcedure  
;**************************************************
fnt=LoadFont(#PB_Any,"consolas",12)
fntol=LoadFont(#PB_Any,"consolas",8)
SetGadgetFont(#PB_Default,FontID(fnt))
SetThemeAppProperties_(0)
win=OpenWindow (#PB_Any,0,0,800,600,"Q-Code-Gadget",#PB_Window_Invisible|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget|#PB_Window_Maximize)
  SetWindowLongPtr_(WindowID(win),#GWL_EXSTYLE,GetWindowLongPtr_(WindowID(win),#GWL_EXSTYLE) | #WS_EX_LAYERED)
  SetLayeredWindowAttributes_(WindowID(win), 0, 0, #LWA_ALPHA)
  HideWindow(win,#False)
men=CreateMenu(1,WindowID(win))
MenuTitle("File")
MenuItem(1,"New")
stts=CreateStatusBar(#PB_Any,WindowID(win))
AddStatusBarField(120)
AddStatusBarField(100)
sth=StatusBarHeight(stts)
main=PanelGadget(#PB_Any,3,20,WindowWidth(win)-215,WindowHeight(win)-sth-93)
CodeGadget(#PB_Any,0,0,GadgetWidth(main),GadgetHeight(main),#PB_Container_Double)
CloseGadgetList()
mssg=TextGadget(#PB_Any,3,GadgetHeight(main)+20,WindowWidth(win)-215,53,"Text$")
SetGadgetColor(mssg,#PB_Gadget_BackColor,$7D8585)
tool=PanelGadget(#PB_Any, GadgetWidth(main)+3,20, WindowWidth(win)-GadgetWidth(main)-5 ,WindowHeight(win)-sth-40)
AddGadgetItem(tool,0,"Values")
vary=PanelGadget(#PB_Any,0,0,GadgetWidth(tool),GadgetHeight(tool))
AddGadgetItem(vary,0,"Variable")
var=TextGadget(#PB_Any,0,0,GadgetWidth(vary),GadgetHeight(vary),"Variables")
SetGadgetColor(var,#PB_Gadget_BackColor,$ABABAB)
SetGadgetColor(var,#PB_Gadget_FrontColor,$160200)
AddGadgetItem(vary,-1,"Function")
func=TextGadget(#PB_Any,0,0,GadgetWidth(vary),GadgetHeight(vary),"Functions()")
SetGadgetColor(func,#PB_Gadget_FrontColor,$E71505)
SetGadgetColor(func,#PB_Gadget_BackColor,$ABABAB)
AddGadgetItem(vary,-1,"Constant")
cons=TextGadget(#PB_Any,0,0,GadgetWidth(vary),GadgetHeight(vary),"#Constants")
SetGadgetColor(cons,#PB_Gadget_BackColor,$ABABAB)
SetGadgetColor(cons,#PB_Gadget_FrontColor,$8E0596)
CloseGadgetList()
AddGadgetItem(tool,1,"Debug")
deb=TextGadget(#PB_Any,0,0,GadgetWidth(vary),GadgetHeight(vary),"Debug "+Chr(34)+"Vary=8\"+Chr(34))
SetGadgetColor(deb,#PB_Gadget_BackColor,$ABABAB)
SetGadgetColor(deb,#PB_Gadget_FrontColor,$0C01EB)
CloseGadgetList()  
SetGadgetFont(vary,FontID(fntol))
  SetWindowLong_(GadgetID(main), #GWL_STYLE, GetWindowLong_(GadgetID(main), #GWL_STYLE) | #TCS_OWNERDRAWFIXED) 
  OldProc = SetWindowLong_(GetParent_(GadgetID(main)), #GWL_WNDPROC, @myPGcallback()) 

For i=0 To 255  
  SetWindowLongPtr_(WindowID(win),#GWL_EXSTYLE,GetWindowLongPtr_(WindowID(win),#GWL_EXSTYLE) | #WS_EX_LAYERED)
  SetLayeredWindowAttributes_(WindowID(win), 0, i, #LWA_ALPHA)
  Delay(3)
Next i
Repeat 
  ev=WaitWindowEvent()
  Select ev
    Case #PB_Event_CloseWindow
      a=255
      For i=a To 0 Step -1 
        SetWindowLongPtr_(WindowID(win),#GWL_EXSTYLE,GetWindowLongPtr_(WindowID(win),#GWL_EXSTYLE) | #WS_EX_LAYERED)
        SetLayeredWindowAttributes_(WindowID(win), 0, i, #LWA_ALPHA)
        Delay(5)
      Next i
      End
    Case #PB_Event_Menu
      Select EventMenu()
        Case 1
          CodeGadget(#PB_Any,0,0,GadgetWidth(main),GadgetHeight(main),#PB_Container_Double)
      EndSelect
  EndSelect
  pnlnr=GetGadgetState(main)
  SetActiveGadget(qced(pnlnr)\ed1)
  StatusBarText(stts,1 ,"TabNr.: "+Str(pnlnr+1))
ForEver

Dank im vorraus

Olaf

Re: PanelGadget flackern beim wechseln

Verfasst: 06.06.2019 15:57
von RSBasic
Bei mir flackert nichts. Da muss ein anderer dir helfen.
Vielleicht hilft ein SmartWindowRefresh()?

Bezüglich deiner Benutzeroberfläche: Möchtest du PB IDE nachbauen? :D

Re: PanelGadget flackern beim wechseln

Verfasst: 06.06.2019 16:27
von Olafmagne
Nicht die pb-ide
(vllt BlitzPlus)
ich vergass
ist mit PB_5.31und ascii compiliert
(5.31,weil ich ascii für BB-User-Lib's brauche und's wechseln vergass)
Ne der Code ist ein test für die einzelnen Möglichkeiten,und da ich die ide immer vor Augen habe,das Scintilla
besser verstehen wollte und mir nix besseres eingefallen ist,
sieht's halt so aus(Idee aber nicht schlecht(Arbeit,Arbei.......))

Flackern:
Nicht immer,aber wenn,dann ist es folgendes:
Nur das Panel wird kurtz weiss,bevor das neue Tab gezeichnet wird
kann es an der Version liegen?

Olaf

Edit:
Hab's auch noch mal mit 5.70 probiert,ohne erfolg
SmartWindowRefresh() ohne Wirkung

Re: PanelGadget flackern beim wechseln

Verfasst: 06.06.2019 17:47
von Kiffi
@Olafmagne: Wieso nimmst Du dann nicht gleich das ScintillaGadget()?

Grüße ... Peter

Re: PanelGadget flackern beim wechseln

Verfasst: 06.06.2019 19:20
von Olafmagne
Kiffi hat geschrieben:@Olafmagne: Wieso nimmst Du dann nicht gleich das ScintillaGadget()?

Grüße ... Peter
Ganz einfach!

zum einen ist der code nur eine test-plattform für api-functiones
und sonstige constructe

zum anderen selber probieren macht mehr spass


Das Problem des flackerns ist noch da,
irgenjemand 'ne idee?

olaf

Re: PanelGadget flackern beim wechseln

Verfasst: 06.06.2019 22:19
von hjbremer
SetActiveGadget(qced(a)\ed1)

Re: PanelGadget flackern beim wechseln

Verfasst: 07.06.2019 13:12
von Olafmagne
hjbremer hat geschrieben:SetActiveGadget(qced(a)\ed1)
Hilft leider auch nicht

mal ist es ok,mal gibt's einen kurzen 'Blitz'
ich denke,es liegt daran,dass das zeichnen zu lange dauert,
arbeite schon daran

olaf

Edit
ich hab mal nach jedem zu zeichnenden Gadget für den Tab ein delay() eingesetzt
um das zeichnen besser zu sehen.
dabei folgende Beobachtung:

das Panelgadget wird gelöcht,und erst wieder gezeichnet,wenn alle anderen gadgets fertig sind
und das dauert etwas.
werde mal sehen, ob ich das etwas schneller hinbekomme

Re: PanelGadget flackern beim wechseln

Verfasst: 07.06.2019 14:11
von hjbremer
schnelleren Rechner :mrgreen:
oder Background einheitlich beim Window und Gadgets

Re: PanelGadget flackern beim wechseln

Verfasst: 07.06.2019 14:27
von Olafmagne
hjbremer hat geschrieben:schnelleren Rechner :mrgreen:
oder Background einheitlich beim Window und Gadgets
/:->
Mmmhh
ach so :o

Back to DOS :mrgreen:

Re: PanelGadget flackern beim wechseln

Verfasst: 08.06.2019 11:59
von Olafmagne
so,
habe die letzte Nacht mit der windos api-doc verbracht
wenn ich das nun richtig interpretiere,dann wird,
nach einem <addgadgetitem > die entsprechende struc gefüllt,
und das Panel\Tab-Control gelöcht.
anschliessend werden die struc's der einzelnenGadget's,die ins Panel sollen gefüllt,
und erst jetzt ein <invalid_rect> message gesendet.
wenn ich richtig liege,muss das etwas damit zu tun haben,
das ich die einzusetzenden Gadget's verändert habe (Subclassing Controls),
da unveränderte Gadget's dieses Verhalten nicht haben.

Kann das Jemand bastätigen?

Olaf