Colorier le contour d'un Editeur

Partagez votre expérience de PureBasic avec les autres utilisateurs.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Colorier le contour d'un Editeur

Message par nico »

Code : Tout sélectionner

Global editeur


Procedure Editeur(Window.l,Message,Wparam,lparam)
    
  Editeur_Origin = GetProp_(Window,"Editeur_Origin")
    Select Message
      Case #WM_NCPAINT
      result=CallWindowProc_(Editeur_Origin,Window,Message,Wparam,lparam)
      Hdc=GetDC_(Window)
      hpen=CreatePen_(#PS_SOLID,1,RGB(255,0,0))        
      If Window=editeur
          SelectObject_(hdc,hpen)
          MoveToEx_(hdc,-1,-1,#Null)
          LineTo_(hdc,290-2,-1)
          LineTo_(hdc,290-2,180-2)
          LineTo_(hdc,-1,180-2)
          SelectObject_(hdc,hpen2)
          LineTo_(hdc,-1,-1)
      EndIf 
      DeleteObject_(hpen)
      ReleaseDC_(Window,Hdc) 
      ProcedureReturn result
  EndSelect
              
  ProcedureReturn CallWindowProc_(Editeur_Origin,Window,Message,Wparam,lparam)
EndProcedure 



Procedure.l Editeur_Init(Window.l)
    Editeur_Origin = GetProp_(Window,"Editeur_Origin")
    If Editeur_Origin=0
        Editeur_Origin = SetWindowLong_(Window,#GWL_WNDPROC,@Editeur())
        SetProp_(Window,"Editeur_Origin",Editeur_Origin)
    EndIf 
EndProcedure 




If OpenWindow(0, 0, 0, 400, 300, "EditorGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0)) 

    hbruh1=CreateSolidBrush_(RGB(255,255,0))
    SetClassLong_(WindowID(0), #GCL_HBRBACKGROUND, hbruh1)
    InvalidateRect_(window0,0,1)
    
;     Décommenter ces lignes, elles permettent d'épaissir la bordure
;     en utilisant un container, on peut ainsi la colorier ou afficher une image
;    
;     Hcontainer=ContainerGadget(0, 30, 5, 296, 186, 0)

;----------------------------------------------
;     hbruh2=CreateSolidBrush_(RGB(0,0,255))
;--------------------- ou ---------------------
;     Hbitmap=LoadImage(0,"Votre Image")
;     hbruh2=CreatePatternBrush_(Hbitmap)
;----------------------------------------------
;     SetClassLong_(Hcontainer, #GCL_HBRBACKGROUND, hbruh2)
;     InvalidateRect_(Hcontainer,0,1)
    
    
    editeur=EditorGadget(1, 3, 3, 290, 180) 
    SetWindowLong_(editeur, #GWL_STYLE, GetWindowLong_(editeur, #GWL_STYLE)|#WS_BORDER)
    SetWindowLong_(editeur, #GWL_EXSTYLE, GetWindowLong_(editeur, #GWL_EXSTYLE)!#WS_EX_CLIENTEDGE)
    
    Editeur_Init(editeur)

    
    For a = 0 To 25 
      AddGadgetItem(1, a, "Ligne "+Str(a)) 
    Next 
    
    
  Repeat 
    event = WaitWindowEvent() 

    Select event 
      Case #PB_Event_Menu 
        Select EventMenu() 

        EndSelect 
    EndSelect 
  Until event = #PB_Event_CloseWindow 
  DeleteObject_(hbruh1)
  DeleteObject_(hbruh2)  
EndIf 
 
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

J'ai repris le code de Progi pour modifier son apparence:

L'exe: http://home.tele2.fr/purebasic/Demo_Editeur.exe

Le source:

Code : Tout sélectionner

Global editeur,editeur2,Nbligne 


Procedure SetColorTextEditorLine(Color) 
    format.CHARFORMAT 
    format\cbSize = SizeOf(CHARFORMAT) 
    format\dwMask = #CFM_COLOR 
    format\crTextColor = Color 
     SendMessage_ ( editeur2, #EM_SETCHARFORMAT , #SCF_ALL , @format) 
EndProcedure 


Procedure Proc_Window(Window.l,Message,Wparam,lparam) 

  Proc_Origin = GetProp_(Window,"Proc_Origin") 
  
    Select Message    
      Case #WM_COMMAND 
          If lparam = editeur 
            Select wparam >>16 
              Case #EN_VSCROLL 
                Debug "#EN_VSCROLL" 
                SendMessage_(editeur, #EM_GETSCROLLPOS, 0, @egOne.POINT) 
                egOne\x = 0 
                SendMessage_(editeur2, #EM_SETSCROLLPOS, 0, egOne) 
                
              Case #EN_UPDATE 
                    SendMessage_(editeur, #EM_GETSCROLLPOS, 0, @egOne.POINT) 
                    egOne\x = 0 
                    SendMessage_(editeur2, #EM_SETSCROLLPOS, 0, egOne)  
                
              Case #EN_CHANGE 
                If editeur2 
                    Resultat = CountGadgetItems(1) 
                     If Nbligne<Resultat 
                        a$="" 
                        a$=GetGadgetText(2) 
                        For a=Nbligne+1 To Resultat 
                          a$=a$+Str(a)+Chr(10) 
                        Next a 
                        SetGadgetText(2,a$) 
                    EndIf 
                    If Nbligne>Resultat 
                        a$=GetGadgetText(2) 
                        For a=1 To Resultat 
                          Position = FindString(a$, Chr(10), Position+1) 
                        Next a 
                        a$=PeekS(@a$,Position) 
                        SetGadgetText(2,a$) 
                    EndIf 
                    Nbligne=Resultat 
                    SendMessage_(editeur, #EM_GETSCROLLPOS, 0, @egOne.POINT) 
                    egOne\x = 0 
                    SendMessage_(editeur2, #EM_SETSCROLLPOS, 0, egOne) 
                EndIf 
           EndSelect 
           EndIf 
  EndSelect 
              
  ProcedureReturn CallWindowProc_(Proc_Origin,Window,Message,Wparam,lparam) 
EndProcedure 

Procedure Editeur(Window.l,Message,Wparam,lparam) 

  Editeur_Origin = GetProp_(Window,"Editeur_Origin") 
  
    Select Message 

      Case 7 
          If Window=editeur2 
              ProcedureReturn 0 
          ElseIf Window=editeur 
              SendMessage_(editeur2, #EM_HIDESELECTION,1,0) 
          EndIf 
      
      Case #WM_NCPAINT 
          result=CallWindowProc_(Editeur_Origin,Window,Message,Wparam,lparam) 
          Hdc=GetDC_(Window) 
          hpen=CreatePen_(#PS_SOLID,1,RGB(168,168,168)) 
          hpen2=CreatePen_(#PS_SOLID,1,RGB(248, 248, 220)) 
                    
          If Window=editeur 
          
              SelectObject_(hdc,hpen) 
              MoveToEx_(hdc,-1,-1,#Null) 
              LineTo_(hdc,250-2,-1) 
              LineTo_(hdc,250-2,180-2) 
              LineTo_(hdc,-2,180-2) 
              MoveToEx_(hdc,-1,180-3,#Null) 
              SelectObject_(hdc,hpen2) 
              LineTo_(hdc,-1,-1) 
          
          ElseIf Window=editeur2 
              SelectObject_(hdc,hpen) 
              MoveToEx_(hdc,-1,-1,#Null) 
              LineTo_(hdc,40-1,-1) 
              MoveToEx_(hdc,40-2,0,#Null) 
               SelectObject_(hdc,hpen2) 
               LineTo_(hdc,40-2,180-2) 
               SelectObject_(hdc,hpen) 
               LineTo_(hdc,-1,180-2) 
               LineTo_(hdc,-1,-1) 
          
          EndIf 
          DeleteObject_(hpen) 
          DeleteObject_(hpen2) 
          ReleaseDC_(Window,Hdc) 
      ProcedureReturn result 

  EndSelect 
              
  ProcedureReturn CallWindowProc_(Editeur_Origin,Window,Message,Wparam,lparam) 
EndProcedure 


Procedure.l Window_Init(Window.l) 
    Proc_Origin = GetProp_(Window,"Proc_Origin") 
    If Proc_Origin=0 
        Proc_Origin = SetWindowLong_(Window,#GWL_WNDPROC,@Proc_Window()) 
        SetProp_(Window,"Proc_Origin",Proc_Origin) 
    EndIf 
EndProcedure 

Procedure.l Editeur_Init(Window.l) 
    Editeur_Origin = GetProp_(Window,"Editeur_Origin") 
    If Editeur_Origin=0 
        Editeur_Origin = SetWindowLong_(Window,#GWL_WNDPROC,@Editeur()) 
        SetProp_(Window,"Editeur_Origin",Editeur_Origin) 
    EndIf 
EndProcedure 


If OpenWindow(0, 0, 0, 400, 280, "EditorGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0)) 

    hbruh1=CreateSolidBrush_(RGB(255, 255, 255)) 
    SetClassLong_(WindowID(0), #GCL_HBRBACKGROUND, hbruh1) 
    
    
    Hcontainer=ContainerGadget(0, 30, 30, 318, 208, 0) 
    
    Window_Init(Hcontainer) 
        
;     CatchImage(0, ?Image) 
; 
;     hbruh2=CreatePatternBrush_(ImageID(0)) 
;     SetClassLong_(Hcontainer, #GCL_HBRBACKGROUND, hbruh2) 
;     InvalidateRect_(Hcontainer,0,1) 
    
    editeur=EditorGadget(1, 54, 14, 250, 180) 
    editeur2=EditorGadget(2, 14, 14, 40, 180,#PB_Editor_ReadOnly) 

    Editeur_Init(editeur) 
    Editeur_Init(editeur2) 
    
    SendMessage_(editeur, #EM_SETEVENTMASK, 0, #ENM_UPDATE | #ENM_CHANGE | #ENM_SCROLL | #ENM_KEYEVENTS) 
    SetWindowLong_(editeur, #GWL_STYLE, GetWindowLong_(editeur, #GWL_STYLE)|#WS_BORDER) 
    SetWindowLong_(editeur, #GWL_EXSTYLE, GetWindowLong_(editeur, #GWL_EXSTYLE)!#WS_EX_CLIENTEDGE) 
    SetWindowPos_(editeur, #Null, #Null, #Null, #Null, #Null,#SWP_NOMOVE|#SWP_NOSIZE|#SWP_NOZORDER|#SWP_NOACTIVATE|#SWP_FRAMECHANGED) 
    RedrawWindow_(editeur, #Null, #Null,#RDW_INVALIDATE|#RDW_NOCHILDREN|#RDW_UPDATENOW|#RDW_FRAME) 
    
  

    SendMessage_(editeur2,#EM_SHOWSCROLLBAR,#SB_VERT,#False) 
    SendMessage_(editeur2,#EM_SHOWSCROLLBAR,#SB_HORZ,#False) 
    
    SetWindowLong_(editeur2, #GWL_STYLE, GetWindowLong_(editeur2, #GWL_STYLE)|#WS_BORDER) 
    SetWindowLong_(editeur2, #GWL_EXSTYLE, GetWindowLong_(editeur2, #GWL_EXSTYLE)!#WS_EX_CLIENTEDGE) 
    SetWindowPos_(editeur2, #Null, #Null, #Null, #Null, #Null,#SWP_NOMOVE|#SWP_NOSIZE|#SWP_NOZORDER|#SWP_NOACTIVATE|#SWP_FRAMECHANGED) 
    RedrawWindow_(editeur2, #Null, #Null,#RDW_INVALIDATE|#RDW_NOCHILDREN|#RDW_UPDATENOW|#RDW_FRAME) 

    egPara.PARAFORMAT2 
    egPara\cbSize = SizeOf(PARAFORMAT2) 
    egPara\dwMask = #PFM_ALIGNMENT 
    egpara\wAlignment = #PFA_RIGHT 
    SendMessage_(editeur2, #EM_SETPARAFORMAT, #SCF_ALL, @egPara) 
    
    SendMessage_(editeur2, #EM_SETBKGNDCOLOR, 0, RGB(248, 248, 220)) 
    

    SetColorTextEditorLine(RGB(255,0,0)) 
    
    For a = 1 To 100 
      AddGadgetItem(1, a, "Ligne "+Str(a))  
    Next 

  Repeat 
    event = WaitWindowEvent() 
    Select event 
      Case #PB_Event_Menu 
        Select EventMenu() 

        EndSelect 
    EndSelect 
  Until event = #PB_Event_CloseWindow 
  DeleteObject_(hbruh1)    
  DeleteObject_(hbruh2) 
EndIf 

; DataSection 
; Image: IncludeBinary "NouveauCadre.bmp" 
; EndDataSection 
Image
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

C'est cadeau.... Bon boulot...
Répondre