purebasic.info

PureBasic forum
Текущее время: Чт сен 20, 2018 10:16 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 19 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: SmartyComboBox
СообщениеДобавлено: Пн июн 18, 2018 6:39 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6382
Благодарил (а): 20 раз.
Поблагодарили: 198 раз.
Пункты репутации: 48
SereZa писал(а):
у меня вопрос - а можно ли каким-то winapi заблочить пункт в ниспадающем списке ComboBoxGadget? типа как меню может делать. чтобы этот пункт оставался в списке, но просто не выбирался так сказать.

https://www.purebasic.fr/english/viewto ... 13&t=39010

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
Structure MyCB
  oldProc.i
  prevItm.i
  lastKey.i
EndStructure
wc.WNDCLASSEX\cbSize = SizeOf(WNDCLASSEX)
GetClassInfoEx_(GetModuleHandle_(0), @"ComboBox", @wc)
Global *TmpCB.MyCB, *Text=AllocateMemory(128), CBCB = wc\lpfnWndProc
 
Procedure ComboProc(hWnd, uMsg, wParam, lParam)
  *TmpCB = GetProp_(hWnd, "MyCB")
  If *TmpCB
    oldProc = *TmpCB\oldProc
  Else
    oldProc = CBCB;#WM_DELETEITEM
  EndIf
 
  Select uMsg
    Case #WM_KEYDOWN
      *TmpCB\lastKey = wParam
    Case #WM_NCDESTROY
      RemoveProp_(hWnd, "MyCB")
      FreeMemory(*TmpCB)
  EndSelect
  ProcedureReturn CallWindowProc_(oldProc, hWnd, uMsg, wParam, lParam)
EndProcedure
 
