powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как программно кликнуть VScroll и как сделать кнопки вдавленные
26 сообщений из 26, показаны все 2 страниц
Как программно кликнуть VScroll и как сделать кнопки вдавленные
    #36502227
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть текстовое поле, рядом 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
Как программно кликнуть VScroll и как сделать кнопки вдавленные
    #36502244
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
Как программно кликнуть VScroll и как сделать кнопки вдавленные
    #36502366
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One,
то что SendMessage надо декларировать, я как бы в курсе.
Причем тут Command я честно так и не понял.

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

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

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

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

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

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

для TextBox укажите явный цвет заливки не из системной палитры
...
Рейтинг: 0 / 0
Как программно кликнуть VScroll и как сделать кнопки вдавленные
    #36502603
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>для TextBox укажите
При помещении на диалог виндам плевать что я там указывал, стиль элемента надо "переобъяснять" через API, если мнение виндов не совпало с моим.
...
Рейтинг: 0 / 0
Как программно кликнуть VScroll и как сделать кнопки вдавленные
    #36502606
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как программно кликнуть VScroll и как сделать кнопки вдавленные
    #36502633
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тогда думаю, что будет достаточно трудно. придётся видимо работать с HDC текстбокса и через ф-ию SetBkColor
...
Рейтинг: 0 / 0
Как программно кликнуть VScroll и как сделать кнопки вдавленные
    #36502710
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
Как программно кликнуть VScroll и как сделать кнопки вдавленные
    #36502908
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как программно кликнуть VScroll и как сделать кнопки вдавленные
    #36502923
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
textbox залоченный не даёт смену цвета фона, у него по WM_PAINT перерисовка идёт постоянно
...
Рейтинг: 0 / 0
Как программно кликнуть VScroll и как сделать кнопки вдавленные
    #36503120
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну тогда обрабатывать текст и не париться.


Код: 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
Как программно кликнуть VScroll и как сделать кнопки вдавленные
    #36503136
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в mscomctl2 есть специальный контрол для реализации ваешго желания. прикручивается сбоку от текстбокса и назначается мин и макс значение и приращение его
...
Рейтинг: 0 / 0
Как программно кликнуть VScroll и как сделать кнопки вдавленные
    #36503151
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
называется он UpDown
...
Рейтинг: 0 / 0
Как программно кликнуть VScroll и как сделать кнопки вдавленные
    #36503228
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One,
эге,...!!! похож, это он, прилично смотрящийся.
mscomctl2.ocx за собой тащить?
а SendMessage (нажмем кнопочку) для него есть?...пока не разбирался
...
Рейтинг: 0 / 0
Как программно кликнуть VScroll и как сделать кнопки вдавленные
    #36503279
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на счет сообщений для этого контрола не интересовался, но наверное должно быть
...
Рейтинг: 0 / 0
Как программно кликнуть VScroll и как сделать кнопки вдавленные
    #36503697
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то не долгой была моя радость по поводу этого контрола.
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
Как программно кликнуть VScroll и как сделать кнопки вдавленные
    #36504548
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не понимаю смысла, зачем красивости в ущерб функциональности?
...
Рейтинг: 0 / 0
Как программно кликнуть VScroll и как сделать кнопки вдавленные
    #36504900
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как программно кликнуть VScroll и как сделать кнопки вдавленные
    #36504916
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
задача ваша, конечно, не типовая. я бы на вашем месте диалог выбора/сохранения файла сделал бы собственный, а не использовал системный с хуками API.
...
Рейтинг: 0 / 0
Как программно кликнуть VScroll и как сделать кнопки вдавленные
    #36505001
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
Как программно кликнуть VScroll и как сделать кнопки вдавленные
    #36505319
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как программно кликнуть VScroll и как сделать кнопки вдавленные
    #36505342
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не проверял
...
Рейтинг: 0 / 0
26 сообщений из 26, показаны все 2 страниц
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как программно кликнуть VScroll и как сделать кнопки вдавленные
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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