Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как программно кликнуть VScroll и как сделать кнопки вдавленные / 25 сообщений из 26, страница 1 из 2
04.03.2010, 13:11
    #36502227
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как программно кликнуть VScroll и как сделать кнопки вдавленные
Есть текстовое поле, рядом VScroll
Max=1
Min=100
LargeChange=SmallChange

При нажатии стрелка вверх-вниз в текстовом поле Value в VScroll меняется на +1/-1
Рабочий код такой:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Private Sub TextFrom_KeyDown(KeyCode As Integer, Shift As Integer)
        If KeyCode =  38  Then 'стрелка вверх
            On Error Resume Next
            VScrollFrom.Value = VScrollFrom.Value +  1 
            KeyCode =  0 
            Exit Sub
        ElseIf KeyCode =  40  Then 'стрелка вниз
            On Error Resume Next
            VScrollFrom.Value = VScrollFrom.Value -  1 
            KeyCode =  0 
            Exit Sub
        End If
End Sub

Private Sub VScrollFrom_Change()
    TextFrom.Text = VScrollFrom.Value
End Sub

1)Но он не обеспечивает визуальное нажатие кнопочки на VScrollFrom
Пытался так:
Код: plaintext
1.
2.
3.
4.
5.
6.
Private Const WM_VSCROLL = &H115
Private Const SB_LINEDOWN =  1 
Private Const SB_LINEUP =  0 

            SendMessage VScrollFrom.hWnd, WM_VSCROLL, SB_LINEUP,  0 
...
            SendMessage VScrollFrom.hWnd, WM_VSCROLL, SB_LINEDOWN,  0 

-не работает.
Т.е. как программно кликнуть по VScrollFrom (вверх или вниз) с визуальным эффектом нажатия?


2) В нажатом состоянии кнопочки VScroll выглядят "в плоскости формы", хотелось бы чтоб выглядели вдавленно. Как изменить его стиль? (через vb-параметры VScroll думаю нельзя)

Примечание: через API VScroll я рисовать не хочу, т.к. все события должны вытаскиваться из vb-кода, а не из WM_COMMAND, "сложность конструкции" не позволяет отлавливать WM_COMMAND без глюков.
...
Рейтинг: 0 / 0
04.03.2010, 13:15
    #36502244
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как программно кликнуть VScroll и как сделать кнопки вдавленные
Код: plaintext
1.
2.
3.
4.
5.
Private Declare Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Sub Form_Load()
    ' Command1.Style = 1 ' Graphical
    SendMessage Command1.hWnd, &HF4&, &H0&,  0 &
End Sub

и тд и тп
...
Рейтинг: 0 / 0
04.03.2010, 13:53
    #36502366
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как программно кликнуть VScroll и как сделать кнопки вдавленные
Konst_One,
то что SendMessage надо декларировать, я как бы в курсе.
Причем тут Command я честно так и не понял.

Создайте чистый проект, поместите на форму элемент VScroll1 (VScrollBar)
Запустите.Нажмите верхнюю кнопочку.Она станет плоским прямоугольником, а хочется вдавленный.

Вопросы:
1) Как сделать изображение нажатой кнопки вдавленной?
2) Как программно нажать верхнюю "кнопочку"?
3) Как программно нажать нижнюю "кнопочку"?

>и тд и тп
спасибо, тд и тп я уже неделю занимаюсь, больше успешно, чем неуспешно.
Но нужен ответ на конкретный вопрос.

Если вы намекаете что надо использовать две кнопочки вместо VScroll (в чем я сомневаюсь), тогда я забью пока.

В нек. C++ проекте на эту тему (рыл ресурсы)
используется некий SPIN со стилем
Auto buddy=yes
Set buddy integer=yes
Arrow keys=yes
...
Рейтинг: 0 / 0
04.03.2010, 13:58
    #36502379
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как программно кликнуть VScroll и как сделать кнопки вдавленные
я просто как пример привёл. аналогично можно и с контролом скроллинга попробовать.
...
Рейтинг: 0 / 0
04.03.2010, 14:11
    #36502416
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как программно кликнуть VScroll и как сделать кнопки вдавленные
Ну это понятно.
Склоняюсь к мысли что проще забить.
Потому что SPIN и Scroll, как я уже понял это разные элементы, в VB просто нету SPIN. Идея использовать VScroll вместо SPIN неплоха но видимо только "как есть", т.е. нет ответов на заданные вопросы. (Кликните верхушку vscroll на тек. странице форума, он плоский, однако)
...
Рейтинг: 0 / 0
04.03.2010, 14:13
    #36502421
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как программно кликнуть VScroll и как сделать кнопки вдавленные
у меня выпуклый
...
Рейтинг: 0 / 0
04.03.2010, 14:41
    #36502538
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как программно кликнуть VScroll и как сделать кнопки вдавленные
XP классич. интерфейс, IE8
Пока не нажали выпуклый, нажали и удерживаем-плоский.
я думаю, эту тему проехали.

