ProgressBarText()

Programmation d'applications complexes
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

ProgressBarText()

Message par Jacobus »

Hello, voici un exemple de code qui fonctionnait parfaitement en PB 4.30 et plante en 4.40
Il s'agit d'une barre de progression avec indication du pourcentage textuel. je crois que c'est Gnozal qui avait initié ce code.

Le plantage se fait sur GrabImage() qui échoue et plante donc le DrawImage() qui suit.
J'ai indiqué l'endroit avec des commentaires dans la première procédure.
Si vous avez une idée pour parer à ça et continuer d'utiliser ce gadget, ça m'aiderait bien, merci.

Code : Tout sélectionner

Enumeration
#Container
#progbar
EndEnumeration

Procedure ProcTextProgressBarGadget(hwnd, msg, wParam, lParam)
  Protected OldProc.l, ImgID.l, ImgID2.l, hdcOut.l, hdcIn.l, ps.PAINTSTRUCT, GadgetNumber.l
  Protected Text.s, BarColor.l, Progression.d, BackColor.l, ProgWidth.d, TextColor2.l
  OldProc = GetProp_(hwnd, "OldProc")
  TextColor = GetProp_(hwnd, "TextColor")
  TextColor2 = GetProp_(hwnd, "TextColor2")
  BackColor = GetProp_(hwnd, "BackColor")
  BarColor = GetProp_(hwnd, "BarColor")
  Select msg
    Case #WM_PAINT
      GadgetNumber = GetDlgCtrlID_(hwnd)
      Progression = (GetGadgetState(GadgetNumber) - GetGadgetAttribute(GadgetNumber, #PB_ProgressBar_Minimum)) / (GetGadgetAttribute(GadgetNumber, #PB_ProgressBar_Maximum) - GetGadgetAttribute(GadgetNumber, #PB_ProgressBar_Minimum))
      ProgWidth = GadgetWidth(GadgetNumber)* Progression
      Text = StrD(Progression * 100, 0) + "%"
      BeginPaint_(hwnd, @ps) ;>
        hdcOut = ps\hdc
        ImgID2 = CreateImage(#PB_Any, GadgetWidth(GadgetNumber), GadgetHeight(GadgetNumber), 24)
        StartDrawing(ImageOutput(ImgID2))
          DrawingMode(#PB_2DDrawing_Transparent)
          DrawingFont(GetStockObject_(#DEFAULT_GUI_FONT))
          Box(0, 0, GadgetWidth(GadgetNumber), GadgetHeight(GadgetNumber), BarColor)
          FrontColor(TextColor)
          DrawText(GadgetWidth(GadgetNumber) / 2 - 0.5 * TextWidth(Text), GadgetHeight(GadgetNumber) / 2 - 0.5 * TextHeight(Text), Text)
        StopDrawing()
        ImgID = CreateImage(#PB_Any, GadgetWidth(GadgetNumber), GadgetHeight(GadgetNumber), 24)
        Debug Str(ImgID)
        hdcIn = StartDrawing(ImageOutput(ImgID))
          DrawingMode(#PB_2DDrawing_Transparent)
          DrawingFont(GetStockObject_(#DEFAULT_GUI_FONT))
          Box(0, 0, GadgetWidth(GadgetNumber), GadgetHeight(GadgetNumber), BackColor)
          FrontColor(TextColor2)
          DrawText(GadgetWidth(GadgetNumber) / 2 - 0.5 * TextWidth(Text), GadgetHeight(GadgetNumber) / 2 - 0.5 * TextHeight(Text), Text)
         Debug Str(ImgID2)
          ImgTmpID = GrabImage(ImgID2 , #PB_Any, 0, 0, ProgWidth, GadgetHeight(GadgetNumber)) ; ECHOUE !!
         Debug Str(ImgTmpID) ; = 0 ??    
          DrawImage(ImageID(ImgTmpID), 0, 0); = Plantage !! ( image non initialisée.)
          BitBlt_(hdcOut, 0, 0, GadgetWidth(GadgetNumber), GadgetHeight(GadgetNumber), hdcIn, 0, 0, #SRCCOPY)
        StopDrawing()
      EndPaint_(hwnd, ps) ;<
      FreeImage(ImgID)
      FreeImage(ImgID2)
      FreeImage(ImgTmpID)
      ProcedureReturn #Null
    Case #WM_NCDESTROY
      RemoveProp_(hwnd, "OldProc")
      RemoveProp_(hwnd, "TextColor")
      RemoveProp_(hwnd, "TextColor2")
      RemoveProp_(hwnd, "BackColor")
      RemoveProp_(hwnd, "BarColor")
  EndSelect
  ProcedureReturn CallWindowProc_(OldProc, hwnd, msg, wParam, lParam)
EndProcedure

Procedure CreateTextProgressBarGadget(GadgetNumber.l, X.l, Y.l, width.l, Height.l, Minimum.l, Maximum.l, FirstTextColor.l = #PB_Ignore, SecondTextColor.l = #PB_Ignore, BarColor.l = #PB_Ignore, BackColor.l = #PB_Ignore)
  Protected ImgID.l, ImgID2.l
  If FirstTextColor = #PB_Ignore
    FirstTextColor = GetSysColor_(#COLOR_WINDOWTEXT)
  EndIf
  If SecondTextColor = #PB_Ignore
    SecondTextColor = GetSysColor_(#COLOR_HIGHLIGHTTEXT)
  EndIf
  If BackColor = #PB_Ignore
    BackColor = GetSysColor_(#COLOR_BTNFACE)
  EndIf
  If BarColor = #PB_Ignore
    BarColor = GetSysColor_(#COLOR_HIGHLIGHT)
  EndIf
  ProgressBarGadget(GadgetNumber, X, Y, width, Height, Minimum, Maximum)
  SetProp_(GadgetID(GadgetNumber), "BackColor", BackColor)     
  SetProp_(GadgetID(GadgetNumber), "BarColor", BarColor)     
  SetProp_(GadgetID(GadgetNumber), "TextColor", SecondTextColor)     
  SetProp_(GadgetID(GadgetNumber), "TextColor2", FirstTextColor)     
  SetProp_(GadgetID(GadgetNumber), "OldProc", SetWindowLong_(GadgetID(GadgetNumber), #GWL_WNDPROC, @ProcTextProgressBarGadget()))     
EndProcedure



OpenWindow(0,0,0,600,300,"ProgressBarText",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)

	ContainerGadget(#Container, 10,100,580,20,#PB_Container_Single)		  
		CreateTextProgressBarGadget(#progbar, 0,0,580,20,0,100,#Black, #White, RGB(157, 196, 224), RGB(184, 184, 173))
	CloseGadgetList()

 SetGadgetState(#progbar,62)
 
Repeat
  ev = WaitWindowEvent()
  Select ev
    Case #PB_Event_Gadget
      Select EventGadget()
      
      
      EndSelect
  EndSelect
Until ev=#PB_Event_CloseWindow
Dernière modification par Jacobus le ven. 12/févr./2010 15:27, modifié 1 fois.
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
zaphod
Messages : 135
Inscription : dim. 07/déc./2008 9:32

Re: ProgressBarText()

Message par zaphod »

...
Dernière modification par zaphod le dim. 27/mai/2012 7:30, modifié 1 fois.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: ProgressBarText()

Message par Le Soldat Inconnu »

et voilà

ça plantait car tu faisais un grabimage avec une largeur de 0
J'ai donc conditionner le grabimage et c'est ok

Code : Tout sélectionner

Enumeration
	#Container
	#progbar
EndEnumeration

Procedure ProcTextProgressBarGadget(hwnd, msg, wParam, lParam)
	Protected OldProc.l, ImgID.l, ImgID2.l, hdcOut.l, hdcIn.l, ps.PAINTSTRUCT, GadgetNumber.l
	Protected Text.s, BarColor.l, Progression.d, BackColor.l, ProgWidth.d, TextColor2.l
	OldProc = GetProp_(hwnd, "OldProc")
	TextColor = GetProp_(hwnd, "TextColor")
	TextColor2 = GetProp_(hwnd, "TextColor2")
	BackColor = GetProp_(hwnd, "BackColor")
	BarColor = GetProp_(hwnd, "BarColor")
	Select msg
		Case #WM_PAINT
			GadgetNumber = GetDlgCtrlID_(hwnd)
			Progression = (GetGadgetState(GadgetNumber) - GetGadgetAttribute(GadgetNumber, #PB_ProgressBar_Minimum)) / (GetGadgetAttribute(GadgetNumber, #PB_ProgressBar_Maximum) - GetGadgetAttribute(GadgetNumber, #PB_ProgressBar_Minimum))
			ProgWidth = GadgetWidth(GadgetNumber)* Progression
			Text = StrD(Progression * 100, 0) + "%"
			BeginPaint_(hwnd, @ps) ;>
				hdcOut = ps\hdc
				ImgID2 = CreateImage(#PB_Any, GadgetWidth(GadgetNumber), GadgetHeight(GadgetNumber), 24)
				StartDrawing(ImageOutput(ImgID2))
					DrawingMode(#PB_2DDrawing_Transparent)
					DrawingFont(GetStockObject_(#DEFAULT_GUI_FONT))
					Box(0, 0, GadgetWidth(GadgetNumber), GadgetHeight(GadgetNumber), BarColor)
					FrontColor(TextColor)
					DrawText(GadgetWidth(GadgetNumber) / 2 - 0.5 * TextWidth(Text), GadgetHeight(GadgetNumber) / 2 - 0.5 * TextHeight(Text), Text)
				StopDrawing()
				ImgID = CreateImage(#PB_Any, GadgetWidth(GadgetNumber), GadgetHeight(GadgetNumber), 24)
				hdcIn = StartDrawing(ImageOutput(ImgID))
					DrawingMode(#PB_2DDrawing_Transparent)
					DrawingFont(GetStockObject_(#DEFAULT_GUI_FONT))
					Box(0, 0, GadgetWidth(GadgetNumber), GadgetHeight(GadgetNumber), BackColor)
					FrontColor(TextColor2)
					DrawText(GadgetWidth(GadgetNumber) / 2 - 0.5 * TextWidth(Text), GadgetHeight(GadgetNumber) / 2 - 0.5 * TextHeight(Text), Text)
					If ProgWidth > 0
						ImgTmpID = GrabImage(ImgID2 , #PB_Any, 0, 0, ProgWidth, GadgetHeight(GadgetNumber)) ; ECHOUE !!
						DrawImage(ImageID(ImgTmpID), 0, 0); = Plantage !! ( image non initialisée.)
						FreeImage(ImgTmpID)
					EndIf
					BitBlt_(hdcOut, 0, 0, GadgetWidth(GadgetNumber), GadgetHeight(GadgetNumber), hdcIn, 0, 0, #SRCCOPY)
				StopDrawing()
			EndPaint_(hwnd, ps) ;<
			FreeImage(ImgID)
			FreeImage(ImgID2)
			ProcedureReturn #Null
		Case #WM_NCDESTROY
			RemoveProp_(hwnd, "OldProc")
			RemoveProp_(hwnd, "TextColor")
			RemoveProp_(hwnd, "TextColor2")
			RemoveProp_(hwnd, "BackColor")
			RemoveProp_(hwnd, "BarColor")
	EndSelect
	ProcedureReturn CallWindowProc_(OldProc, hwnd, msg, wParam, lParam)
EndProcedure

Procedure CreateTextProgressBarGadget(GadgetNumber.l, x.l, y.l, width.l, Height.l, Minimum.l, Maximum.l, FirstTextColor.l = #PB_Ignore, SecondTextColor.l = #PB_Ignore, BarColor.l = #PB_Ignore, BackColor.l = #PB_Ignore)
	Protected ImgID.l, ImgID2.l
	If FirstTextColor = #PB_Ignore
		FirstTextColor = GetSysColor_(#COLOR_WINDOWTEXT)
	EndIf
	If SecondTextColor = #PB_Ignore
		SecondTextColor = GetSysColor_(#COLOR_HIGHLIGHTTEXT)
	EndIf
	If BackColor = #PB_Ignore
		BackColor = GetSysColor_(#COLOR_BTNFACE)
	EndIf
	If BarColor = #PB_Ignore
		BarColor = GetSysColor_(#COLOR_HIGHLIGHT)
	EndIf
	ProgressBarGadget(GadgetNumber, x, y, width, Height, Minimum, Maximum)
	SetProp_(GadgetID(GadgetNumber), "BackColor", BackColor)     
	SetProp_(GadgetID(GadgetNumber), "BarColor", BarColor)     
	SetProp_(GadgetID(GadgetNumber), "TextColor", SecondTextColor)     
	SetProp_(GadgetID(GadgetNumber), "TextColor2", FirstTextColor)     
	SetProp_(GadgetID(GadgetNumber), "OldProc", SetWindowLong_(GadgetID(GadgetNumber), #GWL_WNDPROC, @ProcTextProgressBarGadget()))     
EndProcedure



OpenWindow(0,0,0,600,300,"ProgressBarText",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)

ContainerGadget(#Container, 10,100,580,20,#PB_Container_Single)       
	CreateTextProgressBarGadget(#progbar, 0,0,580,20,0,100,#Black, #White, RGB(157, 196, 224), RGB(184, 184, 173))
CloseGadgetList()

Progression = 0
AddWindowTimer(0, 1, 100)

Repeat
	ev = WaitWindowEvent()
	Select ev
		Case #PB_Event_Timer
			Select EventTimer()
				Case 1
					Progression + 1
					If Progression > 100
						Progression = 0
					EndIf
					Debug Progression
					SetGadgetState(#progbar, Progression)
			EndSelect
	EndSelect
Until ev=#PB_Event_CloseWindow
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Re: ProgressBarText()

Message par Jacobus »

Arf! Merci LSI, j'ai zappé la taille du gadget... :?

@Zaphod: Etonnant car je suis aussi en PB 4.41 mais le plantage était bien là. Avec la correction de LSI c'est nickel, donc ça m'étonne vraiment que tu ais pu le faire fonctionner tel que !?!
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: ProgressBarText()

Message par Le Soldat Inconnu »

Ton code fonctionne nickel, j'ai du faire un essai de progression pour voir le défaut
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Re: ProgressBarText()

Message par Jacobus »

Alors c'est dû à mon système, Win7 x64
j'utilise les deux, 32 et 64 bits, et bon bah ça plantait dans les deux cas :| bizarre quand même.

Rectification: En effet pour donner un exemple ici j'ai initialisé la progression à 62% ce qui a éludé le plantage.
Or, pour mes tests je commentais ;SetGadgetState(#progbar,62) occasionnant le dit plantage.

Encore merci pour ta sagacité :)
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Répondre