Кнопки с иконками и стилем Windows XP

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
bon818
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 267
Зарегистрирован: 29.08.2009 (Сб) 4:49
Откуда: Ташкент

Re: Кнопки с иконками и стилем Windows XP

Сообщение bon818 » 24.06.2012 (Вс) 23:32

Непонятно почему ты манифест невидеш ? всё стандартно лежит где положено

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Кнопки с иконками и стилем Windows XP

Сообщение ger_kar » 24.06.2012 (Вс) 23:40

bon818 писал(а):есть там манифест!
Однако он странный этот манифест. Я так и не понял в чем прикол, но исследовав файл ресурса в редакторе ресурсов манифеста обнаружить не смог, как не пытался, как впрочем и исследования в Hex редакторе мало чем помогло в обнаружении оного. Если он там есть, а стили XP косвенно на это указывают, то в каком виде он там содержится? Явно что не в стандартном.
Бороться и искать, найти и перепрятать

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Кнопки с иконками и стилем Windows XP

Сообщение ger_kar » 24.06.2012 (Вс) 23:46

Вот собственно скрины:
Рес1.jpg
Рес1.jpg (27.5 Кб) Просмотров: 995
Рес2.jpg
Рес2.jpg (27.56 Кб) Просмотров: 995
Бороться и искать, найти и перепрятать

bon818
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 267
Зарегистрирован: 29.08.2009 (Сб) 4:49
Откуда: Ташкент

Re: Кнопки с иконками и стилем Windows XP

Сообщение bon818 » 24.06.2012 (Вс) 23:48

вот манифест в картинках в нормальном редакторе
Вложения
манифест.gif
вот манифест в картинках в нормальном редакторе
(16.26 Кб) Скачиваний: 77

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Re: Кнопки с иконками и стилем Windows XP

Сообщение BV » 25.06.2012 (Пн) 11:34

ger_kar, лови мою кнопку (не помню, возможно, где-то и тут на форуме есть): http://forum.sources.ru/index.php?showt ... &p=2510447
Поддерживает иконки, рисуется как кастомными градиентами, как и скином текущего системного стиля
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Кнопки с иконками и стилем Windows XP

Сообщение ger_kar » 25.06.2012 (Пн) 18:29

Скачал, кнопка отличная, и удобная в применении. Спасибо.
Бороться и искать, найти и перепрятать

ark
Бывалый
Бывалый
 
Сообщения: 216
Зарегистрирован: 18.07.2011 (Пн) 0:57

Re: Кнопки с иконками и стилем Windows XP

Сообщение ark » 02.08.2012 (Чт) 10:02

Код: Выделить всё
Option Explicit

Enum BUTTON_IMAGELIST_ALIGN
   ALIGN_LEFT = 0
   ALIGN_RIGHT = 1
   ALIGN_TOP = 2
   ALIGN_BOTTOM = 3
   ALIGN_CENTER = 4
End Enum

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

Private Type BUTTON_IMAGELIST
   hIml As Long
   rc As RECT
   uAlign As Long
End Type

Private Type tagInitCommonControlsEx
   lngSize As Long
   lngICC As Long
End Type

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
Private Declare Function InitCommonControls Lib "comctl32.dll" () As Boolean
Private Declare Function InitCommonControlsEx Lib "comctl32.dll" (iccex As tagInitCommonControlsEx) As Boolean
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 BM_SETIMAGE = &HF7&
Private Const BCM_SETIMAGELIST = &H1602&
Private Const ICC_USEREX_CLASSES = &H200
Private Const GWL_STYLE As Long = -16&

Public Function InitCommonControlsVB() As Boolean
   On Error Resume Next
   Dim iccex As tagInitCommonControlsEx
   With iccex
       .lngSize = LenB(iccex)
       .lngICC = ICC_USEREX_CLASSES
   End With
   InitCommonControlsEx iccex
   If Err Then
      InitCommonControlsVB = InitCommonControls
   Else
      InitCommonControlsVB = True
   End If
   On Error GoTo 0
End Function

Public Sub SetButtonXPIcon(btn As CommandButton, il As ImageList, _
           Optional align As BUTTON_IMAGELIST_ALIGN = ALIGN_CENTER, _
           Optional leftMargin As Long, Optional topMargin As Long, _
           Optional rightMargin As Long, Optional bottomMargin As Long)
   Dim bi As BUTTON_IMAGELIST
   Dim sPic As StdPicture
   bi.uAlign = align
   bi.rc.Left = leftMargin
   bi.rc.Top = topMargin
   bi.rc.Right = rightMargin
   bi.rc.Bottom = bottomMargin
   bi.hIml = il.hImageList
   If SendMessage(btn.hWnd, BCM_SETIMAGELIST, 0, bi) = 0 Then 'не ХР или манифеста нету
      'If btn.Caption = "" Then
         Set sPic = il.ListImages(1).ExtractIcon
        'Меняем стиль на графический и рисуем картинку (текст пропадает)
         SetWindowLong btn.hWnd, GWL_STYLE, GetWindowLong(btn.hWnd, GWL_STYLE) Or (2 - (sPic.Type - 1) / 2) * &H40&
         SendMessage btn.hWnd, BM_SETIMAGE, (sPic.Type - 1) / 2, ByVal sPic.Handle
         If il.Parent.BackColor <> vbButtonFace Then il.Parent.BackColor = vbButtonFace
      'End If
   End If
   Set sPic = Nothing
End Sub

Вызов:
Код: Выделить всё
Private Sub Command1_Click()
   InitCommonControlsVB
    SetButtonXPIcon Command1, ImageList1, ALIGN_LEFT
End Sub
Manifest.zip
А это для добавления манифеста к экзешнику в ресурсы
(15.41 Кб) Скачиваний: 63

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Re: Кнопки с иконками и стилем Windows XP

Сообщение VBTerminator » 03.08.2012 (Пт) 6:39

ark писал(а):
Код: Выделить всё
If il.Parent.BackColor <> vbButtonFace Then il.Parent.BackColor = vbButtonFace

А зачем надо сбрасывать цвет фона родителя кнопки?

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 03.08.2012 (Пт) 7:38

VBTerminator писал(а):А зачем надо сбрасывать цвет фона родителя кнопки?

Думаю, из-за
ark писал(а):'Меняем стиль на графический и рисуем картинку (текст пропадает)
Т. к. если стиль не графический, то цвет фона игнорируется :)

Или прозрачность...

ark
Бывалый
Бывалый
 
Сообщения: 216
Зарегистрирован: 18.07.2011 (Пн) 0:57

Re: Кнопки с иконками и стилем Windows XP

Сообщение ark » 03.08.2012 (Пт) 8:27

Пардон, дернул из старой программы без комментов. У меня в il MaskColor в ButoonFace установлен

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Кнопки с иконками и стилем Windows XP

Сообщение ger_kar » 14.08.2012 (Вт) 19:11

Спасибо, вот только сейчас прочитал пост ark и этот вариант мне понравился, спасибо.
Бороться и искать, найти и перепрятать

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 14.08.2012 (Вт) 20:18

А я сначала подумал про прозрачность, потом решил, что странно использовать для этого зависимый от системы цвет, поэтому решил, что всё-таки что-то другое.

Пред.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Google-бот и гости: 66

    TopList