Page 1 of 1

How to get and set the flag gadget?

Posted: Mon Mar 03, 2014 8:20 pm
by mestnyi
That's the way that it does not work

Code: Select all

    If OpenWindow(1, 0, 0, 600, 440, "Split Picture", #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_SizeGadget)
      StickyWindow(1, 1)
     
     
         TextGadget(213, 95, 10, 60, 25, "TextGadget",#PB_Text_Border)
          s= GetWindowLong_(GadgetID(213), #GWL_STYLE)
         exs= GetWindowLong_(GadgetID(213), #GWL_EXSTYLE)
        
         
         
        TextGadget(214, 95, 110, 60, 25, "TextGadget",0)
        SetWindowLong_(GadgetID (214), #GWL_STYLE,  s)
        SetWindowLong_(GadgetID (214), #GWL_EXSTYLE,  exs)
        InvalidateRect_(GadgetID(214),0,1) 
       
      EndIf
       
    Repeat
      Event=WaitWindowEvent()
     
      If Event=#PB_Event_CloseWindow And EventWindow()=1
      End
     EndIf
    ForEver
        
works with windows

Code: Select all

If OpenWindow(1, 0, 0, 600, 440, "Split Picture", #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_SizeGadget)
     
        OpenWindow(2, 0, 0, 600, 440, "Split Picture",  #PB_Window_BorderLess)
         
       s= GetWindowLong_(WindowID(2), #GWL_STYLE)
         
        SetWindowLong_(WindowID(1), #GWL_STYLE,  s)
       
      EndIf
       
    Repeat
      Event=WaitWindowEvent()
     
      If Event=#PB_Event_CloseWindow And EventWindow()=1
      End
     EndIf
    ForEver

Re: How to get and set the flag gadget?

Posted: Mon Mar 03, 2014 9:15 pm
by srod
Some styles for certain controls can only be set at creation time. That is, once the control has been created, certain styles cannot be altered.

Re: How to get and set the flag gadget?

Posted: Mon Mar 03, 2014 9:55 pm
by mestnyi
Then why when creating textgadget created with a border?

Code: Select all

    Global SelectGadget

    Procedure GetGadgetFlag(Gadget.i)
      CompilerIf #PB_Compiler_OS =#PB_OS_Windows
       ProcedureReturn GetWindowLongPtr_(GadgetID(Gadget), #GWL_STYLE) ;| GetWindowLongPtr_(GadgetID(Gadget), #GWL_EXSTYLE)
      CompilerElseIf #PB_Compiler_OS = #PB_OS_Linux 
       ProcedureReturn 0
      CompilerEndIf 
    EndProcedure
    
    Procedure GetWindow(Gadget.i)
     Static ID,hWnd 
     CompilerIf #PB_Compiler_OS = #PB_OS_Windows
     If IsGadget(Gadget) 
      If hWnd<>GadgetID(Gadget)
       hWnd=GadgetID(Gadget)
       ID=-1
      EndIf
      While ID =-1
       hWnd=GetParent_(hWnd)
       ID=GetProp_(hWnd,"PB_WindowID")-1
       If IsWindow(ID)
        ProcedureReturn ID
       EndIf
      Wend  
     EndIf  
     CompilerElseIf #PB_Compiler_OS = #PB_OS_Linux
      If IsGadget(Gadget) 
       ProcedureReturn Gtk_widget_get_toplevel_(GadgetID(Gadget))
      EndIf  
     CompilerEndIf  
    EndProcedure
    
    Procedure SetData(Gadget,GadgetData.s,gData) 
     CompilerIf #PB_Compiler_OS = #PB_OS_Linux   
      g_object_set_data_(GadgetID(Gadget),GadgetData,gData))   
     CompilerElseIf #PB_Compiler_OS = #PB_OS_Windows
      SetProp_(GadgetID(Gadget),GadgetData,gData)
     CompilerEndIf   
    EndProcedure   
     
    Procedure GetData(Gadget,GadgetData.s) 
     CompilerIf #PB_Compiler_OS = #PB_OS_Linux   
      ProcedureReturn  g_object_get_data_(GadgetID(Gadget),GadgetData)
     CompilerElseIf #PB_Compiler_OS = #PB_OS_Windows
      ProcedureReturn GetProp_(GadgetID(Gadget),GadgetData)
     CompilerEndIf   
    EndProcedure   

    
    Procedure PasteGadget(Gadget)
     If IsGadget(Gadget) 
      Protected  ID=Gadget
         Protected  Type=GadgetType(ID)
         Protected  w=GadgetWidth(ID)
         Protected  h=GadgetHeight(ID)
         
         Define$ Caption=GetGadgetText(ID)
         
         Protected  Flag=GetGadgetFlag(ID)
         Protected ParentWindow = GetData(ID,"Parent")
         Protected  OldGadgetList = UseGadgetList(WindowID(ParentWindow))
         
         If Type=#PB_GadgetType_Unknown
           Debug "пока не знаю что за гаджет"
         ElseIf Type=#PB_GadgetType_Button                             ;1                 
           ButtonGadget(ID, 0, 0, 0, 0,Caption,Flag)
         ElseIf Type=#PB_GadgetType_String
           StringGadget(ID, 0, 0, 0, 0,Caption,Flag)
         ElseIf Type=#PB_GadgetType_Text
           TextGadget(ID, 0, 0, 0, 0,Caption,Flag)
         EndIf
         ResizeGadget(ID,WindowMouseX(ParentWindow), WindowMouseY(ParentWindow), w,h)
         UseGadgetList(OldGadgetList)
         ProcedureReturn -1
        EndIf  
       EndProcedure
       
    Procedure CopyGadget(Gadget)
         Protected  ID=Gadget
         Protected  Type=GadgetType(ID)
         Protected  x=GadgetX(ID)
         Protected  y=GadgetY(ID)
         Protected  w=GadgetWidth(ID)
         Protected  h=GadgetHeight(ID)
         
         Define$ Caption=GetGadgetText(ID)
         Protected  Flag=GetGadgetFlag(ID)
         If Type=#PB_GadgetType_Unknown
           Debug "пока не знаю что за гаджет"
         ElseIf Type=#PB_GadgetType_Button                             ;1                 
           ButtonGadget(ID, 0, 0, 0, 0,Caption,Flag)
         ElseIf Type=#PB_GadgetType_String
           StringGadget(ID, 0, 0, 0, 0,Caption,Flag)
         ElseIf Type=#PB_GadgetType_Text
           TextGadget(ID, 0, 0, 0, 0,Caption,Flag)
         EndIf
         ResizeGadget(ID,x, y, w,h)
         
        SetData(Gadget,"Parent",GetWindow(Gadget))
       
     EndProcedure
   
     
     If OpenWindow(1, 0, 0, 600, 440, "Split Picture", #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_SizeGadget)
      StickyWindow(1, 1)
     
     
     
      ButtonGadget(230, 15, 375, 80, 25, "ButtonGadget",#PB_Button_Toggle)
         TextGadget(214, 95, 10, 60, 25, "TextGadget",#SS_NOTIFY);|#PB_Text_Border)
       
      EndIf
       
    Repeat
      Event=WaitWindowEvent()
     
      If Event =#PB_Event_Gadget
       SelectGadget = EventGadget()
        CopyGadget(SelectGadget)
      EndIf 
      
      If Event =#PB_Event_LeftClick
       SelectGadget= PasteGadget(SelectGadget)
       
      EndIf 
     
      If Event=#PB_Event_CloseWindow And EventWindow()=1
      End
     EndIf
    ForEver

Re: How to get and set the flag gadget?

Posted: Mon Mar 03, 2014 11:27 pm
by srod
Because you are using API window styles with a Purebasic function. It all checks out.

The problem is that when you use #PB_Text_Border, Purebasic sets the #WS_EX_CLIENTEDGE extended style and not a regular window style. All you are seeing is a confusion between regular and extended styles that is all.

I am not saying that you cannot do what you are after with some controls, I am saying that some controls will not allow you to alter certain styles after they have been created.

For example, switching InvalidateRect_() for SetWindowPos_() in your original code works for borders :

Code: Select all

    If OpenWindow(1, 0, 0, 600, 440, "Split Picture", #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_SizeGadget)
      StickyWindow(1, 1)
     
     
         TextGadget(213, 95, 10, 60, 25, "TextGadget",#PB_Text_Border)
          s= GetWindowLong_(GadgetID(213), #GWL_STYLE)
         exs= GetWindowLong_(GadgetID(213), #GWL_EXSTYLE)
        
         
         
        TextGadget(214, 95, 110, 60, 25, "TextGadget",0)
        SetWindowLong_(GadgetID (214), #GWL_STYLE,  s)
        SetWindowLong_(GadgetID (214), #GWL_EXSTYLE,  exs)
        SetWindowPos_(GadgetID(214), 0, 0, 0, 0, 0, #SWP_FRAMECHANGED|#SWP_DRAWFRAME|#SWP_NOMOVE|#SWP_NOSIZE|#SWP_NOZORDER)

       
      EndIf
       
    Repeat
      Event=WaitWindowEvent()
     
      If Event=#PB_Event_CloseWindow And EventWindow()=1
      End
     EndIf
    ForEver
However, change #PB_Text_Border to #PB_Text_Right and it does not work. Text justification is one of those things that Windows will not allow you to alter after the text gadget has been created.

Re: How to get and set the flag gadget?

Posted: Tue Mar 04, 2014 3:38 am
by RASHAD
F12 to toggle between RTL & LTR

# 1:

Code: Select all

OpenWindow(0,0,0,400,300,"Test",#PB_Window_MaximizeGadget| #PB_Window_ScreenCentered);| #PB_Window_SizeGadget)
StickyWindow(0, 1)

 TextGadget(213, 95, 10, 200, 25, "TextGadget",#PB_Text_Border)
  s= GetWindowLong_(GadgetID(213), #GWL_STYLE)
 exs= GetWindowLong_(GadgetID(213), #GWL_EXSTYLE) 
 
TextGadget(214, 95, 110, 200, 25, "TextGadget")
SetWindowLong_(GadgetID (214), #GWL_STYLE,  s)
SetWindowLong_(GadgetID (214), #GWL_EXSTYLE,  exs)
SetWindowPos_(GadgetID(214), 0, 0, 0, 0, 0, #SWP_FRAMECHANGED|#SWP_DRAWFRAME|#SWP_NOMOVE| #SWP_NOSIZE|#SWP_NOZORDER)

Repeat
  Select WaitWindowEvent()
     
      Case #PB_Event_CloseWindow
            Quit = 1
       
     
      Case #PB_Event_Gadget
            Select EventGadget()
             Case 1           
            EndSelect
             
      Case #WM_KEYDOWN
            Run ! 1
            If Run = 1 And EventwParam() = $7B   ;F12 key
               SetWindowLongPtr_(GadgetID(214),#GWL_EXSTYLE, GetWindowLongPtr_(GadgetID(214), #GWL_EXSTYLE)|#WS_EX_LAYOUTRTL)
               InvalidateRect_(GadgetID(214),0,1)
            ElseIf Run = 0 And EventwParam() = $7B
                SetWindowLongPtr_(GadgetID(214),#GWL_EXSTYLE, GetWindowLongPtr_(GadgetID(214), #GWL_EXSTYLE)&~#WS_EX_LAYOUTRTL)
               InvalidateRect_(GadgetID(214),0,1)
            EndIf           
            
  EndSelect

Until Quit = 1
End
# 2:

Code: Select all

OpenWindow(0,0,0,400,300,"Test",#PB_Window_MaximizeGadget| #PB_Window_ScreenCentered);| #PB_Window_SizeGadget)
StickyWindow(0, 1)

 TextGadget(213, 95, 10, 200, 25, "TextGadget",#SS_CENTERIMAGE|#PB_Text_Border)
  s= GetWindowLong_(GadgetID(213), #GWL_STYLE)
 exs= GetWindowLong_(GadgetID(213), #GWL_EXSTYLE) 
 
TextGadget(214, 95, 110, 200, 25, "TextGadget")
SetWindowLong_(GadgetID (214), #GWL_STYLE,  s)
SetWindowLong_(GadgetID (214), #GWL_EXSTYLE,  exs)
SetWindowPos_(GadgetID(214), 0, 0, 0, 0, 0, #SWP_FRAMECHANGED| #SWP_DRAWFRAME| #SWP_NOMOVE| #SWP_NOSIZE| #SWP_NOZORDER)
InvalidateRect_(GadgetID(214),0,1)

Repeat
  Select WaitWindowEvent()
     
      Case #PB_Event_CloseWindow
            Quit = 1
       
     
      Case #PB_Event_Gadget
            Select EventGadget()
             Case 1           
            EndSelect
             
      Case #WM_KEYDOWN
            Run ! 1
            If Run = 1 And EventwParam() = $7B   ;F12 key
               SetWindowLongPtr_(GadgetID(214),#GWL_STYLE, GetWindowLongPtr_(GadgetID(214), #GWL_STYLE)| #PB_Text_Right )
               InvalidateRect_(GadgetID(214),0,1)
            ElseIf Run = 0 And EventwParam() = $7B
                SetWindowLongPtr_(GadgetID(214),#GWL_STYLE, GetWindowLongPtr_(GadgetID(214), #GWL_STYLE)&~ #PB_Text_Right)
               InvalidateRect_(GadgetID(214),0,1)
            EndIf           
            
  EndSelect

Until Quit = 1
End

Re: How to get and set the flag gadget?

Posted: Tue Mar 04, 2014 7:18 am
by mestnyi
So why it works

Code: Select all

Procedure.q GlueNumbers(Number1.l,Number2.l)
 Protected Factor.q :Factor=Number2+257
 ProcedureReturn (Number1*Factor)+Number2
EndProcedure  

Procedure.l DivideNumber1(GlueNumbers.q,Number2.l)
 Protected Factor.q :Factor=Number2+257
 ProcedureReturn Int(GlueNumbers/Factor)
EndProcedure  

Procedure.l DivideNumber2(GlueNumbers.q,Number2.l)
 Protected Factor.q :Factor=Number2+257
 ProcedureReturn GlueNumbers%Factor
EndProcedure 

x.l=1409548800
y.l=1342308352

z.q=GlueNumbers(x,y)

x.l= DivideNumber1(z,y)
y.l= DivideNumber2(z,y)

Debug x
Debug y
so well, why not

Code: Select all

Procedure.q GlueNumbers(Number1.l,Number2.l)
 Protected Factor.q :Factor=Number2+257
 ProcedureReturn (Number1*Factor)+Number2
EndProcedure  

Procedure.l DivideNumber1(GlueNumbers.q,Number2.l)
 Protected Factor.q :Factor=Number2+257
 ProcedureReturn Int(GlueNumbers/Factor)
EndProcedure  

Procedure.l DivideNumber2(GlueNumbers.q,Number2.l)
 Protected Factor.q :Factor=Number2+257
 ProcedureReturn GlueNumbers%Factor
EndProcedure 


    Procedure GetGadgetFlag(Gadget.i)
      CompilerIf #PB_Compiler_OS =#PB_OS_Windows
        ProcedureReturn  GlueNumbers(GetWindowLongPtr_(GadgetID(Gadget), #GWL_EXSTYLE),GetWindowLongPtr_(GadgetID(Gadget), #GWL_STYLE))
      CompilerElseIf #PB_Compiler_OS = #PB_OS_Linux 
       ProcedureReturn 0
      CompilerEndIf 
    EndProcedure
    
    Procedure SetGadgetFlag(Gadget.i,Flag,CopyGadget)
      CompilerIf #PB_Compiler_OS =#PB_OS_Windows
        SetWindowLongPtr_(GadgetID(Gadget), #GWL_STYLE, DivideNumber1(Flag,GetWindowLongPtr_(GadgetID(CopyGadget), #GWL_STYLE))) 
        SetWindowLongPtr_(GadgetID(Gadget), #GWL_EXSTYLE, DivideNumber2(Flag,GetWindowLongPtr_(GadgetID(CopyGadget), #GWL_STYLE)))
        SetWindowPos_(GadgetID(Gadget), 0, 0, 0, 0, 0, #SWP_FRAMECHANGED| #SWP_DRAWFRAME| #SWP_NOMOVE| #SWP_NOSIZE| #SWP_NOZORDER)
        InvalidateRect_(GadgetID(Gadget),0,1)
       ProcedureReturn 
      CompilerElseIf #PB_Compiler_OS = #PB_OS_Linux 
       ProcedureReturn 0
      CompilerEndIf 
    EndProcedure


If OpenWindow(1, 0, 0, 600, 440, "Split Picture", #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_SizeGadget)
      StickyWindow(1, 1)
     
     
        TextGadget(213, 95, 10, 60, 25, "TextGadget",#PB_Text_Border)
        Flag= GetGadgetFlag(213)
         
        TextGadget(214, 95, 110, 60, 25, "TextGadget",0)
        SetGadgetFlag(214,Flag,213)
       
      EndIf
       
    Repeat
      Event=WaitWindowEvent()
     
      If Event=#PB_Event_CloseWindow And EventWindow()=1
      End
     EndIf
    ForEver
        
Or how else to make the procedures?

Re: How to get and set the flag gadget?

Posted: Tue Mar 04, 2014 9:17 am
by srod
I might be willing to help if you explained what those functions are supposed to do; just looks completely superfluous to me and almost nonsensical? Beside's the code crashes here!

I have already explained and demonstrated how to achieve what you were originally trying to do and explained the limitations of this approach. It is a hack at best.

Re: How to get and set the flag gadget?

Posted: Thu Mar 06, 2014 6:27 am
by mestnyi
I might be willing to help if you explained what those functions

Code: Select all

;----------------------

    Procedure.q GlueNumbers(Number1.l,Number2.l)
     ProcedureReturn (Number1 * 6000000000)|Number2
    EndProcedure  

    Procedure.l DivideNumber1(GlueNumbers.q)
     ProcedureReturn Int(GlueNumbers / 6000000000)
    EndProcedure  

    Procedure.l DivideNumber2(GlueNumbers.q)
     ProcedureReturn GlueNumbers % 6000000000
    EndProcedure 


    ;----------------------

    Procedure GetGadgetStyle(Gadget.i)
      CompilerIf #PB_Compiler_OS =#PB_OS_Windows
       ProcedureReturn GetWindowLongPtr_(GadgetID(Gadget), #GWL_STYLE)
      CompilerElseIf #PB_Compiler_OS = #PB_OS_Linux 
       ProcedureReturn 0
      CompilerEndIf 
    EndProcedure
    
    Procedure SetGadgetStyle(Gadget.i,Style)
      CompilerIf #PB_Compiler_OS =#PB_OS_Windows
        If (Style &~ 1342308480) = 0
          Style = GetWindowLong_(GadgetID(Gadget), #GWL_STYLE)|Style
        EndIf
        SetWindowLongPtr_(GadgetID(Gadget), #GWL_STYLE, Style) 
        SetWindowPos_(GadgetID(Gadget), 0, 0, 0, 0, 0, #SWP_FRAMECHANGED| #SWP_DRAWFRAME| #SWP_NOMOVE| #SWP_NOSIZE| #SWP_NOZORDER)
        InvalidateRect_(GadgetID(Gadget),0,1)
      CompilerElseIf #PB_Compiler_OS = #PB_OS_Linux 
       ProcedureReturn 0
      CompilerEndIf 
    EndProcedure
    
    ;----------------------
    
    Procedure GetGadgetExStyle(Gadget.i)
      CompilerIf #PB_Compiler_OS =#PB_OS_Windows
        ProcedureReturn GetWindowLongPtr_(GadgetID(Gadget), #GWL_EXSTYLE)
       ProcedureReturn 0
      CompilerEndIf 
    EndProcedure
    
    Procedure SetGadgetExStyle(Gadget.i,ExStyle)
     Protected *ExStyle
      CompilerIf #PB_Compiler_OS =#PB_OS_Windows
       *ExStyle = GetWindowLong_(GadgetID(Gadget), #GWL_EXSTYLE) 
       If *ExStyle & ExStyle = #False 
        SetWindowLongPtr_(GadgetID(Gadget), #GWL_EXSTYLE, *ExStyle|ExStyle)
        SetWindowPos_(GadgetID(Gadget), 0, 0, 0, 0, 0, #SWP_FRAMECHANGED| #SWP_DRAWFRAME| #SWP_NOMOVE| #SWP_NOSIZE| #SWP_NOZORDER)
        InvalidateRect_(GadgetID(Gadget),0,1)
       EndIf
      CompilerElseIf #PB_Compiler_OS = #PB_OS_Linux 
       ProcedureReturn 0
      CompilerEndIf 
    EndProcedure
    
    ;----------------------
    
    Procedure.q GetGadgetFlag(Gadget.i)
     Protected Style.l, ExStyle.l
      Style=GetGadgetStyle(Gadget)
      ExStyle=GetGadgetExStyle(Gadget)
      
      Debug Style
      Debug ExStyle
      
      ProcedureReturn GlueNumbers(Style,ExStyle)
    EndProcedure
    
    Procedure SetGadgetFlag(Gadget.i,Flag.q)
     Protected Style.l, ExStyle.l
      Style=DivideNumber1(Flag)
      ExStyle=DivideNumber2(Flag)
      
      Debug Style
      Debug ExStyle
      
      SetGadgetStyle(Gadget,Style)
      SetGadgetExStyle(Gadget,ExStyle)
    EndProcedure
    
    ;----------------------
    
If OpenWindow(1, 0, 0, 600, 440, "Split Picture", #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_SizeGadget)
      StickyWindow(1, 1)
     
     
        TextGadget(213, 95, 10, 160, 25, "TextGadget",#PB_Text_Border|#PB_Text_Right)
        Flag.q= GetGadgetFlag(213)
         
        TextGadget(214, 95, 110, 160, 25, "TextGadget",#PB_Text_Center)
        SetGadgetFlag(214,Flag)
        
       
        
      EndIf
       
    Repeat
      Event=WaitWindowEvent()
     
      If Event=#PB_Event_CloseWindow And EventWindow()=1
      End
     EndIf
    ForEver
       
        

only needed a cross platform do not know how to do

Re: How to get and set the flag gadget?

Posted: Thu Mar 06, 2014 5:36 pm
by mestnyi
What is not clear or nothing to offer?