powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / CommandButton
14 сообщений из 14, страница 1 из 1
CommandButton
    #33979990
Arthur26
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Скажите пожалуйста, как изменить цвет текста кнопки?
Спасибо за советы.
...
Рейтинг: 0 / 0
CommandButton
    #33980123
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
CommandButton1.ForeColor = &HFF&
CommandButton1.ForeColor = RGB( 6 ,  255 ,  0 )
...
Рейтинг: 0 / 0
CommandButton
    #33980167
Arthur26
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Говорит что метода ForeColor нет.
Command1.ForeColor - дает ошибку.
...
Рейтинг: 0 / 0
CommandButton
    #33980398
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ForeColor есть в кнопке из VBA MSForms, в VB нет. Можно разве что сабклассить кнопку и писать самостоятельно нужным цветом по WM_PAINT. Однако овчинка выделки не стоит. Проще вставить рисунок с надписью.
...
Рейтинг: 0 / 0
CommandButton
    #33980423
Фотография PA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В design-time изменить стиль(Style) кнопки на Graphical(1), в run-time:
Код: plaintext
CommandButton1.BackColor = vbRed
...
Рейтинг: 0 / 0
CommandButton
    #33980447
Arthur26
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо из компонентов взял Формс и оттуда кнопку.
...
Рейтинг: 0 / 0
CommandButton
    #33980773
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PA, вопрос читал? Цвет не фона, а надписи.
Arthur26, ну и зря. А если на компе клиента не установлен офис? MSForms корректно работают только в комплекте с VBA. Минимальный комплект - 15мб.
...
Рейтинг: 0 / 0
CommandButton
    #33980916
Arthur26
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда есть решение этой проблемы?
Кто-либо не сталкивался с этой проблемой?
...
Рейтинг: 0 / 0
CommandButton
    #33980993
miki1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Стандартными средствами решить нельзя

или нестандартный контроль
или через API


Модуль

Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type

Private Declare Function GetParent Lib "user32" _
(ByVal hWnd As Long) As Long

Private Declare Function GetWindowLong Lib "user32" Alias _
"GetWindowLongA" (ByVal hWnd As Long, _
ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias _
"SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Private Const GWL_WNDPROC = (-4)

Private Declare Function GetProp Lib "user32" Alias "GetPropA" _
(ByVal hWnd As Long, ByVal lpString As String) As Long
Private Declare Function SetProp Lib "user32" Alias "SetPropA" _
(ByVal hWnd As Long, ByVal lpString As String, _
ByVal hData As Long) As Long
Private Declare Function RemoveProp Lib "user32" Alias _
"RemovePropA" (ByVal hWnd As Long, _
ByVal lpString As String) 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 Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(Destination As Any, Source As Any, ByVal Length As Long)

'Owner draw constants
Private Const ODT_BUTTON = 4
Private Const ODS_SELECTED = &H1
'Window messages we're using
Private Const WM_DESTROY = &H2
Private Const WM_DRAWITEM = &H2B

Private Type DRAWITEMSTRUCT
CtlType As Long
CtlID As Long
itemID As Long
itemAction As Long
itemState As Long
hwndItem As Long
hDC As Long
rcItem As RECT
itemData As Long
End Type

Private Declare Function GetWindowText Lib "user32" Alias _
"GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, _
ByVal cch As Long) As Long
Private Declare Function DrawText Lib "user32" Alias "DrawTextA" _
(ByVal hDC As Long, ByVal lpStr As String, ByVal nCount As Long, _
lpRect As RECT, ByVal wFormat As Long) As Long
Private Declare Function SetTextColor Lib "gdi32" (ByVal hDC As Long, _
ByVal crColor As Long) As Long
Private Declare Function SetBkMode Lib "gdi32" (ByVal hDC As Long, _
ByVal nBkMode As Long) As Long
Private Const TRANSPARENT = 1

Private Const DT_CENTER = &H1
Public Enum TextVAligns
DT_VCENTER = &H4
DT_BOTTOM = &H8
End Enum
Private Const DT_SINGLELINE = &H20


Private Sub DrawButton(ByVal hWnd As Long, ByVal hDC As Long, _
rct As RECT, ByVal nState As Long)

Dim s As String
Dim va As TextVAligns

va = GetProp(hWnd, "VBTVAlign")

SetBkMode hDC, TRANSPARENT
SetTextColor hDC, GetProp(hWnd, "VBTForeColor")

s = String$(255, 0)
GetWindowText hWnd, s, 255
s = Left$(s, InStr(s, Chr$(0)) - 1)

If va = DT_BOTTOM Then
rct.Bottom = rct.Bottom - 4
End If