...М. б. с ходу знаете ответ.
Как цвет textbox через sendmessage поменять на белый?
он у меня и стоит Window BackGround=белый
Но мне нужен locked=true
Если назначить родителем текстбокса Common диалог
то на диалоге текстбокс будет серый, а не белый
предполагаю что белый цвет можно вернуть через API, но не могу найти нужную константу для SendMessage.
...
Рейтинг: 0 / 0
04.03.2010, 14:48
    #36502569
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как программно кликнуть VScroll и как сделать кнопки вдавленные
у меня vista

для TextBox укажите явный цвет заливки не из системной палитры
...
Рейтинг: 0 / 0
04.03.2010, 14:56
    #36502603
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как программно кликнуть VScroll и как сделать кнопки вдавленные
>для TextBox укажите
При помещении на диалог виндам плевать что я там указывал, стиль элемента надо "переобъяснять" через API, если мнение виндов не совпало с моим.
...
Рейтинг: 0 / 0
04.03.2010, 14:57
    #36502606
AndrF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как программно кликнуть VScroll и как сделать кнопки вдавленные
...
Рейтинг: 0 / 0
04.03.2010, 15:04
    #36502633
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как программно кликнуть VScroll и как сделать кнопки вдавленные
тогда думаю, что будет достаточно трудно. придётся видимо работать с HDC текстбокса и через ф-ию SetBkColor
...
Рейтинг: 0 / 0
04.03.2010, 15:21
    #36502710
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как программно кликнуть VScroll и как сделать кнопки вдавленные
Код: plaintext
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.
'Public Module
Option Explicit

Private Const GWL_WNDPROC = - 4 
Private Const WM_SIZE = &H5
Private Const WM_MOVE = &H3
Private Const WM_PAINT = &HF


Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal HWND As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Private Declare Function CallWindowProc Lib "user32" Alias _
    "CallWindowProcA" (ByVal lpPrevWndFunc As Long, _
    ByVal HWND As Long, ByVal Msg As Long, ByVal wParam _
    As Long, ByVal lParam As Long) As Long


Private gWH As Long
Private OldWndProc As Long
Private ctl As TextBox

