PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



SpinGadget

Сообщений 1 страница 30 из 39

1

Код:
;================================================================ 
; Program:            ListIcon FillByGadget Sample 
; Author:             netmaestro 
; Date:               January 7, 2007 
; Target OS:          Windows All 
; Target Compiler:    PureBasic 4.02 
; License:            Free, Unrestricted, Credit appreciated 
;                     but not required 
;================================================================ 

#LVM_SUBITEMHITTEST = #LVM_FIRST + 57 
#LVM_GETSUBITEMRECT = #LVM_FIRST + 56 

Global oldproc 
Global currentitem, currentsubitem 


Procedure MainWindowCallBack(hwnd, msg, wparam, lparam) 
  result = #PB_ProcessPureBasicEvents 

  Select msg 
    Case #WM_DRAWITEM 
      
      *lpdis.DRAWITEMSTRUCT = lparam 
      Dim itemrect.RECT(3) 
      For i = 1 To 3 
        RtlZeroMemory_(@itemrect(i),SizeOf(RECT)) 
        itemrect(i)\top = i 
        SendMessage_(*lpdis\hwndItem, #LVM_GETSUBITEMRECT, *lpdis\itemid, @itemrect(i)) 
        text$ = GetGadgetItemText(GetDlgCtrlID_(*lpdis\hwndItem), *lpdis\itemid, i) 
        SelectObject_(*lpdis\hDC, GetStockObject_(#NULL_PEN)) 
        WhiteBrush = CreateSolidBrush_(#White) 
        SelectObject_(*lpdis\hDC, WhiteBrush) 
        Rectangle_(*lpdis\hDC, itemrect(i)\left, itemrect(i)\top, itemrect(i)\right, itemrect(i)\bottom) 
        TextOut_(*lpdis\hDC, itemrect(i)\left+4, itemrect(i)\top+4, text$, Len(text$)) 
        DeleteObject_(WhiteBrush) 
      Next 

    Case #WM_MEASUREITEM 
    
      *lpmis.MEASUREITEMSTRUCT = lparam 
      *lpmis\itemheight = 20 
      

  EndSelect 
  
  ProcedureReturn result 
  
EndProcedure 

Procedure ResizeCombo(hwnd)
  RtlZeroMemory_(@itemrect.RECT,SizeOf(RECT)) 
  itemrect\top = currentsubitem 
  SendMessage_(hwnd,#LVM_GETSUBITEMRECT, currentitem, @itemrect)       
  ResizeGadget(1,itemrect\left,itemrect\top,itemrect\right-itemrect\left,#PB_Ignore)
  InvalidateRect_(GadgetID(1),0,1)
EndProcedure

Procedure SubClass_LV(hwnd, msg, wparam, lparam) 
  result = CallWindowProc_(oldproc, hwnd, msg, wparam, lparam) 
  
  If msg = #WM_RBUTTONDOWN Or msg = #WM_LBUTTONDOWN 
    GetCursorPos_(@cp.POINT) 
    MapWindowPoints_(0,hwnd,@cp,1) 
    HitInfo.LVHITTESTINFO 
    Hitinfo\pt\x = cp\x 
    HitInfo\pt\y = cp\y 
    SendMessage_(hwnd,#LVM_SUBITEMHITTEST ,0,@HitInfo) 
    If hitinfo\isubitem > 0 And HitInfo\iItem >= 0 
      currentitem    = hitinfo\iitem 
      currentsubitem = hitinfo\isubitem 
      RtlZeroMemory_(@itemrect.RECT,SizeOf(RECT)) 
      itemrect\top = hitinfo\iSubItem 
      SendMessage_(hwnd,#LVM_GETSUBITEMRECT, hitinfo\iitem, @itemrect) 
      If HitInfo\iSubItem = 2 ; номер столбца где должно отображатся
        ResizeGadget(1, itemrect\left, itemrect\top, itemrect\right-itemrect\left, itemrect\bottom-itemrect\top) 
        SetGadgetText(1,GetGadgetItemText(0,currentitem,currentsubitem))
        SetFocus_(GadgetID(1))
        HideGadget(1,0)
      Else 
        HideGadget(1,1) 
      EndIf 
    Else 
      HideGadget(1,1) 
    EndIf 
  ElseIf msg=#WM_HSCROLL Or msg=#WM_VSCROLL 
    ResizeCombo(hwnd)
  ElseIf msg=#WM_NOTIFY 
    *nmHEADER.HD_NOTIFY = lParam 
    Select *nmHEADER\hdr\code 
      Case #HDN_ITEMCHANGING
        ResizeCombo(hwnd)
    EndSelect 

  EndIf 
  
  ProcedureReturn result 
  
EndProcedure 

OpenWindow(0,0,0,520,240,"",$CF0001) 
SetWindowCallback(@MainWindowCallBack()) 

ListIconGadget(0,0,0,520,140,"",0,#PB_ListIcon_GridLines|#LVS_OWNERDRAWFIXED) 
oldproc = SetWindowLong_(GadgetID(0), #GWL_WNDPROC, @SubClass_LV()) 
AddGadgetColumn(0,1,"Название",100) 
AddGadgetColumn(0,2,"Значение",100) 
AddGadgetItem(0, -1, Chr(10) + "Left" + Chr(10) + "5" + Chr(10) ) 
AddGadgetItem(0, -1, Chr(10) + "Top" + Chr(10) + "5" + Chr(10)  ) 
AddGadgetItem(0, -1, Chr(10) + "Width" + Chr(10) + "350" + Chr(10) ) 
AddGadgetItem(0, -1, Chr(10) + "Height" + Chr(10) + "200" + Chr(10)  ) 


SpinGadget(1, 0,0,0,0,0,500,#PB_Spin_Numeric) 
SetParent_(GadgetID(1),GadgetID(0)) 
HideGadget(1,1) 

Repeat 

  EventID = WaitWindowEvent() 
  Select EventID 
    Case #PB_Event_Gadget 
      Select EventGadget() 
        Case 1 
          SetGadgetItemText(0, currentitem, GetGadgetText(1), currentsubitem) 
          
      EndSelect 
  EndSelect 

Until EventID = #WM_CLOSE

не знаю как спросить даже, но попробую, спингаджет не правильно помешается в листиконгаджет а комбобох правильно. Как это исправить?

Отредактировано mestnyi (26.09.2013 23:02:07)

0

2

SpinGadget состоит из двух контролов - редактора (StringGadget) и стрелочек.
В коде дочерним окном таблицы сделан только редактор.

Проблему можно решить убрав SetParent_() и перед SpinGadget, разместив строку UseGadgetList(GadgetID(0)).

0

3

Пётр

SpinGadget состоит из двух контролов

об этом я думал но толку мало,   спасибо.
А здесь как можно решит эту проблему

Код:
;================================================================ 
; Program:            ListIcon FillByGadget Sample 
; Author:             netmaestro 
; Date:               January 7, 2007 
; Target OS:          Windows All 
; Target Compiler:    PureBasic 4.02 
; License:            Free, Unrestricted, Credit appreciated 
;                     but not required 
;================================================================ 

#LVM_SUBITEMHITTEST = #LVM_FIRST + 57 
#LVM_GETSUBITEMRECT = #LVM_FIRST + 56 

Global oldproc 
Global currentitem, currentsubitem 


Procedure SpinGadgetV(Gadget,left,top,width,heigth,min,max,pos=0,textpos=0 )
  Container = ContainerGadget(#PB_Any ,left+2,top+2,width,heigth-1); ,#PB_Container_Flat
  
  StringGadget(Gadget,0,0,width-16,heigth-1,"",textpos|#PB_String_Numeric)
  SetParent_(GadgetID(Gadget),GadgetID(Container))
  
  CreateUpDownControl_(#WS_CHILD|#WS_VISIBLE|#UDS_SETBUDDYINT|#UDS_ARROWKEYS|#UDS_WRAP,width-16,-1,0,heigth+1,GadgetID(Container),1,GetModuleHandle_(0),GadgetID(Gadget),max,min,pos)
  CloseGadgetList()
  SetClassLong_(GadgetID(Container),#GCL_HBRBACKGROUND,CreateSolidBrush_(RGB(0, 255, 0)))
  InvalidateRect_(GadgetID(Gadget), 0, 1)
EndProcedure 

Procedure SpinGadgetV_(Gadget,left,top,width,heigth,min,max,pos=0,textpos=2 )
  ContainerGadget(Gadget ,left+2,top+2,width,heigth-1); ,#PB_Container_Flat
  
  StringGadget = StringGadget(#PB_Any,0,0,width-16,heigth-1,"",textpos|#PB_String_Numeric)
  SetParent_(GadgetID(StringGadget),GadgetID(Gadget))
  CreateUpDownControl_(#WS_CHILD|#WS_VISIBLE|#UDS_SETBUDDYINT|#UDS_ARROWKEYS,width-16,-1,0,heigth+1,GadgetID(Gadget),1,GetModuleHandle_(0),GadgetID(StringGadget),max,min,pos)
  CloseGadgetList()
  ;SetClassLong_(GadgetID(Gadget),#GCL_HBRBACKGROUND,CreateSolidBrush_(RGB(0, 255, 0)))
  InvalidateRect_(GadgetID(Gadget), 0, 1)
EndProcedure 

Procedure MainWindowCallBack(hwnd, msg, wparam, lparam) 
  result = #PB_ProcessPureBasicEvents 

  Select msg 
    Case #WM_DRAWITEM 
      
      *lpdis.DRAWITEMSTRUCT = lparam 
      Dim itemrect.RECT(3) 
      For i = 1 To 3 
        RtlZeroMemory_(@itemrect(i),SizeOf(RECT)) 
        itemrect(i)\top = i 
        SendMessage_(*lpdis\hwndItem, #LVM_GETSUBITEMRECT, *lpdis\itemid, @itemrect(i)) 
        text$ = GetGadgetItemText(GetDlgCtrlID_(*lpdis\hwndItem), *lpdis\itemid, i) 
        SelectObject_(*lpdis\hDC, GetStockObject_(#NULL_PEN)) 
        WhiteBrush = CreateSolidBrush_(#White) 
        SelectObject_(*lpdis\hDC, WhiteBrush) 
        Rectangle_(*lpdis\hDC, itemrect(i)\left, itemrect(i)\top, itemrect(i)\right, itemrect(i)\bottom) 
        TextOut_(*lpdis\hDC, itemrect(i)\left+4, itemrect(i)\top+4, text$, Len(text$)) 
        DeleteObject_(WhiteBrush) 
      Next 

    Case #WM_MEASUREITEM 
    
      *lpmis.MEASUREITEMSTRUCT = lparam 
      *lpmis\itemheight = 20 
      

  EndSelect 
  
  ProcedureReturn result 
  
EndProcedure 

Procedure ResizeCombo(hwnd)
  RtlZeroMemory_(@itemrect.RECT,SizeOf(RECT)) 
  itemrect\top = currentsubitem 
  SendMessage_(hwnd,#LVM_GETSUBITEMRECT, currentitem, @itemrect)       
  ResizeGadget(1,itemrect\left,itemrect\top,itemrect\right-itemrect\left,#PB_Ignore)
  ;SpinGadgetV(1,itemrect\left, itemrect\top, itemrect\right-itemrect\left, itemrect\bottom-itemrect\top, 0, 1000,13,1)
  ;HideGadget(1,1)
  ;RedrawWindow_(GadgetID(1), 0, 0, #RDW_UPDATENOW|#RDW_ALLCHILDREN) ; убирает мерцание
   ;HideGadget(1,0)                 
  InvalidateRect_(GadgetID(1),0,1)
EndProcedure

Procedure SubClass_LV(hwnd, msg, wparam, lparam) 
  result = CallWindowProc_(oldproc, hwnd, msg, wparam, lparam) 
  
  If msg = #WM_RBUTTONDOWN Or msg = #WM_LBUTTONDOWN 
    GetCursorPos_(@cp.POINT) 
    MapWindowPoints_(0,hwnd,@cp,1) 
    HitInfo.LVHITTESTINFO 
    Hitinfo\pt\x = cp\x 
    HitInfo\pt\y = cp\y 
    SendMessage_(hwnd,#LVM_SUBITEMHITTEST ,0,@HitInfo) 
    If hitinfo\isubitem > 0 And HitInfo\iItem >= 0 
      currentitem    = hitinfo\iitem 
      currentsubitem = hitinfo\isubitem 
      RtlZeroMemory_(@itemrect.RECT,SizeOf(RECT)) 
      itemrect\top = hitinfo\iSubItem 
      SendMessage_(hwnd,#LVM_GETSUBITEMRECT, hitinfo\iitem, @itemrect) 
      If HitInfo\iSubItem = 2 ; номер столбца где должно отображатся
        ;ResizeGadget(1, itemrect\left, itemrect\top, itemrect\right-itemrect\left, itemrect\bottom-itemrect\top) 
        ;SpinGadgetV(1,itemrect\left, itemrect\top, itemrect\right-itemrect\left, itemrect\bottom-itemrect\top, 0, 1000,13,1)
        SetGadgetText(1,GetGadgetItemText(0,currentitem,currentsubitem))
        SetFocus_(GadgetID(1))
        HideGadget(1,0)
       
      Else 
        HideGadget(1,1) 
      EndIf 
    Else 
      HideGadget(1,1) 
    EndIf 
  ElseIf msg=#WM_HSCROLL Or msg=#WM_VSCROLL 
    ResizeCombo(hwnd)
  ElseIf msg=#WM_NOTIFY 
    *nmHEADER.HD_NOTIFY = lParam 
    Select *nmHEADER\hdr\code 
      Case #HDN_ITEMCHANGING
        ResizeCombo(hwnd)
    EndSelect 

  EndIf 
  
  ProcedureReturn result 
  
EndProcedure 

OpenWindow(0,0,0,520,240,"",$CF0001) 
SetWindowCallback(@MainWindowCallBack()) 

ListIconGadget(0,0,0,520,140,"",0,#PB_ListIcon_GridLines|#LVS_OWNERDRAWFIXED) 
oldproc = SetWindowLong_(GadgetID(0), #GWL_WNDPROC, @SubClass_LV()) 
AddGadgetColumn(0,1,"Название",100) 
AddGadgetColumn(0,2,"Значение",100) 
AddGadgetItem(0, -1, Chr(10) + "Left" + Chr(10) + "5" + Chr(10) ) 
AddGadgetItem(0, -1, Chr(10) + "Top" + Chr(10) + "5" + Chr(10)  ) 
AddGadgetItem(0, -1, Chr(10) + "Width" + Chr(10) + "350" + Chr(10) ) 
AddGadgetItem(0, -1, Chr(10) + "Height" + Chr(10) + "200" + Chr(10)  ) 


SpinGadgetV(2,170, 183, 60, 20, 0, 1000,13,1)

;UseGadgetList(GadgetID(0))
SpinGadgetV(1,5, 183, 100, 20, 0, 1000,13,0)


;SpinGadget(1, 0,0,0,0,0,500,#PB_Spin_Numeric) 
;SetParent_(GadgetID(1),GadgetID(0)) 
HideGadget(1,1) 

Repeat 

  EventID = WaitWindowEvent() 
  Select EventID 
    Case #PB_Event_Gadget 
      Select EventGadget() 
        Case 1 
          SetGadgetItemText(0, currentitem, GetGadgetText(1), currentsubitem) 
      EndSelect 
  EndSelect 

Until EventID = #WM_CLOSE

0

4

mestnyi написал(а):

А здесь как можно решит эту проблему

Какую именно? И чем не подошел стандартный гаджет? Если его помещать в контейнер то должно работать.

0

5

Какую именно?

SpinGadgetV поместить в листиконгаджет
И чем не подошел стандартный гаджет?
1) вид
2) положение текста
3) вот так не работает

Код:
Case #PB_Event_Gadget 
      Select EventGadget() 
        Case 1 
          SetGadgetItemText(0, currentitem, GetGadgetText(1), currentsubitem) 
      EndSelect

Если его помещать в контейнер то должно работать.

то есть? он же уже в контейнере.

0

6

Код:
ShowWindow_(GadgetID(Container ),0)

почему не прячет? так тоже

Код:
ShowWindow_(Container ,0)

.

пример:

Код:
Procedure SpinGadgetV(Gadget,left,top,width,heigth,min,max,pos=0,textpos=0 )
  Container = ContainerGadget(#PB_Any ,left+2,top+2,width,heigth-1); ,#PB_Container_Flat
  
  StringGadget(Gadget,0,0,width-16,heigth-1,"",textpos|#PB_String_Numeric)
  SetParent_(GadgetID(Gadget),GadgetID(Container))
  
  CreateUpDownControl_(#WS_CHILD|#WS_VISIBLE|#UDS_SETBUDDYINT|#UDS_ARROWKEYS|#UDS_WRAP,width-16,-1,0,heigth+1,GadgetID(Container),1,GetModuleHandle_(0),GadgetID(Gadget),max,min,pos)
  CloseGadgetList()
  SetClassLong_(GadgetID(Container),#GCL_HBRBACKGROUND,CreateSolidBrush_(RGB(0, 255, 0)))
  InvalidateRect_(GadgetID(Gadget), 0, 1)
EndProcedure

В моём примере Container  - это дескриптор или идентификатор?

Отредактировано mestnyi (27.09.2013 11:47:10)

0

7

mestnyi написал(а):

вид

Чем не устроил вид?

http://s017.radikal.ru/i417/1309/59/449cbc05fbbf.png

mestnyi написал(а):

положение текста

Опять же не понятно. Текст должен быть слева или что?

mestnyi написал(а):

вот так не работает

Думаешь что WinAPI аналог будет так работать?
Не работает потому что события отправляются окну-родителю, а им в данном случае, является таблица. Нужно в ее CB функции обрабатывать эти события, или транслировать их окну и тогда будет работать.

mestnyi написал(а):

то есть? он же уже в контейнере.

Я про SpinGadget писал, а не про его аналог.

mestnyi написал(а):

В моём примере Container  - это дескриптор или идентификатор?

Идентификатор. Только переменная Container не является глобальной и поэтому этот идентификатор будет потерян при выходе из процедуры. Нужно его где-то сохранить, например, в Data-ячейке StringGadget.

0

8

Чем не устроил вид?

А у меня такой вид
http://s5.uploads.ru/t/uHDWr.png

Текст должен быть слева или что?

да именно, или по середине когда мне нужно.

Думаешь что WinAPI аналог будет так работать?

да, потому что работает, вот

Код:
;================================================================ 
; Program:            ListIcon FillByGadget Sample 
; Author:             netmaestro 
; Date:               January 7, 2007 
; Target OS:          Windows All 
; Target Compiler:    PureBasic 4.02 
; License:            Free, Unrestricted, Credit appreciated 
;                     but not required 
;================================================================ 

#LVM_SUBITEMHITTEST = #LVM_FIRST + 57 
#LVM_GETSUBITEMRECT = #LVM_FIRST + 56 

Global oldproc 
Global currentitem, currentsubitem 


Procedure SpinGadgetV(Gadget,left,top,width,heigth,min,max,pos=0,textpos=0 )
Shared UpDownControl,Container
  Container = ContainerGadget(#PB_Any ,left+2,top+2,width,heigth-1); ,#PB_Container_Flat
  
  StringGadget(Gadget,0,0,width-16,heigth-1,"",textpos|#PB_String_Numeric)
  SetParent_(GadgetID(Gadget),GadgetID(Container))
  
  UpDownControl = CreateUpDownControl_(#WS_CHILD|#WS_VISIBLE|#UDS_SETBUDDYINT|#UDS_ARROWKEYS|#UDS_WRAP,width-16,-1,0,heigth+1,GadgetID(Container),1,GetModuleHandle_(0),GadgetID(Gadget),max,min,pos)
  CloseGadgetList()
  SetClassLong_(GadgetID(Container),#GCL_HBRBACKGROUND,CreateSolidBrush_(RGB(0, 255, 0)))
  InvalidateRect_(GadgetID(Gadget), 0, 1)
EndProcedure 

Procedure SpinGadgetV_(Gadget,left,top,width,heigth,min,max,pos=0,textpos=2 )
  ContainerGadget(Gadget ,left+2,top+2,width,heigth-1); ,#PB_Container_Flat
  
  StringGadget = StringGadget(#PB_Any,0,0,width-16,heigth-1,"",textpos|#PB_String_Numeric)
  SetParent_(GadgetID(StringGadget),GadgetID(Gadget))
  CreateUpDownControl_(#WS_CHILD|#WS_VISIBLE|#UDS_SETBUDDYINT|#UDS_ARROWKEYS,width-16,-1,0,heigth+1,GadgetID(Gadget),1,GetModuleHandle_(0),GadgetID(StringGadget),max,min,pos)
  CloseGadgetList()
  ;SetClassLong_(GadgetID(Gadget),#GCL_HBRBACKGROUND,CreateSolidBrush_(RGB(0, 255, 0)))
  InvalidateRect_(GadgetID(Gadget), 0, 1)
EndProcedure 

Procedure MainWindowCallBack(hwnd, msg, wparam, lparam) 
  result = #PB_ProcessPureBasicEvents 

  Select msg 
    Case #WM_DRAWITEM 
      
      *lpdis.DRAWITEMSTRUCT = lparam 
      Dim itemrect.RECT(3) 
      For i = 1 To 3 
        RtlZeroMemory_(@itemrect(i),SizeOf(RECT)) 
        itemrect(i)\top = i 
        SendMessage_(*lpdis\hwndItem, #LVM_GETSUBITEMRECT, *lpdis\itemid, @itemrect(i)) 
        text$ = GetGadgetItemText(GetDlgCtrlID_(*lpdis\hwndItem), *lpdis\itemid, i) 
        SelectObject_(*lpdis\hDC, GetStockObject_(#NULL_PEN)) 
        WhiteBrush = CreateSolidBrush_(#White) 
        SelectObject_(*lpdis\hDC, WhiteBrush) 
        Rectangle_(*lpdis\hDC, itemrect(i)\left, itemrect(i)\top, itemrect(i)\right, itemrect(i)\bottom) 
        TextOut_(*lpdis\hDC, itemrect(i)\left+4, itemrect(i)\top+4, text$, Len(text$)) 
        DeleteObject_(WhiteBrush) 
      Next 

    Case #WM_MEASUREITEM 
    
      *lpmis.MEASUREITEMSTRUCT = lparam 
      *lpmis\itemheight = 20 
      

  EndSelect 
  
  ProcedureReturn result 
  
EndProcedure 

Procedure ResizeCombo(hwnd)
  RtlZeroMemory_(@itemrect.RECT,SizeOf(RECT)) 
  itemrect\top = currentsubitem 
  SendMessage_(hwnd,#LVM_GETSUBITEMRECT, currentitem, @itemrect)       
  ResizeGadget(1,itemrect\left,itemrect\top,itemrect\right-itemrect\left,#PB_Ignore)
  ;SpinGadgetV(1,itemrect\left, itemrect\top, itemrect\right-itemrect\left, itemrect\bottom-itemrect\top, 0, 1000,13,1)
  ;HideGadget(1,1)
  ;RedrawWindow_(GadgetID(1), 0, 0, #RDW_UPDATENOW|#RDW_ALLCHILDREN) ; убирает мерцание
   ;HideGadget(1,0)                 
  InvalidateRect_(GadgetID(1),0,1)
EndProcedure

Procedure SubClass_LV(hwnd, msg, wparam, lparam) 
  result = CallWindowProc_(oldproc, hwnd, msg, wparam, lparam) 
  
  If msg = #WM_RBUTTONDOWN Or msg = #WM_LBUTTONDOWN 
    GetCursorPos_(@cp.POINT) 
    MapWindowPoints_(0,hwnd,@cp,1) 
    HitInfo.LVHITTESTINFO 
    Hitinfo\pt\x = cp\x 
    HitInfo\pt\y = cp\y 
    SendMessage_(hwnd,#LVM_SUBITEMHITTEST ,0,@HitInfo) 
    If hitinfo\isubitem > 0 And HitInfo\iItem >= 0 
      currentitem    = hitinfo\iitem 
      currentsubitem = hitinfo\isubitem 
      RtlZeroMemory_(@itemrect.RECT,SizeOf(RECT)) 
      itemrect\top = hitinfo\iSubItem 
      SendMessage_(hwnd,#LVM_GETSUBITEMRECT, hitinfo\iitem, @itemrect) 
      If HitInfo\iSubItem = 2 ; номер столбца где должно отображатся
        ;ResizeGadget(1, itemrect\left, itemrect\top, itemrect\right-itemrect\left, itemrect\bottom-itemrect\top) 
        ;SpinGadgetV(1,itemrect\left, itemrect\top, itemrect\right-itemrect\left, itemrect\bottom-itemrect\top, 0, 1000,13,1)
        SetGadgetText(1,GetGadgetItemText(0,currentitem,currentsubitem))
        SetFocus_(GadgetID(1))
        HideGadget(1,0)
       
      Else 
        HideGadget(1,1) 
      EndIf 
    Else 
      HideGadget(1,1) 
    EndIf 
  ElseIf msg=#WM_HSCROLL Or msg=#WM_VSCROLL 
    ResizeCombo(hwnd)
  ElseIf msg=#WM_NOTIFY 
    *nmHEADER.HD_NOTIFY = lParam 
    Select *nmHEADER\hdr\code 
      Case #HDN_ITEMCHANGING
        ResizeCombo(hwnd)
    EndSelect 

  EndIf 
  
  ProcedureReturn result 
  
EndProcedure 

OpenWindow(0,0,0,520,240,"",$CF0001) 
SetWindowCallback(@MainWindowCallBack()) 

ListIconGadget(0,0,0,520,140,"",0,#PB_ListIcon_GridLines|#LVS_OWNERDRAWFIXED) 
oldproc = SetWindowLong_(GadgetID(0), #GWL_WNDPROC, @SubClass_LV()) 
AddGadgetColumn(0,1,"Название",100) 
AddGadgetColumn(0,2,"Значение",100) 
AddGadgetItem(0, -1, Chr(10) + "Left" + Chr(10) + "5" + Chr(10) ) 
AddGadgetItem(0, -1, Chr(10) + "Top" + Chr(10) + "5" + Chr(10)  ) 
AddGadgetItem(0, -1, Chr(10) + "Width" + Chr(10) + "350" + Chr(10) ) 
AddGadgetItem(0, -1, Chr(10) + "Height" + Chr(10) + "200" + Chr(10)  ) 


SpinGadgetV(2,170, 183, 60, 20, 0, 1000,13,1)

;UseGadgetList(GadgetID(0))
SpinGadgetV(1,5, 183, 100, 20, 0, 1000,13,0)


;SpinGadget(1, 0,0,0,0,0,500,#PB_Spin_Numeric) 
;SetParent_(GadgetID(1),GadgetID(0)) 
;HideGadget(1,1) 

Repeat 


  EventID = WaitWindowEvent() 
  Select EventID 
    Case #PB_Event_Gadget 
      Select EventGadget() 
        Case 1 
          SetGadgetItemText(0, currentitem, GetGadgetText(1), currentsubitem) 
      EndSelect 
  EndSelect 

Until EventID = #WM_CLOSE

например, в Data-ячейке StringGadget.

вот с этого места по подробней пожалуйста.

0

9

mestnyi написал(а):

А у меня такой вид

Значит нужно обновить PB.

mestnyi написал(а):

с этого места по подробней

При использовании #PB_Any функция возвращает свой идентификатор, который нужно где-то сохранить если он нужен.
Переменная Container доступна только в пределах процедуры SpinGadgetV и при выходе из нее, теряется идентификатор контейнера.

0

10

вот так пробовал

Код:
Procedure SpinGadgetV(Gadget,left,top,width,heigth,min,max,pos=0,textpos=0 )
Shared UpDownControl,Container
  Container = ContainerGadget(#PB_Any ,left+2,top+2,width,heigth-1); ,#PB_Container_Flat
  
  StringGadget(Gadget,0,0,width-16,heigth-1,"",textpos|#PB_String_Numeric)
  SetParent_(GadgetID(Gadget),GadgetID(Container))
  
  UpDownControl = CreateUpDownControl_(#WS_CHILD|#WS_VISIBLE|#UDS_SETBUDDYINT|#UDS_ARROWKEYS|#UDS_WRAP,width-16,-1,0,heigth+1,GadgetID(Container),1,GetModuleHandle_(0),GadgetID(Gadget),max,min,pos)
  CloseGadgetList()
  SetClassLong_(GadgetID(Container),#GCL_HBRBACKGROUND,CreateSolidBrush_(RGB(0, 255, 0)))
  InvalidateRect_(GadgetID(Gadget), 0, 1)
EndProcedure

и так Global UpDownControl,Container

0

11

Значит нужно обновить PB.

вот что получилось, посмотри где стрелка.
http://s4.uploads.ru/t/W7zZq.png

0

12

ты куда пропал? или ты не знаешь и поэтому молчишь?

0

13

mestnyi написал(а):

или ты не знаешь и поэтому молчишь?

Это не форум экстрасенсов!
Где здесь вопрос?

0

14

Код:
Procedure SpinGadgetV(Gadget,left,top,width,heigth,min,max,pos=0,textpos=0 )
Shared UpDownControl,Container
  Container = ContainerGadget(#PB_Any ,left+2,top+2,width,heigth-1); ,#PB_Container_Flat
  StringGadget(Gadget,0,0,width-16,heigth-1,"",textpos|#PB_String_Numeric)
  UpDownControl = CreateUpDownControl_(#WS_CHILD|#WS_VISIBLE|#UDS_SETBUDDYINT|#UDS_ARROWKEYS|#UDS_WRAP,width-16,-1,0,heigth+1,GadgetID(Container),1,GetModuleHandle_(0),GadgetID(Gadget),max,min,pos)
  CloseGadgetList()
EndProcedure

как изменять размеры этого гаджета (SpinGadgetV(...)) програмно??? вот так это вопрос?

   

Текст должен быть слева или что?


да именно, или по середине когда мне нужно. как сделать?

Отредактировано mestnyi (28.09.2013 20:32:30)

0

15

Пётр
тебе спасибо, что предложил это

Значит нужно обновить PB.

вот это начало работать, сколько я замучился, а теперь все окей.

Код:
OpenWindow(0, 0, 0, 800, 600, "Designer",#WS_EX_COMPOSITED |#PB_Window_ScreenCentered |  #PB_Window_Invisible | #PB_Window_SystemMenu | #PB_Window_SizeGadget)
 OpenWindow(1, 0,0, 500, 100, "Test", #PB_Window_Invisible|#PB_Window_SystemMenu| #WS_CHILD|#WS_POPUP, WindowID(0))
  SetParent_(WindowID(1), WindowID(0)) ; заменяем родительское окно заданного дочернего окна.
  
  ButtonGadget(0, 5, 5, 80, 25, "ButtonGadget")
  TextGadget(21, 95, 10, 60, 25, "TextGadget");,#SS_NOTIFY)
  StringGadget(2, 325, 10, 150, 25, "TStringGadget")
  ComboBoxGadget(1, 170, 10, 120, 25)
  ;SetGadgetText(1,"ComboBoxGadget")
  ScrollAreaGadget(3, 0, 50, 780,500, 776, 450, 30)
  ButtonGadget(4, 15, 10, 130, 25, "ButtonGadget")
  StringGadget(5, 225, 10, 150, 25, "StringGadget")
  
  HideWindow(0,0) ; отображаем главное окно
  HideWindow(1,0) ; отображаем дочернее окно
  
   
  Repeat
    Event = WaitWindowEvent()
    
    If Event = #WM_LBUTTONUP
        Debug"#WM_LBUTTONUP - " + EventGadget()
      EndIf 
      
       If Event = #WM_LBUTTONDOWN
         Debug "#WM_LBUTTONDOWN - "+ EventGadget()
       EndIf 
      
    
Until Event= #PB_Event_CloseWindow

еще интересная вещь  вот так работает

Код:
Debug "#WM_LBUTTONUP - " + EventGadget()

а так нет

Код:
Debug EventGadget() + " - #WM_LBUTTONUP"

Отредактировано mestnyi (28.09.2013 20:00:40)

0

16

mestnyi написал(а):

как изменять размеры этого гаджета (SpinGadgetV(...)) програмно???

ResizeGadget() для ContainerGadget и StringGadget, и MoveWindow_() для CreateUpDownControl.

Так тоже работает.

Код:
Debug Str(EventGadget()) + " - #WM_LBUTTONUP"

0

17

Пётр

Debug Str(EventGadget()) + " - #WM_LBUTTONUP"

не ужели ты думал что я это не знал? просто мне было интересно, если строка и число компилятор пропускает, а если число и строка то ругается.

ResizeGadget() для ContainerGadget и StringGadget, и MoveWindow_() для CreateUpDownControl.

так я сделал, а мне нужно было 1 ResizeGadget() чтобы всех трех гаджетов менял размеры. Также как у фреда. как сделать? Мне приходит в голову что можно допустим сделать цикл или таймер в процедуре и проверять изменился ли размер гаджета если да то меняем всем остальным. Только на практике не получается, все время колесо мышки крутиться.

0

18

mestnyi написал(а):

просто мне было интересно, если строка и число компилятор пропускает, а если число и строка то ругается.

Такова особенность компилятора.

mestnyi написал(а):

Также как у фреда. как сделать?

Напиши процедуру, назови ее SuperResizeGadget() и пусть она изменяет размеры твоего самописного контрола.
У Фреда под капотом ResizeGadget много чего есть в т. ч. определение какой именно это гаджет и соответствующая работа с ним.

0

19

Напиши процедуру, назови ее SuperResizeGadget() и пусть она изменяет размеры твоего самописного контрола.

так и сделано.

Код:
;================================================================ 
; Program:            ListIcon FillByGadget Sample 
; Author:             netmaestro 
; Date:               January 7, 2007 
; Target OS:          Windows All 
; Target Compiler:    PureBasic 4.02 
; License:            Free, Unrestricted, Credit appreciated 
;                     but not required 
;================================================================ 

#LVM_SUBITEMHITTEST = #LVM_FIRST + 57 
#LVM_GETSUBITEMRECT = #LVM_FIRST + 56 

Global oldproc 
Global currentitem, currentsubitem 

; ------------------------------
;{- SpinGadget_
; ------------------------------
Declare ResizeSpinGadget_(Gadget,left,top,width,heigth)
Declare HideSpinGadget_(Gadget,param)

Procedure SpinGadget_(Gadget,left,top,width,heigth,min,max,pos=0,textpos=2 )
 Global SpinGadget_,SpinGadget_String,SpinGadget_UpDown
  UpDownWidth =18
  SpinGadget_  =ContainerGadget(#PB_Any ,0,0,0,0); ,#PB_Container_Flat
  SpinGadget_String =StringGadget(Gadget,0,0,0,0,"",textpos|#PB_String_Numeric)
  SpinGadget_UpDown =  CreateUpDownControl_(#WS_CHILD|#WS_VISIBLE|#UDS_SETBUDDYINT|#UDS_ARROWKEYS,0,0,0,0,GadgetID(SpinGadget_),1,GetModuleHandle_(0),GadgetID(Gadget),max,min,pos)
  CloseGadgetList()
  ResizeSpinGadget_(Gadget,0,0,100,20)
  If Gadget=#PB_Any
    ProcedureReturn SpinGadget_String
  EndIf  
EndProcedure 

Procedure ResizeSpinGadget_(Gadget,left,top,width,heigth)
  UpDownWidth =18
  ResizeGadget(SpinGadget_ ,left,top,width,heigth+1)
  ResizeGadget(gadget ,0,0,width-UpDownWidth,heigth-1)
  MoveWindow_(SpinGadget_UpDown,GadgetWidth(gadget),-1,UpDownWidth,heigth+1,1)
     
EndProcedure

Procedure HideSpinGadget_(Gadget,param)
  If param =1
    param=0
  Else
    param=1
  EndIf  
    
  ShowWindow_(GadgetID(SpinGadget_),param)  
  ShowWindow_(GadgetID(Gadget),param)  
  ShowWindow_(SpinGadget_UpDown,param)  
  
EndProcedure
;}------------------------------
; ------------------------------

Procedure MainWindowCallBack(hwnd, msg, wparam, lparam) 
  result = #PB_ProcessPureBasicEvents 

  Select msg 
    Case #WM_DRAWITEM 
      
      *lpdis.DRAWITEMSTRUCT = lparam 
      Dim itemrect.RECT(3) 
      For i = 1 To 3 
        RtlZeroMemory_(@itemrect(i),SizeOf(RECT)) 
        itemrect(i)\top = i 
        SendMessage_(*lpdis\hwndItem, #LVM_GETSUBITEMRECT, *lpdis\itemid, @itemrect(i)) 
        text$ = GetGadgetItemText(GetDlgCtrlID_(*lpdis\hwndItem), *lpdis\itemid, i) 
        SelectObject_(*lpdis\hDC, GetStockObject_(#NULL_PEN)) 
        WhiteBrush = CreateSolidBrush_(#White) 
        SelectObject_(*lpdis\hDC, WhiteBrush) 
        Rectangle_(*lpdis\hDC, itemrect(i)\left, itemrect(i)\top, itemrect(i)\right, itemrect(i)\bottom) 
        
        TextOut_(*lpdis\hDC, itemrect(i)\left+4, itemrect(i)\top+4, text$, Len(text$)) 

        DeleteObject_(WhiteBrush) 
      Next 

    Case #WM_MEASUREITEM 
    
      *lpmis.MEASUREITEMSTRUCT = lparam 
      *lpmis\itemheight = 20 
      

  EndSelect 
  
  ProcedureReturn result 
  
EndProcedure 

Procedure Resize(hwnd)
  RtlZeroMemory_(@itemrect.RECT,SizeOf(RECT)) 
  itemrect\top = currentsubitem 
  SendMessage_(hwnd,#LVM_GETSUBITEMRECT, currentitem, @itemrect)       
  ResizeGadget(1,itemrect\left,itemrect\top,itemrect\right-itemrect\left,#PB_Ignore)
  ResizeSpinGadget_(2, itemrect\left,itemrect\top,itemrect\right-itemrect\left, itemrect\bottom-itemrect\top) 
  InvalidateRect_(GadgetID(1),0,1)
EndProcedure

Procedure SubClass_LV(hwnd, msg, wparam, lparam) 
  result = CallWindowProc_(oldproc, hwnd, msg, wparam, lparam) 
  
  If msg = #WM_RBUTTONDOWN Or msg = #WM_LBUTTONDOWN 
    GetCursorPos_(@cp.POINT) 
    MapWindowPoints_(0,hwnd,@cp,1) 
    HitInfo.LVHITTESTINFO 
    Hitinfo\pt\x = cp\x 
    HitInfo\pt\y = cp\y 
    SendMessage_(hwnd,#LVM_SUBITEMHITTEST ,0,@HitInfo) 
    If hitinfo\isubitem > 0 And HitInfo\iItem >= 0 
      currentitem    = hitinfo\iitem 
      currentsubitem = hitinfo\isubitem 
      RtlZeroMemory_(@itemrect.RECT,SizeOf(RECT)) 
      itemrect\top = hitinfo\iSubItem 
      SendMessage_(hwnd,#LVM_GETSUBITEMRECT, hitinfo\iitem, @itemrect) 
      If HitInfo\iSubItem = 2 ; номер столбца где должно отображатся
       If currentitem =1 Or currentitem =2 Or currentitem =3 Or currentitem =4
        ResizeSpinGadget_(2, itemrect\left, itemrect\top, itemrect\right-itemrect\left, itemrect\bottom-itemrect\top) 
        SetGadgetText(2,GetGadgetItemText(0,currentitem,currentsubitem))
        SetFocus_(GadgetID(2))
        HideSpinGadget_(2,0) 
        HideGadget(1,1) 
        
        ;Debug currentitem
        ElseIf currentitem =0
        ElseIf currentitem =5
        
        Else
        ResizeGadget(1, itemrect\left, itemrect\top, itemrect\right-itemrect\left, itemrect\bottom-itemrect\top) 
        SetGadgetText(1,GetGadgetItemText(0,currentitem,currentsubitem))
        SetFocus_(GadgetID(1))
        HideGadget(1,0) 
        HideSpinGadget_(2,1) 
        
        EndIf
        
        
        
        
      Else 
        Debug currentsubitem
        HideGadget(1,1) 
        HideSpinGadget_(2,1) 
        
      EndIf 
    Else 
      HideGadget(1,1) 
      HideSpinGadget_(2,1) 
         
    EndIf 
  ElseIf msg=#WM_HSCROLL Or msg=#WM_VSCROLL 
    Resize(hwnd)
  ElseIf msg=#WM_NOTIFY 
    *nmHEADER.HD_NOTIFY = lParam 
    Select *nmHEADER\hdr\code 
      Case #HDN_ITEMCHANGING
        Resize(hwnd)
    EndSelect 

  EndIf 
  
  ProcedureReturn result 
  
EndProcedure 

OpenWindow(0,0,0,320,340,"",$CF0001) 
SetWindowCallback(@MainWindowCallBack()) 
 

ListIconGadget(0,0,0,320,340,"",0,#PB_ListIcon_GridLines|#LVS_OWNERDRAWFIXED) 
oldproc = SetWindowLongPtr_(GadgetID(0), #GWL_WNDPROC, @SubClass_LV()) 
AddGadgetColumn(0,1,"Название",130) 
AddGadgetColumn(0,2,"Значение",100) 

AddGadgetItem(0, -1, Chr(10) + "ПОЛОЖЕНИЕ ОКНА" + Chr(10) + "" + Chr(10) ) 

AddGadgetItem(0, -1, Chr(10) + "Left" + Chr(10) + "5" + Chr(10) ) 
AddGadgetItem(0, -1, Chr(10) + "Top" + Chr(10) + "5" + Chr(10)  ) 
AddGadgetItem(0, -1, Chr(10) + "Width" + Chr(10) + "350" + Chr(10) ) 
AddGadgetItem(0, -1, Chr(10) + "Height" + Chr(10) + "200" + Chr(10)  )

AddGadgetItem(0, -1, Chr(10) + "СТИЛЬ ОКНА  (ВИД)" + Chr(10) + "" + Chr(10)  ) 

AddGadgetItem(0, -1, Chr(10) + "WindowTool" + Chr(10) + "False" + Chr(10) ) 
AddGadgetItem(0, -1, Chr(10) + "BorderLess" + Chr(10) + "False" + Chr(10)  ) 
AddGadgetItem(0, -1, Chr(10) + "SizeGadget" + Chr(10) + "True" + Chr(10)   ) 
AddGadgetItem(0, -1, Chr(10) + "MinimizeGadget" + Chr(10) + "True" + Chr(10)  ) 
AddGadgetItem(0, -1, Chr(10) + "MaximizeGadget" + Chr(10) + "True" + Chr(10) ) 
AddGadgetItem(0, -1, Chr(10) + "TitleBar" + Chr(10) + "True" + Chr(10)  ) 
AddGadgetItem(0, -1, Chr(10) + "Invizible" + Chr(10) + "False" + Chr(10)   ) 
AddGadgetItem(0, -1, Chr(10) + "NoGadgets" + Chr(10) + "False" + Chr(10)  ) 

ComboBoxGadget(1, 0,20,100,200,#PB_ComboBox_Editable) 
SetParent_(GadgetID(1),GadgetID(0)) 
AddGadgetItem(1,0,"True") 
AddGadgetItem(1,1,"False") 

SpinGadget_(2,5, 183, 100, 20, 0, 2000,13,0)
SetParent_(GadgetID(SpinGadget_),GadgetID(0)) 

HideGadget(1,1) 
HideSpinGadget_(2,1)

Repeat 
EventID = WaitWindowEvent() 
  Select EventID 
    Case #PB_Event_Gadget 
      
      If currentitem <>0 
       If currentitem <>5 
      Select EventGadget() 
        Case 1 
          SetGadgetItemText(0, currentitem, GetGadgetText(1), currentsubitem) 
        Case 2 
          SetGadgetItemText(0, currentitem, GetGadgetText(2), currentsubitem) 
          
      EndSelect 
    EndIf
    EndIf
   
  EndSelect 
Until EventID = #WM_CLOSE

Теперь такой вопрос, если выбрать значение и нажать на название выбранное значение записывается в место названия, как этого не допустить?
и в вдогонку такой вопрос как эту строку покрасить

Код:
AddGadgetItem(0, -1, Chr(10) + "СТИЛЬ ОКНА  (ВИД)" + Chr(10) + "" + Chr(10)  )

0

20

У Фреда под капотом ResizeGadget много чего есть

ты по ходу меня не понял, нам без разницы что у него под капотом. Я предлагаю так (просто я чуть чуть не догоняю) : вот мой как работает и как работает фреда

Код:
#UDS_HOTTRACK            =  $0100
 
; ------------------------------
;{- SpinGadget_
; ------------------------------
Declare ResizeSpinGadget_(Gadget,left,top,width,heigth)
Declare HideSpinGadget_(Gadget,param)

Procedure SpinGadget_(Gadget,left,top,width,heigth,min,max,pos=0,textpos=2 )
 Global SpinGadget_,SpinGadget_String,SpinGadget_UpDown
  UpDownWidth =18
  SpinGadget_  =ContainerGadget(#PB_Any ,0,0,0,0); ,#PB_Container_Flat
  SpinGadget_String =StringGadget(Gadget,0,0,0,0,"",textpos|#PB_String_Numeric)
  SpinGadget_UpDown =  CreateUpDownControl_(#WS_CHILD|#WS_VISIBLE|#UDS_SETBUDDYINT|#UDS_ARROWKEYS,0,0,0,0,GadgetID(SpinGadget_),1,GetModuleHandle_(0),GadgetID(Gadget),max,min,pos)
  CloseGadgetList()
  ResizeSpinGadget_(Gadget,0,0,100,20)
  If Gadget=#PB_Any
    ProcedureReturn SpinGadget_String
  EndIf  
EndProcedure 

Procedure ResizeSpinGadget_(Gadget,left,top,width,heigth)
  UpDownWidth =18
  ResizeGadget(SpinGadget_ ,left,top,width,heigth+1)
  ResizeGadget(gadget ,0,0,width-UpDownWidth,heigth-1)
  MoveWindow_(SpinGadget_UpDown,GadgetWidth(gadget),-1,UpDownWidth,heigth+1,1)
     
EndProcedure

Procedure HideSpinGadget_(Gadget,param)
  If param =1
    param=0
  Else
    param=1
  EndIf  
    
  ShowWindow_(GadgetID(SpinGadget_),param)  
  ShowWindow_(GadgetID(Gadget),param)  
  ShowWindow_(SpinGadget_UpDown,param)  
  
EndProcedure
;}------------------------------
; ------------------------------


  
  
OpenWindow(0, 100, 100, 400, 300, "SpinGadget", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
SGhwnd = StringGadget(2,10,10,80,22,"",#ES_CENTER|#PB_String_Numeric)
CreateUpDownControl_(#WS_CHILD|#WS_VISIBLE| #UDS_SETBUDDYINT|#UDS_HOTTRACK|#UDS_ARROWKEYS| #UDS_ALIGNRIGHT,10,30, 80,20,WindowID(0),1,GetModuleHandle_(0),SGhwnd,100,0,50)

 
 SpinGadget_(12,10,80,80,19, 0, 1000,50,1)
SpinGadget(9, 20, 160, 100, 22, 0, 1000,#PB_Spin_Numeric)
 

Repeat
  EventID = WaitWindowEvent()
  GadgetID = EventGadget()
   If EventID = #PB_Event_Gadget
    If GadgetID = 2
      
      ResizeGadget(9 ,#PB_Ignore,#PB_Ignore,#PB_Ignore,Val(GetGadgetText(2)))
     ResizeSpinGadget_(12,10,80,80, Val(GetGadgetText(2)))
      
    EndIf
   EndIf
   If EventID = #PB_Event_SizeWindow
    
    
   EndIf  
  
   If EventID = #PB_Event_CloseWindow
     Quit = 1
   EndIf
Until Quit = 1
End

0

21

Я предлагаю что то вроде этого

Код:
#UDS_HOTTRACK            =  $0100
 
; ------------------------------
;{- SpinGadget_
; ------------------------------
Declare ResizeSpinGadget_(left,top,width,heigth)

Procedure SpinGadget_(Gadget,left,top,width,heigth,min,max,pos=0,textpos=2 )
 Global SpinGadget_,SpinGadget_String,SpinGadget_UpDown

 SpinGadget_  =ContainerGadget(#PB_Any ,0,0,0,0); ,#PB_Container_Flat
  SpinGadget_String =StringGadget(Gadget,0,0,0,0,"",textpos|#PB_String_Numeric)
  SpinGadget_UpDown =  CreateUpDownControl_(#WS_CHILD|#WS_VISIBLE|#UDS_SETBUDDYINT|#UDS_ARROWKEYS,0,0,0,0,GadgetID(SpinGadget_),1,GetModuleHandle_(0),GadgetID(Gadget),max,min,pos)
  CloseGadgetList()
  ResizeSpinGadget_(0,0,100,20)
  If Gadget=#PB_Any
    ProcedureReturn SpinGadget_String
  EndIf  
  
  
  ss:
  Global a,b 
  Repeat 
    
   a = GadgetHeight(SpinGadget_)-2
   b = GadgetHeight(Gadget)
    
   If a<>b
     ResizeSpinGadget_(GadgetX(Gadget),GadgetY(Gadget),GadgetWidth(Gadget),b)
     Goto ss
   EndIf  
   
  Until a=b

  
EndProcedure 

Procedure ResizeSpinGadget_(left,top,width,heigth)
  UpDownWidth =18
  ResizeGadget(SpinGadget_ ,left,top,width+UpDownWidth,heigth+2)
  MoveWindow_(SpinGadget_UpDown,width,-1,UpDownWidth,heigth+1,1)
     
EndProcedure


;}------------------------------
; ------------------------------


  
  
OpenWindow(0, 100, 100, 400, 300, "SpinGadget", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
SGhwnd = StringGadget(2,10,10,80,22,"",#ES_CENTER|#PB_String_Numeric)
CreateUpDownControl_(#WS_CHILD|#WS_VISIBLE| #UDS_SETBUDDYINT|#UDS_HOTTRACK|#UDS_ARROWKEYS| #UDS_ALIGNRIGHT,10,30, 80,20,WindowID(0),1,GetModuleHandle_(0),SGhwnd,100,0,50)

 
 SpinGadget_(12,10,80,80,19, 0, 1000,50,1)
SpinGadget(9, 20, 160, 100, 22, 0, 1000,#PB_Spin_Numeric)
 

Repeat
  EventID = WaitWindowEvent()
  GadgetID = EventGadget()
   If EventID = #PB_Event_Gadget
    If GadgetID = 2
      
      ResizeGadget(9 ,#PB_Ignore,#PB_Ignore,#PB_Ignore,Val(GetGadgetText(2)))
     ResizeGadget(12,10,80,80, Val(GetGadgetText(2)))
      
    EndIf
   EndIf
   If EventID = #PB_Event_SizeWindow
    
    
   EndIf  
  
   If EventID = #PB_Event_CloseWindow
     Quit = 1
   EndIf
Until Quit = 1
End

0

22

mestnyi написал(а):

если выбрать значение и нажать на название выбранное значение записывается в место названия, как этого не допустить?

Код:
      If currentitem <>0 And currentitem <>5 And currentsubitem>1
        Select EventGadget() 
          Case 1 
            SetGadgetItemText(0, currentitem, GetGadgetText(1), currentsubitem) 
          Case 2 
            SetGadgetItemText(0, currentitem, GetGadgetText(2), currentsubitem) 
            
        EndSelect 
      EndIf
mestnyi написал(а):

как эту строку покрасить

http://purebasic.com/documentation/gadg … color.html

0

23

что то не красит

Код:
SetGadgetItemColor(0,  5, #PB_Gadget_BackColor,  $00FFFF, -1)

0

24

mestnyi написал(а):

что то не красит

Если список создан с флагом #LVS_OWNERDRAWFIXED, то за отрисовку отвечает приложение, а не система и красить нужно программно при событии #WM_DRAWITEM в процедуре MainWindowCallBack.

0

25

как раз над этим работаю

Код:
WhiteBrush = CreateSolidBrush_($00FFFF); цвет строк 
        SelectObject_(*lpdis\hDC, WhiteBrush)

вот так красит все строки, а как узнать какая строка чтобы её покрасить?
нашел

Код:
WhiteBrush = CreateSolidBrush_($FFFFFF); цвет строк 
        SelectObject_(*lpdis\hDC, WhiteBrush) 
        If *lpdis\itemid =0 or *lpdis\itemid =5
        WhiteBrush = CreateSolidBrush_($0FF00F); цвет строк 
        SelectObject_(*lpdis\hDC, WhiteBrush) 
        Else
        WhiteBrush = CreateSolidBrush_($FFFFFF); цвет строк 
        SelectObject_(*lpdis\hDC, WhiteBrush) 
        EndIf

А теперь как покрасить выбранную строку?

Отредактировано mestnyi (30.09.2013 11:14:11)

0

26

mestnyi написал(а):

вот так красит все строки, а как узнать какая строка чтобы её покрасить?

По коду же легко догадаться что номер строки находится в *lpdis\itemid.

text$ = GetGadgetItemText(GetDlgCtrlID_(*lpdis\hwndItem), *lpdis\itemid, i)

Код:
;================================================================ 
; Program:            ListIcon FillByGadget Sample 
; Author:             netmaestro 
; Date:               January 7, 2007 
; Target OS:          Windows All 
; Target Compiler:    PureBasic 4.02 
; License:            Free, Unrestricted, Credit appreciated 
;                     but not required 
;================================================================ 

#LVM_SUBITEMHITTEST = #LVM_FIRST + 57 
#LVM_GETSUBITEMRECT = #LVM_FIRST + 56 

Global oldproc 
Global currentitem, currentsubitem 

; ------------------------------
;{- SpinGadget_
; ------------------------------
Declare ResizeSpinGadget_(Gadget,left,top,width,heigth)
Declare HideSpinGadget_(Gadget,param)

Procedure SpinGadget_(Gadget,left,top,width,heigth,min,max,pos=0,textpos=2 )
  Global SpinGadget_,SpinGadget_String,SpinGadget_UpDown
  UpDownWidth =18
  SpinGadget_  =ContainerGadget(#PB_Any ,0,0,0,0); ,#PB_Container_Flat
  SpinGadget_String =StringGadget(Gadget,0,0,0,0,"",textpos|#PB_String_Numeric)
  SpinGadget_UpDown =  CreateUpDownControl_(#WS_CHILD|#WS_VISIBLE|#UDS_SETBUDDYINT|#UDS_ARROWKEYS,0,0,0,0,GadgetID(SpinGadget_),1,GetModuleHandle_(0),GadgetID(Gadget),max,min,pos)
  CloseGadgetList()
  ResizeSpinGadget_(Gadget,0,0,100,20)
  If Gadget=#PB_Any
    ProcedureReturn SpinGadget_String
  EndIf  
EndProcedure 

Procedure ResizeSpinGadget_(Gadget,left,top,width,heigth)
  UpDownWidth =18
  ResizeGadget(SpinGadget_ ,left,top,width,heigth+1)
  ResizeGadget(gadget ,0,0,width-UpDownWidth,heigth-1)
  MoveWindow_(SpinGadget_UpDown,GadgetWidth(gadget),-1,UpDownWidth,heigth+1,1)
  
EndProcedure

Procedure HideSpinGadget_(Gadget,param)
  If param =1
    param=0
  Else
    param=1
  EndIf  
  
  ShowWindow_(GadgetID(SpinGadget_),param)  
  ShowWindow_(GadgetID(Gadget),param)  
  ShowWindow_(SpinGadget_UpDown,param)  
  
EndProcedure
;}------------------------------
; ------------------------------

Procedure MainWindowCallBack(hwnd, msg, wparam, lparam) 
  result = #PB_ProcessPureBasicEvents 
  
  Select msg 
    Case #WM_DRAWITEM 
      
      *lpdis.DRAWITEMSTRUCT = lparam 
      Dim itemrect.RECT(3) 
      For i = 1 To 3 
        RtlZeroMemory_(@itemrect(i),SizeOf(RECT)) 
        itemrect(i)\top = i 
        SendMessage_(*lpdis\hwndItem, #LVM_GETSUBITEMRECT, *lpdis\itemid, @itemrect(i)) 
        text$ = GetGadgetItemText(GetDlgCtrlID_(*lpdis\hwndItem), *lpdis\itemid, i) 
        SelectObject_(*lpdis\hDC, GetStockObject_(#NULL_PEN)) 
        If *lpdis\itemid=0 Or *lpdis\itemid=5
          WhiteBrush = CreateSolidBrush_($00FFFF) 
        Else
          WhiteBrush = GetStockObject_(#HOLLOW_BRUSH) ; Прозрачная кисть.
        EndIf
        
        SelectObject_(*lpdis\hDC, WhiteBrush) 
        Rectangle_(*lpdis\hDC, itemrect(i)\left, itemrect(i)\top, itemrect(i)\right, itemrect(i)\bottom) 
        
        TextOut_(*lpdis\hDC, itemrect(i)\left+4, itemrect(i)\top+4, text$, Len(text$)) 
        
        If *lpdis\itemid=0 Or *lpdis\itemid=5
          DeleteObject_(WhiteBrush) 
        EndIf
      Next 
      
    Case #WM_MEASUREITEM 
      
      *lpmis.MEASUREITEMSTRUCT = lparam 
      *lpmis\itemheight = 20 
      
      
  EndSelect 
  
  ProcedureReturn result 
  
EndProcedure 

Procedure Resize(hwnd)
  RtlZeroMemory_(@itemrect.RECT,SizeOf(RECT)) 
  itemrect\top = currentsubitem 
  SendMessage_(hwnd,#LVM_GETSUBITEMRECT, currentitem, @itemrect)       
  ResizeGadget(1,itemrect\left,itemrect\top,itemrect\right-itemrect\left,#PB_Ignore)
  ResizeSpinGadget_(2, itemrect\left,itemrect\top,itemrect\right-itemrect\left, itemrect\bottom-itemrect\top) 
  InvalidateRect_(GadgetID(1),0,1)
EndProcedure

Procedure SubClass_LV(hwnd, msg, wparam, lparam) 
  result = CallWindowProc_(oldproc, hwnd, msg, wparam, lparam) 
  
  If msg = #WM_RBUTTONDOWN Or msg = #WM_LBUTTONDOWN 
    GetCursorPos_(@cp.POINT) 
    MapWindowPoints_(0,hwnd,@cp,1) 
    HitInfo.LVHITTESTINFO 
    Hitinfo\pt\x = cp\x 
    HitInfo\pt\y = cp\y 
    SendMessage_(hwnd,#LVM_SUBITEMHITTEST ,0,@HitInfo) 
    If hitinfo\isubitem > 0 And HitInfo\iItem >= 0 
      currentitem    = hitinfo\iitem 
      currentsubitem = hitinfo\isubitem 
      RtlZeroMemory_(@itemrect.RECT,SizeOf(RECT)) 
      itemrect\top = hitinfo\iSubItem 
      SendMessage_(hwnd,#LVM_GETSUBITEMRECT, hitinfo\iitem, @itemrect) 
      If HitInfo\iSubItem = 2 ; номер столбца где должно отображатся
        If currentitem =1 Or currentitem =2 Or currentitem =3 Or currentitem =4
          ResizeSpinGadget_(2, itemrect\left, itemrect\top, itemrect\right-itemrect\left, itemrect\bottom-itemrect\top) 
          SetGadgetText(2,GetGadgetItemText(0,currentitem,currentsubitem))
          SetFocus_(GadgetID(2))
          HideSpinGadget_(2,0) 
          HideGadget(1,1) 
          
          ;Debug currentitem
        ElseIf currentitem =0
        ElseIf currentitem =5
          
        Else
          ResizeGadget(1, itemrect\left, itemrect\top, itemrect\right-itemrect\left, itemrect\bottom-itemrect\top) 
          SetGadgetText(1,GetGadgetItemText(0,currentitem,currentsubitem))
          SetFocus_(GadgetID(1))
          HideGadget(1,0) 
          HideSpinGadget_(2,1) 
          
        EndIf
        
        
        
        
      Else 
        Debug currentsubitem
        HideGadget(1,1) 
        HideSpinGadget_(2,1) 
        
      EndIf 
    Else 
      HideGadget(1,1) 
      HideSpinGadget_(2,1) 
      
    EndIf 
  ElseIf msg=#WM_HSCROLL Or msg=#WM_VSCROLL 
    Resize(hwnd)
  ElseIf msg=#WM_NOTIFY 
    *nmHEADER.HD_NOTIFY = lParam 
    Select *nmHEADER\hdr\code 
      Case #HDN_ITEMCHANGING
        Resize(hwnd)
    EndSelect 
    
  EndIf 
  
  ProcedureReturn result 
  
EndProcedure 

OpenWindow(0,0,0,320,340,"",$CF0001) 
SetWindowCallback(@MainWindowCallBack()) 


ListIconGadget(0,0,0,320,340,"",0,#PB_ListIcon_GridLines|#LVS_OWNERDRAWFIXED) 
oldproc = SetWindowLongPtr_(GadgetID(0), #GWL_WNDPROC, @SubClass_LV()) 
AddGadgetColumn(0,1,"Название",130) 
AddGadgetColumn(0,2,"Значение",100) 

AddGadgetItem(0, -1, Chr(10) + "ПОЛОЖЕНИЕ ОКНА" + Chr(10) + "" + Chr(10) ) 

AddGadgetItem(0, -1, Chr(10) + "Left" + Chr(10) + "5" + Chr(10) ) 
AddGadgetItem(0, -1, Chr(10) + "Top" + Chr(10) + "5" + Chr(10)  ) 
AddGadgetItem(0, -1, Chr(10) + "Width" + Chr(10) + "350" + Chr(10) ) 
AddGadgetItem(0, -1, Chr(10) + "Height" + Chr(10) + "200" + Chr(10)  )

AddGadgetItem(0, -1, Chr(10) + "СТИЛЬ ОКНА  (ВИД)" + Chr(10) + "" + Chr(10)  ) 

AddGadgetItem(0, -1, Chr(10) + "WindowTool" + Chr(10) + "False" + Chr(10) ) 
AddGadgetItem(0, -1, Chr(10) + "BorderLess" + Chr(10) + "False" + Chr(10)  ) 
AddGadgetItem(0, -1, Chr(10) + "SizeGadget" + Chr(10) + "True" + Chr(10)   ) 
AddGadgetItem(0, -1, Chr(10) + "MinimizeGadget" + Chr(10) + "True" + Chr(10)  ) 
AddGadgetItem(0, -1, Chr(10) + "MaximizeGadget" + Chr(10) + "True" + Chr(10) ) 
AddGadgetItem(0, -1, Chr(10) + "TitleBar" + Chr(10) + "True" + Chr(10)  ) 
AddGadgetItem(0, -1, Chr(10) + "Invizible" + Chr(10) + "False" + Chr(10)   ) 
AddGadgetItem(0, -1, Chr(10) + "NoGadgets" + Chr(10) + "False" + Chr(10)  ) 

ComboBoxGadget(1, 0,20,100,200,#PB_ComboBox_Editable) 
SetParent_(GadgetID(1),GadgetID(0)) 
AddGadgetItem(1,0,"True") 
AddGadgetItem(1,1,"False") 

SpinGadget_(2,5, 183, 100, 20, 0, 2000,13,0)
SetParent_(GadgetID(SpinGadget_),GadgetID(0)) 

HideGadget(1,1) 
HideSpinGadget_(2,1)

Repeat 
  EventID = WaitWindowEvent() 
  Select EventID 
    Case #PB_Event_Gadget 
      
      If currentitem <> 0 And currentitem <> 5 And currentsubitem >= 2
        Select EventGadget() 
          Case 1 
            SetGadgetItemText(0, currentitem, GetGadgetText(1), currentsubitem) 
          Case 2 
            SetGadgetItemText(0, currentitem, GetGadgetText(2), currentsubitem) 
            
        EndSelect 
      EndIf
      
  EndSelect 
Until EventID = #WM_CLOSE

0

27

А теперь как покрасить выбранную строку?

0

28

это знал?

Код:
UsePNGImageDecoder()

If OpenWindow(0, 0, 0, 300, 300, "SetGadgetItemColor", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    LoadImage(0, #PB_Compiler_Home + "examples/sources/Data/world.png")
    ButtonImageGadget(8,5, 83, 100, 120,ImageID(0),#PB_Button_Right)
    SetGadgetText(8,"Push")
    
    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf

0

29

mestnyi написал(а):

А теперь как покрасить выбранную строку?

Код выше запускал?

0

30

Пётр
да конечно.
я имел в виду выбрал строку во время исполнения и покрасилась например синий цвет.

0