Procedure WinCallback(hWnd, uMsg, wParam, lParam)
  Select uMsg
    Case #WM_DRAWITEM
      *lpdis.DRAWITEMSTRUCT = lParam
      SetBkMode_(*lpdis\hDC, #TRANSPARENT)
      If *lpdis\CtlType = #ODT_COMBOBOX
        If *lpdis\itemState & #ODS_SELECTED
          If CallWindowProc_(CBCB, *lpdis\hwndItem, #CB_GETITEMDATA, *lpdis\itemID, 0) And *lpdis\itemID > -1
            *lpdis\CtlType = GetSysColorBrush_(#COLOR_BTNFACE)
          Else
            *lpdis\CtlType = GetSysColorBrush_(#COLOR_HIGHLIGHT)
          EndIf
        Else
          *lpdis\CtlType = GetSysColorBrush_(#COLOR_WINDOW)
        EndIf
        FillRect_(*lpdis\hDC, *lpdis\rcItem, *lpdis\CtlType)
        *lpdis\rcItem\left+4
       
        If CallWindowProc_(CBCB, *lpdis\hwndItem, #CB_GETLBTEXT, *lpdis\itemID, *Text) > -1
          If CallWindowProc_(CBCB, *lpdis\hwndItem, #CB_GETITEMDATA, *lpdis\itemID, 0);SendMessage_()
            SetTextColor_(*lpdis\hDC, #Gray);GetSysColor_(#COLOR_GRAYTEXT)
          EndIf
          DrawText_(*lpdis\hDC, *Text, -1, *lpdis\rcItem, #DT_NOCLIP|#DT_VCENTER|#DT_SINGLELINE)
          SetTextColor_(*lpdis\hDC, GetSysColor_(#COLOR_WINDOWTEXT))
        EndIf
      EndIf
    Case #WM_COMMAND
      *TmpCB = GetProp_(lParam, "MyCB"); it should be checked if pointer isn't NULL (too lazy for that)
     
      Select (wParam>>16) & $FFFF;HIWORD
        Case #CBN_SELCHANGE
          Var = CallWindowProc_(CBCB, lParam, #CB_GETCURSEL, 0, 0);SendMessage_()
          If Var <> *TmpCB\prevItm
            If CallWindowProc_(CBCB, lParam, #CB_GETITEMDATA, Var, 0);SendMessage_()
              If *TmpCB\lastKey = 38 Or *TmpCB\lastKey = 37;Up
                For i=Var-1 To 0 Step -1
                  If CallWindowProc_(CBCB, lParam, #CB_GETITEMDATA, i, 0) = #False
                    *TmpCB\prevItm = i : Break
                  EndIf
                Next
              ElseIf *TmpCB\lastKey = 40 Or *TmpCB\lastKey = 39;Down
                For i=Var+1 To CallWindowProc_(CBCB, lParam, #CB_GETCOUNT, 0, 0)-1
                  If CallWindowProc_(CBCB, lParam, #CB_GETITEMDATA, i, 0) = #False
                    *TmpCB\prevItm = i : Break
                  EndIf
                Next
              ElseIf *TmpCB\lastKey = 33;PgUp
                For i=0 To CallWindowProc_(CBCB, lParam, #CB_GETCOUNT, 0, 0)-1
                  If CallWindowProc_(CBCB, lParam, #CB_GETITEMDATA, i, 0) = #False
                    *TmpCB\prevItm = i : Break
                  EndIf
                Next
              ElseIf *TmpCB\lastKey = 34;PgDn
                For i=CallWindowProc_(CBCB, lParam, #CB_GETCOUNT, 0, 0)-1 To 0 Step -1
                  If CallWindowProc_(CBCB, lParam, #CB_GETITEMDATA, i, 0) = #False
                    *TmpCB\prevItm = i : Break
                  EndIf
                Next
              EndIf
              CallWindowProc_(CBCB, lParam, #CB_SETCURSEL, *TmpCB\prevItm, 0);SendMessage_()
            Else
              *TmpCB\prevItm = Var
            EndIf
          EndIf
        Case #CBN_DROPDOWN
          *TmpCB\lastKey = 0
      EndSelect
  EndSelect
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
 
Procedure MakeMyCB(ID)
  *TmpCB = AllocateMemory(SizeOf(MyCB))
  *TmpCB\prevItm = SendMessage_(GadgetID(ID), #CB_GETCURSEL, 0, 0)
  *TmpCB\oldProc = SetWindowLongPtr_(GadgetID(ID), #GWL_WNDPROC, @ComboProc())
  SetProp_(GadgetID(ID), "MyCB", *TmpCB)
EndProcedure
 
OpenWindow(0, 0, 0, 270, 140, "ComboBoxGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ComboBoxGadget(1, 10, 40, 250, 21, #CBS_OWNERDRAWFIXED|#CBS_HASSTRINGS)
ComboBoxGadget(2, 10, 70, 250, 21, #CBS_OWNERDRAWFIXED|#CBS_HASSTRINGS)
For i = 1 To 10
  AddGadgetItem(1, -1, "ComboBox A Item " + Str(i))
  AddGadgetItem(2, -1, "ComboBox B Item " + Str(i))
Next
 
MakeMyCB(1)
SendMessage_(GadgetID(1), #CB_SETITEMDATA, 3, #True);DISABLE ITEM
SendMessage_(GadgetID(1), #CB_SETITEMDATA, 4, #True);DISABLE ITEM
SendMessage_(GadgetID(1), #CB_SETITEMDATA, 9, #True);DISABLE ITEM
 
MakeMyCB(2)
SendMessage_(GadgetID(2), #CB_SETITEMDATA, 2, #True);DISABLE ITEM
SendMessage_(GadgetID(2), #CB_SETITEMDATA, 6, #True);DISABLE ITEM
SendMessage_(GadgetID(2), #CB_SETITEMDATA, 7, #True);DISABLE ITEM
 
SetWindowCallback(@WinCallback(), 0)
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
  EndSelect
ForEver


_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: SmartyComboBox
СообщениеДобавлено: Пн июн 18, 2018 9:43 am 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1694
Откуда: Алматы
Благодарил (а): 15 раз.
Поблагодарили: 46 раз.
Пункты репутации: 5
теперь получается все комбогаджеты должны быть "переобъявлены" путем использования MakeMyCB()?

потому как в пример добавляю еще комбогаджет - обычный, то при клике на нем происходит вылет.

и что-то в моем случае disablegadget как-то не правильно работает. надпись остается черным в гаджете, хотя сам гаджет серым-отключенным становится. так то гаджет не работает как полагается, но надпись то должна быть серым, а она черная. но это в моем коде. в этом коде же как полагается серенький цвет.

не получилось применить :) что-то подглючивает :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: SmartyComboBox
СообщениеДобавлено: Пн июн 18, 2018 10:38 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6382
Благодарил (а): 20 раз.
Поблагодарили: 198 раз.
Пункты репутации: 48
Если интересно моё мнение, то эта фишка вообще лишняя. К чему этот глючный трюк с недоступностью? Гораздо проще ненужные просто удалить из списка, когда будет нужно, опять вставить.

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: SmartyComboBox
СообщениеДобавлено: Пн июн 18, 2018 10:42 am 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1694
Откуда: Алматы
Благодарил (а): 15 раз.
Поблагодарили: 46 раз.
Пункты репутации: 5
так у меня номер палитры согласно номеру пункта в списке. ежели удалить скажем 2 пункт, то при выборе 3 пункта - будет определено как 2 пункт. ну или можно читать текст, а не нумерацию. однако я наверное сделаю через кнопку и вызов меню, в нем уже стандартными средствами отключая запрещенный пункт, то есть чтоб был виден, но было видно что он недоступен.


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 19 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB