J'ai des Boutons

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

J'ai des Boutons

Message par MLD »

Pour le fun. A vous de jouer pour une amélioration.

Code : Tout sélectionner

;MLD 30-9-2009
;Bouton avec icone plus texte
; Compilation PureBasic V4.31 
; réalisation  a partir d'un ancien code du forum Allemand.
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤

Enumeration
#button1
#button2
#button3
#button4
#button5
EndEnumeration

icon2 = ExtractIcon_(0,"Shell32.dll", 131)
icon3 = ExtractIcon_(0,"Shell32.dll", 55)
icon4 = LoadIcon_(0,#IDI_ASTERISK)     
icon5 = LoadIcon_(0,#IDI_EXCLAMATION) 

FontID0 = LoadFont(0,"Courier New", 12)
FontID1 = LoadFont(1,"Comic sans MS", 15,#PB_Font_Underline  )
   
Procedure Bticotext(idbt,x.f,y.f,larg.f,haut.f,iconid,txt$,font,coultext,coulbout) 
Define hautimg.f,largimg.f,imgze.f
CI=CreateImage(idbt, larg, haut)
 
hdc=StartDrawing(ImageOutput(idbt))
SelectObject_(hdc, font)
  ; possibilité de régler l'espace entre lettres
  ; SetTextCharacterExtra_(hdc, 1) 
 
  ; Dessine l'image 
  Box(0,0,larg,haut,coulbout) 
  GetIconInfo_(iconid,@info.ICONINFO) 
  hautimg=info\xHotspot 
  largimg=info\yHotspot    
  If hautimg > haut-2: hautimg=hautimg/10*8: EndIf
  If largimg > larg-2: largimg=largimg/10*8: EndIf
  If hautimg < (haut-2)/2: hautimg=hautimg*1.8:largimg=largimg*1.8: EndIf
  dbimg=5 ; distance de bord gauche/image 
  cthimg=(haut-hautimg)/2 ;centre l'image en hauteur
  DrawImage(iconid,dbimg,cthimg,largimg,hautimg)
    
  ; Position du texte
  DrawingMode(#PB_2DDrawing_Transparent) 
  hautxt=TextHeight(txt$) 
  largtxt=TextWidth (txt$) 
  ditxt=largimg+dbimg+3 ; distance image/texte
  ctxt=(haut-hautxt)/2 ; centre le text en hauteur
  DrawText(ditxt,ctxt,txt$,coultext)
StopDrawing ()
ButtonImageGadget(idbt,x,y,larg,haut,ImageID(idbt))
EndProcedure


If OpenWindow(0,0,0,820,600,"Test Boutons") 
    
     Bticotext(#button1,10,100,190,36,icon2,"Premier Bouton",FontID0,#Blue,$F1F1F1)
     Bticotext(#button2,220,100,150,36,icon3,"2em Bouton",FontID1 ,#Red,$DAE1DE)
     Bticotext(#button3,10,150,150,36,icon4,"3em Bouton",FontID0,#Blue,$5AB5BD)
     Bticotext(#button4,220,150,160,72,icon5,"4em Bouton",FontID1,#Gray,$E4BBAF)
     Bticotext(#button5,10,250,160,72,icon4,"5em Bouton",FontID1,#Black,GetSysColor_(#COLOR_BTNFACE))     
    Repeat 
      Event = WaitWindowEvent() 
        If Event = #PB_Event_Gadget
          Select EventGadget()
           Case #button1
            ;votre code
           EndSelect                                 
         EndIf
      
    Until Event  = #PB_Event_CloseWindow 
EndIf 
DeleteObject_(font) 
End 

A+ Michel
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: J'ai des Boutons

Message par Le Soldat Inconnu »

avec PB 4.40, ça peut donner ça :)

Code : Tout sélectionner

; MLD 30-9-2009
; Bouton avec icone plus texte
; Compilation PureBasic V4.31
; réalisation  a partir d'un ancien code du forum Allemand.
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤

Enumeration
	#button1
EndEnumeration

#SHIL_SMALL = $1
#SHIL_LARGE = $0
#SHIL_EXTRALARGE = $2
#SHIL_JUMBO = $4

#LOAD_LIBRARY_AS_DATAFILE = 2

DataSection
  IID_IImageList:
  Data.l $46EB5926
  Data.w $582E,$4017
  Data.b $9F,$DF,$E8,$99,$8D,$AA,$09,$50
EndDataSection 
Structure IMAGELISTDRAWPARAMS
  cbSize.l
  himl.l
  i.l
  hdcDst.l
  x.l
  y.l
  cx.l
  cy.l
  xBitmap.l
  yBitmap.l
  rgbBk.l
  rgbFg.l
  fStyle.l
  dwRop.l
  fState.l
  frame.l
  crEffect.l
EndStructure
Interface IImageList2 Extends iUnknown
  Add(hbmImage, hbmMask, pi)
  ReplaceIcon(i, hIcon, pi)
  SetOverlayImage(iImage, iOverlay)
  Replace(i, hbmImage, hbmMask)
  AddMasked(hbmImage, crMask, pi)
  Draw(pimldp.IMAGELISTDRAWPARAMS)
  Remove(i)
  GetIcon(i, flags, picon)
  GetImageInfo(i, pImageInfo.IMAGEINFO)
  Copy(iDst, punkSrc.IImageList, iSrc, uFlags)
  Merge(i1, punk2.IImageList, i2, dx, dy, riid, ppv)
  Clone(riid, ppv)
  GetImageRect(i, prc.RECT)
  GetIconSize(cx, cy)
  SetIconSize(cx, cy)
  GetImageCount(pi)
  SetImageCount(uNewCount)
  SetBkColor(clrBk, pclr)
  GetBkColor(pclr)
  BeginDrag(iTrack, dxHotspot, dyHotspot)
  EndDrag()
  DragEnter(hwndLock, x, y)
  DragLeave(hwndLock)
  DragMove(x, y)
  SetDragCursorImage(punk.IImageList, iDrag, dxHotspot, dyHotspot)
  DragShowNolock(fShow)
  GetDragImage(ppt.POINT, pptHotspot.POINT, riid, ppv)
  GetItemFlags(i, dwFlags)
  GetOverlayImage(iOverlay, piIndex)
EndInterface


Procedure.l GetIconFile2(IconFile.s, Size.l) ; Get icon 16*16, 32*32 or 48*48
  Protected hIcon.l, FileInfo.SHFILEINFO, dll_Shell32.l, hResult.l, *Guid.l
  Select Size
		Case #SHIL_SMALL, 16
      SHIL = #SHIL_SMALL
		Case #SHIL_LARGE, 32
      SHIL = #SHIL_LARGE
		Case #SHIL_EXTRALARGE, 48
      SHIL = #SHIL_EXTRALARGE
		Case #SHIL_JUMBO, 128, 256
      If OS >= #PB_OS_Windows_Vista
        SHIL = #SHIL_JUMBO
			Else
        SHIL = #SHIL_EXTRALARGE
			EndIf
		Default
      SHIL = #SHIL_SMALL
	EndSelect
  If OSVersion() >= #PB_OS_Windows_XP ; Pour Windows XP et plus, toute taille d'icône
    dll_Shell32 = OpenLibrary(#PB_Any, "Shell32.dll")
    If dll_Shell32
      *Guid = ?IID_IImageList
      SHGetFileInfo_(IconFile, 0, @FileInfo, SizeOf(SHFILEINFO), #SHGFI_SYSICONINDEX)
      hResult = CallFunction(dll_Shell32, "SHGetImageList", SHIL, *Guid, @ImageList.IImageList2)
      If hResult = 0
        ImageList\GetIcon(FileInfo\iIcon, #ILD_TRANSPARENT, @hIcon)
        ImageList\Release()
			EndIf
      CloseLibrary(dll_Shell32)
		EndIf
	Else ; Avant windows XP, icône 16*16 ou 32*32
    If SHIL = #SHIL_EXTRALARGE Or SHIL = #SHIL_LARGE
      SHGetFileInfo_(IconFile, 0, @InfosFile.SHFILEINFO, SizeOf(SHFILEINFO), #SHGFI_ICON | #SHGFI_LARGEICON)
      hIcon = InfosFile\hIcon
		Else
      SHGetFileInfo_(IconFile, 0, @InfosFile.SHFILEINFO, SizeOf(SHFILEINFO), #SHGFI_ICON | #SHGFI_SMALLICON)
      hIcon = InfosFile\hIcon
		EndIf
	EndIf
  ProcedureReturn hIcon
EndProcedure

Procedure.l LoadWindowFont(Bold = -1, Italic = -1, UnderLine = -1, Size.f = -1)
  Protected ncm.NONCLIENTMETRICS
  ncm\cbSize = SizeOf(NONCLIENTMETRICS)
  SystemParametersInfo_(#SPI_GETNONCLIENTMETRICS, SizeOf(NONCLIENTMETRICS), @ncm, 0)
  If Bold = 0
    ncm\lfMessageFont\lfWeight = 0
	ElseIf Bold = 1
    ncm\lfMessageFont\lfWeight = 700
	EndIf
  If Italic = 0
    ncm\lfMessageFont\lfItalic = 0
	ElseIf Italic = 1
    ncm\lfMessageFont\lfItalic = 1
	EndIf
  If UnderLine = 0
    ncm\lfMessageFont\lfUnderline = 0
	ElseIf UnderLine = 1
    ncm\lfMessageFont\lfUnderline = 1
	EndIf
  If Size > 0
    ncm\lfMessageFont\lfheight * Size
	EndIf
  
  ProcedureReturn CreateFontIndirect_(@ncm\lfMessageFont)
EndProcedure

Procedure ButtonIconTextGadget(Gadget, x, y, width, height, icon, text.s)
	Image = CreateImage(#PB_Any, width - 12, height - 12, 32)
	StartDrawing(ImageOutput(Image))
		font = LoadWindowFont()
		DrawingMode(#PB_2DDrawing_AlphaChannel)
		Box(0, 0, OutputWidth(), OutputHeight(), 0)
		DrawingMode(#PB_2DDrawing_Transparent | #PB_2DDrawing_AlphaBlend)
		DrawingFont(font)
		GetIconInfo_(icon,@info.ICONINFO)
		DrawImage(icon, (OutputWidth() - info\xHotspot * 2 - 4 - TextWidth(text)) / 2, OutputHeight() / 2 -info\yHotspot)
		DrawText((OutputWidth() - info\xHotspot * 2 - 4 - TextWidth(text)) / 2 + info\xHotspot * 2 + 4, (OutputHeight() - TextHeight(text)) / 2, text, $FF000000)
		DeleteObject_(font)
	StopDrawing()
	ProcedureReturn ButtonImageGadget(Gadget, x, y, width, height, ImageID(Image))
EndProcedure


If OpenWindow(0, 0, 0, 820, 600, "Test Boutons")
	
	icon = GetIconFile2("c:\", 32)
	ButtonIconTextGadget(#button1, 100, 50, 200, 48, icon, "Button example")
	DestroyIcon_(icon)
	
	Repeat
		Event = WaitWindowEvent()
		If Event = #PB_Event_Gadget
			Select EventGadget()
				Case #button1
					; votre code
			EndSelect
		EndIf
		
	Until Event = #PB_Event_CloseWindow
EndIf
DeleteObject_(font)
End

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
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: J'ai des Boutons

Message par MLD »

Bonjour LSI
Je n'ai pas encore essayer PB 4.40. Mais je garde ton code.
Il n'y a pas beaucoup d'amateur pour l'amélioration du graphisme des fenêtres.
Un truck qui serait bien, ce serait d'entourer le bouton qui a le focus par un petit liseré de couleur.
Programeurs, "programeuses", a vos claviers !
Michel
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: J'ai des Boutons

Message par Backup »

MLD a écrit :Il n'y a pas beaucoup d'amateur pour l'amélioration du graphisme des fenêtres.

ce a quoi je répondrai ,
il n'y a pas beaucoup de "nouveaux" qui utilisent le bouton recherche
du forum (avec le terme "Skin" par exemple ) , ou vont dans la rubrique Tuto du forum débutant ! ;)
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: J'ai des Boutons

Message par MLD »

Dobro a écrit :
MLD a écrit :Il n'y a pas beaucoup d'amateur pour l'amélioration du graphisme des fenêtres.

ce a quoi je répondrai ,
il n'y a pas beaucoup de "nouveaux" qui utilisent le bouton recherche
du forum (avec le terme "Skin" par exemple ) , ou vont dans la rubrique Tuto du forum débutant ! ;)

Mon cher Dobro

Il me semble que tu ne m'as pas trés bien compris.
Il ne sagit pas de "ripoliner" une fenêtre, mais de proposer des nouveaux gadgets ou pseudo-gadgets. Cela se fait dans d'autres langages: Exemple création de programmes OCX.
Quand au nouveau il n'y a que 30 ans qu'il programme en amateur. depuis CPM.
Puisqu'il suffit d'appuyer sur le bouton recherche pour trouver. Cherche donc un programme frame avec thème XP ou l'on puisse changer la couleur du trait a volonté + la couleur du texte.
Sans rancune.
Michel
Dernière modification par MLD le jeu. 01/oct./2009 13:08, modifié 2 fois.
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: J'ai des Boutons

Message par MLD »

A propos d'OCX serait'il possible de les utilisés avec PB ??
Aprés essais, aucun résultat satisfaisant.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: J'ai des Boutons

Message par Backup »

MLD a écrit :A propos d'OCX serait'il possible de les utilisés avec PB ??
Aprés essais, aucun résultat satisfaisant.

peut etre qu'avec Comate ? .... :roll:


ps: par nouveaux, j'entendais : sur notre Forum
Cherche donc un programme frame avec thème XP ou l'on puisse changer la couleur du trait a volonté + la couleur du texte.
et Purecolor ?
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: J'ai des Boutons

Message par Le Soldat Inconnu »

Un truck qui serait bien, ce serait d'entourer le bouton qui a le focus par un petit liseré de couleur.
Avec l'option #PB_gadget_Default, si je ne me trompe pas.
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
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: J'ai des Boutons

Message par MLD »

Dobro
Purecolor : uniquement la couleur du texte.

LSI
Merci, je regarde cela.

Bonne soirée a tous.

Michel
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: J'ai des Boutons

Message par Backup »

MLD a écrit :Dobro
Purecolor : uniquement la couleur du texte.

ben tu veux changer la couleur du trait d'une fenetre en particulier ?

c'est tout simplement pas possible sous XP !
puisque Xp décide de la couleur du trait des fenetres ..

la seule possibilitée c'est de Skinner !
ce que tu appel "ripoliner" ..

meme une grosse boite comme startdock avec windowblinds
sont passé par le systeme du skin , alors cherche pas a faire des trucs pas possible non plus ... :roll:

maintenant si tu veux revenir a des trucs raisonnable , le skin est parfaitement possible avec Purebasic ;)

ps : programmer sous CPM ? :lol:
et les cartes perforées ? non ? ha bah alors t'es bien un nouveau ;)
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: J'ai des Boutons

Message par MLD »

Dobro a écrit :
MLD a écrit :Dobro
Purecolor : uniquement la couleur du texte.

ben tu veux changer la couleur du trait d'une fenetre en particulier ?

c'est tout simplement pas possible sous XP !
puisque Xp décide de la couleur du trait des fenetres ..

la seule possibilitée c'est de Skinner !
ce que tu appel "ripoliner" ..

meme une grosse boite comme startdock avec windowblinds
sont passé par le systeme du skin , alors cherche pas a faire des trucs pas possible non plus ... :roll:

maintenant si tu veux revenir a des trucs raisonnable , le skin est parfaitement possible avec Purebasic ;)

ps : programmer sous CPM ? :lol:
et les cartes perforées ? non ? ha bah alors t'es bien un nouveau ;)
Non en fait c'était avec la machine de Pascal.
Pour infos les premiers Amstrad avec le CPU Z80 et CPM avait un basic intégré.

Avant l'utilisation de PB, je programmais en VB6 Pro. Il y avait un programme Frame.OCX qui fait exactement ce que je dit, et sans skin.
Comment faire en PB ???
Pesonnellement, je suis planter depuis pas mal de temp (même avec les Apis).
Peut-être qu'il ne me reste que quelques neurones ? Va savoir!
Donc pour le sport intellectuel des amis du forum, A vos claviers.
Bonne soirée a tous
Michel
Dernière modification par MLD le jeu. 01/oct./2009 17:23, modifié 1 fois.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: J'ai des Boutons

Message par Backup »

.........
Dernière modification par Backup le mer. 22/juin/2011 12:21, modifié 1 fois.
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: J'ai des Boutons

Message par MLD »

ton ocx faisait quoi exactement ?
Des cadres a bords arrondis plein ou transparent, avec ou sans texte, les traits du cadre de la couleur a ton choix, et s'il y a du texte, le texte pareil avec la couleur de ton choix. A l'intérieur de ce Frame tu peu mettre n'importe qu'el gadget.


peut etre justement qu'il skinai ta fenetre ?
avec un skin integré ... va savoir

Non je pense pas.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: J'ai des Boutons

Message par Backup »

a la difference de VB , purebasic est un langage de plus bas niveau

tout ce que tu décris est faisable en purebasic , mais pas sous la forme
un gadget , modifiable, enfin pas vraiment !

certains ici se sont deja amusé a se faire des boites de dialogue personnalisé :)

faire une pseudo fenetre a coin rond, c'est facile

en pb tu peux te creer une fenetre sans bordure
et du coup faire ce que tu veux....

j'ai meme personellement experimenté la creation de fenetre "graphique" de forme ronde (j'ai fait une horloge comme ça)

voila en purebasic tu peut te faire une fenetre sans bordure
et "dessiner" tes lignes comme tu le veux et de la couleur que tu veux !

en utilisant un call back pour pas que tes dessins s'effacent

en fait j'attendais de savoir exactement ce que tu voulais faire

je prendrai 5 minutes pour te faire un exemple :)
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: J'ai des Boutons

Message par MLD »

Merci Dodro
Mais pour ce soir c'est fini.
"Maman" sonne l'heure de la soupe. :P
salut
Répondre