Flat Listbox
5 отговора
140 прегледа
Flat Listbox
Privet !
Znae li niakoi kak (i dali) moje scroll-a na Listbox kotrol da se napravi flat (podobno na Listview s flat-scroll), ne iskam da polzvam activex-kontroli, a s API funkciite na Windows (98/2k). Syshtoto me interesuva i za flat-butonite, makar, che s API uspiah doniakade da gi dokaram da sa ploski, ama vse oshte im se vijdat borderite :)
10x predvaritelno
Znae li niakoi kak (i dali) moje scroll-a na Listbox kotrol da se napravi flat (podobno na Listview s flat-scroll), ne iskam da polzvam activex-kontroli, a s API funkciite na Windows (98/2k). Syshtoto me interesuva i za flat-butonite, makar, che s API uspiah doniakade da gi dokaram da sa ploski, ama vse oshte im se vijdat borderite :)
10x predvaritelno
Re: Flat Listbox
Привет!
И на мен преди много време ми се налагаше да имам плосъл листбокс, но доколкото си спомням скрола така и не успях да го направя плосък. Те по принцип тези контроли се управляват със съобщения, изпратени чрез API-функцията SendMessage. Но не успях и съобщение да намеря.
Тогава взех Flat Scroll-а и го позиционирах върху оригиналния скрол на листбокса. Така се виждаше само флат скрола. След което ги синхронизирах(но не помня как, май се наложи и да използвам SendMessage) и се получи флат листбокс. Помня, че проблем ми беше бордера на листбокса, но го отрязах и стана. И това всичко се събра в един UserControl и клиента беше щастлив. А аз също, защото не ползвах чужди OCX.
Но беше отдавна и нищо дурго не помня
А за бутона никакъв проблем, слагаш си един ПикчърБокс, правиш го плосък, плясваш му някаква картинка и имаш плосък бутон. И следиш само за Click събитието на Пикчъра.
Ако обаче все пак държиш да е Бутон а не Пикчър, можеш самият бутон да го изрежеш, така че да не му се вижда бордъра, а също и оная отвратителна пунктирана линия, когато бутона е получил фокуса. Съжалявам, но код не мога да ти дам, че фирмата в която работех тогава, притежава авторските права.
Но мога да пусна код за изрязване на форма например. Той е приложим за всякакъв контрол, така че сигурно ще ти помогне.
Но кода за изрязване на форма (т.е например да си направиш овална форма на VB), ще го постна само ако има интерес, щотo няма смисъл да пълним форума с глупости
Бии, за да те уважават!
И на мен преди много време ми се налагаше да имам плосъл листбокс, но доколкото си спомням скрола така и не успях да го направя плосък. Те по принцип тези контроли се управляват със съобщения, изпратени чрез API-функцията SendMessage. Но не успях и съобщение да намеря.
Тогава взех Flat Scroll-а и го позиционирах върху оригиналния скрол на листбокса. Така се виждаше само флат скрола. След което ги синхронизирах(но не помня как, май се наложи и да използвам SendMessage) и се получи флат листбокс. Помня, че проблем ми беше бордера на листбокса, но го отрязах и стана. И това всичко се събра в един UserControl и клиента беше щастлив. А аз също, защото не ползвах чужди OCX.
Но беше отдавна и нищо дурго не помня
А за бутона никакъв проблем, слагаш си един ПикчърБокс, правиш го плосък, плясваш му някаква картинка и имаш плосък бутон. И следиш само за Click събитието на Пикчъра.
Ако обаче все пак държиш да е Бутон а не Пикчър, можеш самият бутон да го изрежеш, така че да не му се вижда бордъра, а също и оная отвратителна пунктирана линия, когато бутона е получил фокуса. Съжалявам, но код не мога да ти дам, че фирмата в която работех тогава, притежава авторските права.
Но мога да пусна код за изрязване на форма например. Той е приложим за всякакъв контрол, така че сигурно ще ти помогне.
Но кода за изрязване на форма (т.е например да си направиш овална форма на VB), ще го постна само ако има интерес, щотo няма смисъл да пълним форума с глупости
Бии, за да те уважават!
Razbrah kak stava s API :)
'---- forma s listbox (lisbox1)
Const WSB_PROP_VSTYLE = &H100
Const FSB_FLAT_MODE = 2
Const FSB_ENCARTA_MODE = 1
Const FSB_REGULAR_MODE = 0
Const SB_VERT = 1
Private Declare Function InitializeFlatSB Lib "comctl32" _
(ByVal hWnd As Long) As Long
Private Declare Function UninitializeFlatSB Lib "comctl32" _
(ByVal hWnd As Long) As Long
Private Declare Function FlatSB_SetScrollProp Lib "comctl32" _
(ByVal hWnd As Long, ByVal index As Long, ByVal newValue As Long, _
ByVal fRedraw As Boolean) As Boolean
Private Declare Function FlatSB_SetScrollPos Lib "comctl32" _
(ByVal hWnd As Long, ByVal code As Long, ByVal nPos As Long, _
ByVal fRedraw As Boolean) As Long
Private Declare Function FlatSB_SetScrollRange Lib "comctl32" _
(ByVal hWnd As Long, ByVal code As Long, ByVal nMinPos As Long, _
ByVal nMaxPos As Long, ByVal fRedraw As Boolean) As Long
Private Sub Form_Load()
Dim i As Integer
For i = 1 To 100
List1.AddItem i
Next
InitializeFlatSB List1.hWnd
FlatSB_SetScrollProp List1.hWnd, WSB_PROP_VSTYLE, FSB_FLAT_MODE, True
FlatSB_SetScrollRange List1.hWnd, SB_VERT, 1, 100, True
End Sub
Private Sub Form_Unload(Cancel As Integer)
UninitializeFlatSB List1.hWnd
End Sub
Private Sub List1_Click()
Reposition
End Sub
Private Sub List1_Scroll()
Reposition
End Sub
Private Sub Reposition()
Dim n As Integer
n = List1.TopIndex
FlatSB_SetScrollPos List1.hWnd, SB_VERT, n, True
End Sub
(Корекция: Пренос на по-дългите редове, за да не излизат извън екрана. - Щирлиц)
Редактирано от Щиpлиц на
Re: Razbrah kak stava s API :)
Уеуе-мауе както се казва. Толкова главоболия, за някакво си там лист-боксче 
Единство и Сила!
Единство и Сила!
Re: Razbrah kak stava s API :)
Супер!
Никога нямаше да ми дойде на ум да погледна в comctl32.dll.
Наистина добра работа!
Само с една малка забележка:
Редът:
FlatSB_SetScrollRange List1.hWnd, SB_VERT, 1, 100, True
Трябва да стане на:
FlatSB_SetScrollRange List1.hWnd, SB_VERT, 0, 100, True
Това е, защото когато "влачиш" средния бутон на скрола и го "отнесеш" в най-горна позиция няма да можеш да видиш първият елемент от листбокса (ако имаш 1 вместо 0).
Иначе всичко останало е перфектно.
Браво! от мене
Бии, за да те уважават!
Никога нямаше да ми дойде на ум да погледна в comctl32.dll.
Наистина добра работа!
Само с една малка забележка:
Редът:
FlatSB_SetScrollRange List1.hWnd, SB_VERT, 1, 100, True
Трябва да стане на:
FlatSB_SetScrollRange List1.hWnd, SB_VERT, 0, 100, True
Това е, защото когато "влачиш" средния бутон на скрола и го "отнесеш" в най-горна позиция няма да можеш да видиш първият елемент от листбокса (ако имаш 1 вместо 0).
Иначе всичко останало е перфектно.
Браво! от мене
Бии, за да те уважават!
Re: Razbrah kak stava s API :)
Това ми хареса!
Но има един проблем с този код. Като скролирам лист-бокса с помощта на
скрола на мишката - скрол-бара се обръща на нормален 3D, и след като
насоча мишката към скрол-лентата - тя заема старото си положение, и не
отговаря на състоянието на лист-бокса.
----------------------------------
помислих, хареса ми, помислих пак...
Но има един проблем с този код. Като скролирам лист-бокса с помощта на
скрола на мишката - скрол-бара се обръща на нормален 3D, и след като
насоча мишката към скрол-лентата - тя заема старото си положение, и не
отговаря на състоянието на лист-бокса.
----------------------------------
помислих, хареса ми, помислих пак...