Public Function WindowProc(ByVal HWND As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
On Error Resume Next
Dim X As Long
    
    X = CallWindowProc(OldWndProc, HWND, Msg, wParam, lParam)
    
    Select Case Msg
        Case WM_PAINT
            ctl.BackColor = vbRed
    End Select
    
    WindowProc = X
End Function

Public Sub Subclass(ByRef mCtl As TextBox)
    Set ctl = mCtl
    gWH = ctl.HWND
    OldWndProc = SetWindowLong(gWH, GWL_WNDPROC, AddressOf WindowProc)
End Sub

Public Sub UnSubclass()
    Set ctl = Nothing
    SetWindowLong gWH, GWL_WNDPROC, OldWndProc
End Sub


'Form1
'Text1 - textbox
Option Explicit

Private Sub Form_Load()
    Me.Text1.BackColor = vbWhite
    Me.Text1.Locked = True
    Subclass Me.Text1
End Sub

Private Sub Form_Unload(Cancel As Integer)
    UnSubclass
End Sub
...
Рейтинг: 0 / 0
04.03.2010, 16:04
    #36502908
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как программно кликнуть VScroll и как сделать кнопки вдавленные
Konst_One,
спасибо но так в моем случае не годится
у меня итак перегружено этими WinProc.
Я рассчитывал, что можно сделать через senmessage по типу
Sendmessage(hwndTextBox, WM_что-либо_setbgcolor, vbWhite)
С такими страстями проще позволить ввод в textbox (locked=false он будет белый) и написать тупо обработку этого ввода, как я и думал сначала.
Просто сама обработка не очень легкая.

Есть текстовое поле, рядом VScroll
Max=1
Min=100
LargeChange=SmallChange=1
Сами min и max могут меняться
т.е. когда Text_change надо проверять значение textbox.text на валидность
(целые от max до min) и если значение корректно то записывать его в Vscroll.value

ну допустим разрешаю вводить только "012...9" -разумно
но если например Max=3 Min=20
и я ввожу 12 , то 1 -неправильно, а 12 -правильно,
т.е. я не могу изменять текст в процессе ввода
грубо говоря неправильное значение не будет присваиваться Vscroll.value но обязано отображаться, иначе 12 я не введу никогда.
Т.е. обработка текста (если ее делать) здесь очень неблагодарная.
...
Рейтинг: 0 / 0
04.03.2010, 16:07
    #36502923
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как программно кликнуть VScroll и как сделать кнопки вдавленные
textbox залоченный не даёт смену цвета фона, у него по WM_PAINT перерисовка идёт постоянно
...
Рейтинг: 0 / 0
04.03.2010, 16:48
    #36503120
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как программно кликнуть VScroll и как сделать кнопки вдавленные
Ну тогда обрабатывать текст и не париться.


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Private Sub TextFrom_Change()
    Dim str As String
    str = TextFrom.Text
    If (IsNumeric(str) = True) Then
        If (CInt(str) >= VScrollFrom.Max) And (CInt(str) <= VScrollFrom.Min) Then
            VScrollFrom.Value = CInt(str)
        End If
    End If
End Sub

Единственное, IsNumeric(str) кажется не гарантирует что число целое.
Есть что-то типа IsInteger или IsLong?

Можно конечно еще вот это добавить,

Код: plaintext
1.
2.
3.
4.
Private Sub TextFrom_KeyPress(KeyAscii As Integer)
    If InStr("0123456789", Chr(KeyAscii)) =  0  Then
        KeyAscii =  0 
    End If
End Sub
но оно имеет свой минус, напр. стрелка над Enter не будет работать
И потом от лома нет приема: команда Вставить например....

А еще проще вот так, по варварски: все что неправильно присваиваться не будет, нефиг вводить чего не надо, присвоится только то что допустимо, т.е. целое от max<= value <=min (min у меня всегда больше max, нажатие верхней кнопки VScroll увеличивает Value)
Код: plaintext
1.
2.
3.
Private Sub TextFrom_Change()
    On Error Resume Next
    VScrollFrom.Value = TextFrom.Text
End Sub
...
Рейтинг: 0 / 0
04.03.2010, 16:52
    #36503136
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как программно кликнуть VScroll и как сделать кнопки вдавленные
в mscomctl2 есть специальный контрол для реализации ваешго желания. прикручивается сбоку от текстбокса и назначается мин и макс значение и приращение его
...
Рейтинг: 0 / 0
04.03.2010, 16:55
    #36503151
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как программно кликнуть VScroll и как сделать кнопки вдавленные
называется он UpDown
...
Рейтинг: 0 / 0
04.03.2010, 17:09
    #36503228
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как программно кликнуть VScroll и как сделать кнопки вдавленные
Konst_One,
эге,...!!! похож, это он, прилично смотрящийся.
mscomctl2.ocx за собой тащить?
а SendMessage (нажмем кнопочку) для него есть?...пока не разбирался
...
Рейтинг: 0 / 0
04.03.2010, 17:22
    #36503279
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как программно кликнуть VScroll и как сделать кнопки вдавленные
на счет сообщений для этого контрола не интересовался, но наверное должно быть
...
Рейтинг: 0 / 0
04.03.2010, 19:56
    #36503697
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как программно кликнуть VScroll и как сделать кнопки вдавленные
Что-то не долгой была моя радость по поводу этого контрола.
1)mscomctl2.ocx за собой тащить?
во-первых надо тащить
2) во вторых тащить мало, надо регистрировать, процедура его регистрации на какой-нибудь x64 виста отнюдь не тривиальна.
http://social.msdn.microsoft.com/Forums/en-US/sbappdev/thread/91cf3127-70fe-4726-8a27-31b8964430c5
3) в третьих XP/Vista стили не применяются к этому контролу.
http://vbaccelerator.com/home/VB/code/Libraries/XP_Visual_Styles/Using_XP_Visual_Styles_in_VB/article.asp

Что получаем: при попытке добавить чуть-чуть сомнительной (в силу 3, а xp/vista стиль для VScroll выглядит красивше) красоты сильно рискуем запросто положить все приложение (в силу 2).

