PanelGadget flackern beim wechseln

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
Olafmagne
Beiträge: 130
Registriert: 07.12.2017 17:30
Wohnort: Sete/Frankreich

PanelGadget flackern beim wechseln

Beitrag 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
Unsinnige Anweisungen von Seiten des Chef's lösen grundsätzlich ein "Syntax Error" bei mir aus
OS=Windows 11
PB=5.31/5.73/6 <> BlitzPlus/Blitz3D <> FreeBasic
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: PanelGadget flackern beim wechseln

Beitrag 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
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Olafmagne
Beiträge: 130
Registriert: 07.12.2017 17:30
Wohnort: Sete/Frankreich

Re: PanelGadget flackern beim wechseln

Beitrag 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
Unsinnige Anweisungen von Seiten des Chef's lösen grundsätzlich ein "Syntax Error" bei mir aus
OS=Windows 11
PB=5.31/5.73/6 <> BlitzPlus/Blitz3D <> FreeBasic
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: PanelGadget flackern beim wechseln

Beitrag von Kiffi »

@Olafmagne: Wieso nimmst Du dann nicht gleich das ScintillaGadget()?

Grüße ... Peter
Hygge
Benutzeravatar
Olafmagne
Beiträge: 130
Registriert: 07.12.2017 17:30
Wohnort: Sete/Frankreich

Re: PanelGadget flackern beim wechseln

Beitrag 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
Unsinnige Anweisungen von Seiten des Chef's lösen grundsätzlich ein "Syntax Error" bei mir aus
OS=Windows 11
PB=5.31/5.73/6 <> BlitzPlus/Blitz3D <> FreeBasic
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: PanelGadget flackern beim wechseln

Beitrag von hjbremer »

SetActiveGadget(qced(a)\ed1)
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
Olafmagne
Beiträge: 130
Registriert: 07.12.2017 17:30
Wohnort: Sete/Frankreich

Re: PanelGadget flackern beim wechseln

Beitrag 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
Zuletzt geändert von Olafmagne am 07.06.2019 14:19, insgesamt 1-mal geändert.
Unsinnige Anweisungen von Seiten des Chef's lösen grundsätzlich ein "Syntax Error" bei mir aus
OS=Windows 11
PB=5.31/5.73/6 <> BlitzPlus/Blitz3D <> FreeBasic
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: PanelGadget flackern beim wechseln

Beitrag von hjbremer »

schnelleren Rechner :mrgreen:
oder Background einheitlich beim Window und Gadgets
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
Olafmagne
Beiträge: 130
Registriert: 07.12.2017 17:30
Wohnort: Sete/Frankreich

Re: PanelGadget flackern beim wechseln

Beitrag von Olafmagne »

hjbremer hat geschrieben:schnelleren Rechner :mrgreen:
oder Background einheitlich beim Window und Gadgets
/:->
Mmmhh
ach so :o

Back to DOS :mrgreen:
Unsinnige Anweisungen von Seiten des Chef's lösen grundsätzlich ein "Syntax Error" bei mir aus
OS=Windows 11
PB=5.31/5.73/6 <> BlitzPlus/Blitz3D <> FreeBasic
Benutzeravatar
Olafmagne
Beiträge: 130
Registriert: 07.12.2017 17:30
Wohnort: Sete/Frankreich

Re: PanelGadget flackern beim wechseln

Beitrag 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
Unsinnige Anweisungen von Seiten des Chef's lösen grundsätzlich ein "Syntax Error" bei mir aus
OS=Windows 11
PB=5.31/5.73/6 <> BlitzPlus/Blitz3D <> FreeBasic
Antworten