If (nState And ODS_SELECTED) = ODS_SELECTED Then
rct.Left = rct.Left + 1
rct.Right = rct.Right + 1
rct.Bottom = rct.Bottom + 1
rct.Top = rct.Top + 1
End If

DrawText hDC, s, Len(s), rct, DT_CENTER Or DT_SINGLELINE _
Or va

End Sub

Public Function ExtButtonProc(ByVal hWnd As Long, _
ByVal wMsg As Long, ByVal wParam As Long, _
ByVal lParam As Long) As Long

Dim lOldProc As Long
Dim di As DRAWITEMSTRUCT

lOldProc = GetProp(hWnd, "ExtBtnProc")

ExtButtonProc = CallWindowProc(lOldProc, hWnd, wMsg, wParam, lParam)

If wMsg = WM_DRAWITEM Then
CopyMemory di, ByVal lParam, Len(di)
If di.CtlType = ODT_BUTTON Then
If GetProp(di.hwndItem, "VBTCustom") = 1 Then
DrawButton di.hwndItem, di.hDC, di.rcItem, _
di.itemState

End If

End If

ElseIf wMsg = WM_DESTROY Then
ExtButtonUnSubclass hWnd

End If

End Function

Public Sub ExtButtonSubclass(hWndForm As Long)

Dim l As Long

l = GetProp(hWndForm, "ExtBtnProc")
If l <> 0 Then
Exit Sub
End If

SetProp hWndForm, "ExtBtnProc", _
GetWindowLong(hWndForm, GWL_WNDPROC)
SetWindowLong hWndForm, GWL_WNDPROC, AddressOf ExtButtonProc

End Sub

Public Sub ExtButtonUnSubclass(hWndForm As Long)

Dim l As Long

l = GetProp(hWndForm, "ExtBtnProc")
If l = 0 Then
Exit Sub
End If

SetWindowLong hWndForm, GWL_WNDPROC, l
RemoveProp hWndForm, "ExtBtnProc"

End Sub

Public Sub SetButton(ByVal hWnd As Long, _
ByVal lForeColor As Long, _
Optional ByVal VAlign As TextVAligns = DT_VCENTER)

Dim hWndParent As Long

hWndParent = GetParent(hWnd)
If GetProp(hWndParent, "ExtBtnProc") = 0 Then
ExtButtonSubclass hWndParent
End If

SetProp hWnd, "VBTCustom", 1
SetProp hWnd, "VBTForeColor", lForeColor
SetProp hWnd, "VBTVAlign", VAlign

End Sub

Public Sub RemoveButton(ByVal hWnd As Long)

RemoveProp hWnd, "VBTCustom"
RemoveProp hWnd, "VBTForeColor"
RemoveProp hWnd, "VBTVAlign"

End Sub




Форма
добавить Command1,Command2,Command3,Command4

Option Explicit

Private Sub Form_Load()

SetButton Command1.hWnd, vbRed
SetButton Command2.hWnd, &H8000&
SetButton Command3.hWnd, vbBlue, DT_BOTTOM
SetButton Command4.hWnd, &H8080&

End Sub

Private Sub Form_Unload(Cancel As Integer)

RemoveButton Command1.hWnd
RemoveButton Command2.hWnd
RemoveButton Command3.hWnd
RemoveButton Command4.hWnd

End Sub

style=graphical
...
Рейтинг: 0 / 0
CommandButton
    #33981147
shady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторТогда есть решение этой проблемы?
Кто-либо не сталкивался с этой проблемой?

авторПроще вставить рисунок с надписью
во первых. Во вторых в этом же рисунке можно "нарисовать" смысл кнопки
...
Рейтинг: 0 / 0
CommandButton
    #33981649
Arthur26
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Большое спасибо miki1.
Получилось, но жаль плохо разбираюсь в АПИ. А что такое ExtButtonSubclass?
...
Рейтинг: 0 / 0
CommandButton
    #33983478
miki1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ExtButtonSubclass служит для функции обратного вызова AddressOf
создаётся перехватчик сообщений Window на определённое окно (контроль)
У каждого окно есть есть свой индентификатор hwnd (не у всех контролей)
и на каждое сообщение пишется свой исполняемый код

лучше всего про API для Visual Basic написано у Дана Апермана

Я тоже не волшебник и некоторые вещи беру и использую как они есть
...
Рейтинг: 0 / 0
CommandButton
    #33985972
Arthur26
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо Miki1.
А есть где почитать, типа лекций, относительно сложных приемов?
...
Рейтинг: 0 / 0
CommandButton
    #33986456
miki1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть хорошая книга по VB5
Visual Basic Крепкий орешек

книги и статьи от Дан Апермана

много примеров есть по
http://vbnet.mvps.org/

Это очень обширная тема в неё можно копаться до бесконечности
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / CommandButton
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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