Стоит ли оно того или есть комментарии хотя бы по пункту 3?
...
Рейтинг: 0 / 0
05.03.2010, 11:29
    #36504548
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как программно кликнуть VScroll и как сделать кнопки вдавленные
не понимаю смысла, зачем красивости в ущерб функциональности?
...
Рейтинг: 0 / 0
05.03.2010, 13:25
    #36504900
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как программно кликнуть VScroll и как сделать кнопки вдавленные
Konst_One,
так я вроде написал что я не принял (пока во всяком случае) этот контрол.
С mscomctl.ocx я когда-то согласился, ее то достаточно просто мувнуть в папку программы даже без регистрации, а эту ради одного контрола...не стоит.
Т.е. остановился на vscroll.
Тем более все коды для vscroll я уже написал. Дело даже не в кодах-они не сложные.
Если вы следили за моими топиками, то я добавляю vb элементы из vb-формы на диалог:
http://sql.ru/forum/actualthread.aspx?tid=738442
Элементы ведут себя не всегда адекватно. Т.е. самое сложное добавить элемент и обеспечить ему адекватность(в плане сохранения функциональности и сохранения местоположения при OFN_ENABLESIZING ), тот же VScroll например пришлось запихивать во Frame, с Textbox я так делать не хочу, ибо хочу чтоб он получал фокус, радио-кнопки надо "лечить". Плюс всякие игры с pixel/twip буквально методом тыка. При этом я не могу перехватывать события через WinProc т.к. диалог видимо сам использует WinProc и события перехватываются. Добавленные элементы могут случайно наделится функционалом какого-нибудь Cancel или Открыть, надо проверять через вопросик (контекстную справку) на диалоге, и добавлять несколько пустых элементов на форму с кот. добавляю элементы.
Т.е. переписывание кода с VScroll на UpDown задача на несколько дней вперед (с непонятным исходом + 3-мя вышеуказанными издержками). Решил не связываться.
В перспективе конечно надо разобраться с UpDown он же SPIN, но думаю лучше через API, т.к. 2-й msccomct2.ocx меня абсолютно не вдохновил.

Можете спросить зачем я в принципе делаю это навороченное окно сохранения. Просто добавляю отдельный функционал: сохранение многостраничных TIFF в разных форматах и ракурсах (отдельные страницы, компрессия, Quality и т.п.). Данный способ (настройки в диалоге) наиболее оптимальный и я решил это сделать "хорошо". И в общем то это таки кажется удается.

По поводу Vista/XP стилей с UpDown, скорее всего что-то еще надо добавить в манифест, чего с ходу естественно не придумалось. А за манифесты вам отдельное спасибо.
...
Рейтинг: 0 / 0
05.03.2010, 13:30
    #36504916
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как программно кликнуть VScroll и как сделать кнопки вдавленные
задача ваша, конечно, не типовая. я бы на вашем месте диалог выбора/сохранения файла сделал бы собственный, а не использовал системный с хуками API.
...
Рейтинг: 0 / 0
05.03.2010, 13:53
    #36505001
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как программно кликнуть VScroll и как сделать кнопки вдавленные
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Private Type tagInitCommonControlsEx
lngSize As Long
lngICC As Long
End Type
Public Declare Sub InitCommonControls Lib "Comctl32.dll" ()
Private Declare Function InitCommonControlsEx Lib "comctl32.dll" _
(iccex As tagInitCommonControlsEx) As Boolean
Private Const ICC_USEREX_CLASSES = &H200

Public Function InitCommonControlsVB() As Boolean
On Error Resume Next
Dim iccex As tagInitCommonControlsEx
' Ensure CC available:
With iccex
.lngSize = LenB(iccex)
.lngICC = ICC_USEREX_CLASSES
End With
InitCommonControls
InitCommonControlsEx iccex

InitCommonControlsVB = (Err.Number =  0 )
  
End Function
...
Рейтинг: 0 / 0
05.03.2010, 16:12
    #36505319
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как программно кликнуть VScroll и как сделать кнопки вдавленные
Konst_One,
проверяли?

Я пытался не только ваш вариант ICC_USEREX_CLASSES , но и вот эти все константы,через Or или по-отдельности.

Private Const ICC_USEREX_CLASSES = &H200
Private Const ICC_BAR_CLASSES As Long = &H4 'toolbar, statusbar, trackbar, tooltips
Private Const ICC_UPDOWN_CLASS = &H10

Все хорошо (c другими контролами), но не для UpDown.
SPIN из приложения, на кот. смотрю нормально/стильно перерисовывается, а UpDown вечно-серенький.
Если у вас работает, буду искать ошибку.

>я бы на вашем месте диалог выбора/сохранения файла сделал бы собственный
хочется придерживаться WIN стандартов, собственный контрол я не сумею нарисовать столь профессионально, а хукнутый выглядит "вполне".
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как программно кликнуть VScroll и как сделать кнопки вдавленные / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]