powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как облагородить кнопку которая поверх картинки?
10 сообщений из 10, страница 1 из 1
Как облагородить кнопку которая поверх картинки?
    #37010007
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеем: Picturebox с градиентной заливкой, не суть, там может быть картина Репина.
Поверх находится обычная кнопка.
На классике нормально (сверху) , на XP и Виста стилях см.ниже(манифесты естественно включены, кнопка должна быть "стильной", поэтому тему не отключаем) вокруг кнопки обрамление в виде "белой рамки". Цвет обрамления можно поменять с BackColor=ButtonFace на любой другой, но получается еще большая фигня. "Графический стиль" точно не катит с включенными темами, будет еще хуже.

Т.е. вопрос как сделать кнопку без "квадрата кот. вокруг"?
Custom-кнопки не годятся, ибо стили будут нарушены.
В случае Висты конечно можно нарисовать тематический тулбар скажем Communication,

/topic/754298&pg=2&hl=toolbar vista
но это слишком неоправданная работа для одной кнопки, и потом это не прокатит на XP-стиле.

В принципе может быть принудительно придумать/найти custom-кнопку как на Виста тулбаре с градиентом и белым шрифтом независимо от темы...?
Т.е. надо что-то потребное придумать.
...
Рейтинг: 0 / 0
Как облагородить кнопку которая поверх картинки?
    #37017673
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
БенедиктПо кнопке ничего не скажу...Попробуйте посмотреть, будет ли тот же эффект, если кнопку создавать через CreateWindowEx().
Пока не пробовал но скорее всего чуть-чуть границы прямоугольной рамки сгладятся.
БенедиктОчевидность подсказывает: если где видите хорошую, годную кнопку, натравите на неё Spy++. Вдруг что найдётся.
Копания просто в Control Spy ничего не дали. Если только WS_EX_DLGMODALFRAME попробовать, так сказать в рамку пошире ее посадить, да и то сомневаюсь.

А не вижу я нигде хорошей годной.
В висте везде тулбары, но чего-то я не видел окно About с тулбаром. Microsoft всегда делает родной фон под кнопкой в своих About. Тулбар ради одной кнопки, да еще со сносом влево, не годится...

Кто-то закрывает About по щелчке на форме, но у меня это чтоб ее двигать, да и не нравится.

Из известных проложений About Adobe Reader -ну так там заметно. Во первых красный фон не очень градиентный, ну фон кнопки красный, но все равно оно себя выдает и это видно.

Кнопки самоделки в глаза очень бросаются. Они хоть и без контуров, но их собственная топорность это еще хуже.

Ну т.е. идей пока нет, кроме как попробовать чуть сгладить углы, создав через API и чуть поиграться "фоном", по крайней мере верхнюю полосу так можно "почти убрать", внизу полностью не уберешь, это "типа тень".
...
Рейтинг: 0 / 0
Как облагородить кнопку которая поверх картинки?
    #37022190
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Значит так. Создал я кнопку через API и понял что от VB она ничем не отличается.
Но есть одно но:
Есть у кнопки свойство Command.BackColor
При создании через API,т.е.
Код: vbnet
1.
hwndBTN = CreateWindowEx(0, "Button", "OK", WS_CHILD Or WS_VISIBLE, 10, 70, 80, 30, Picture1.hwnd, 0, App.hInstance, ByVal 0&)


ему автоматически присваивается значение Родитель.BackColor, т.е.
Код: vbnet
1.
Command1.BackColor=Picture1.BackColor

, т.е. она старается адаптироваться к фону, но не к картинке (если есть Picture1.Picture).

При этом этот BacColor как раз в случае тематическизх кнопок XP/Vista всплывает и не перерисовываеся темой как ни странно.
Поэтому в упрощенном варианте просто ставим в конструкторе VB
Код: vbnet
1.
Command1.BackColor=<усредненный цвет полоски на уровне верхней границы кнопки>

и получаем тек. версию кнопки (изображено на картинке)



На XP получается весьма неплохо. Нижняя и правая белые полосы это "тематическая тень" и эта тень прикрывает фон снизу, где он не соответствует подложке, ибо цвет брали сверху.

Но вот на Висте ситуация хуже. Там "теней" нет, и фон выглядывает по краям, и внизу (это особенно заметно) на целых 2 пикселя. Можно конечно привязаться к нижнему цвету, но думаю полоса 1 пиксель сверху будет заметна.

Т.е. идеи тут может быть 2:
1) Сделать Command1.BackColor = прозрачный.
2) Установить картинку на BackGround. Картинку создавать функциями семейства CreateGradientBackground "от Бенедикта" по цветам в крайних точках.
Ну, в более общем варианте: спроецировать то что под кнопкой на Background кнопки.

Если что-то из этого удастся, то все будет "по стандарту", а "тематика" нарисуется сверху все равно сама.
Гы...вопрос только как это сделать, свойства BackgroundPicture у кнопки нет (Picture есть но это не то), hdc у ней тоже нет.
Пробовал вот это, по идее шанс был, что именно для кнопки сработает:
Change your Toolbar Background (Color or Picture)
Код: vbnet
1.
2.
PNewBack = CreatePatternBrush(CreateGradientBackground "от Бенедикта")
DeleteObject SetClassLong(lTBWnd, GCL_HBRBACKGROUND, PNewBack


но не прокатило.
Т.е. даже не знаю как сделать монотонный
Command1.BackColor=ЦВЕТ
но через API (при создании через API цвет как упомянул устанавливается автоматически как у родителя)
...
Рейтинг: 0 / 0
Как облагородить кнопку которая поверх картинки?
    #37022984
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, облогородил, как смог. Лучше уже не получится.
Достойный пример нашелся на C++, пришлось попотеть над переводом.
Windows controls with transparent backgound
Но оно себя оправдало на все дальнейшие случаи жизни.
Основная идея что Pattern Brash, который является background кнопки подменяется куском картинки родительского контрола, что лежит под ним, т.е. надо вырезать этот кусочек и подложить под кнопку. Суть такова:
Код: vbnet
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.
    PictureFoto.Picture = LoadPicture("IMG_FOTO.jpg")
    hbmpBackFoto = PictureFoto.Picture.Handle
    hbshBackFoto = CreatePatternBrush(hbmpBackFoto)
    OldFotoWindowProc = SetWindowLong(Form1.PictureFoto.hWnd, GWL_WNDPROC, _
        AddressOf NewFotoWindowProc) 'hbshBackground
===========
'для событий PictureFoto
Public Function NewFotoWindowProc _
  (ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Dim rc As RECT
    Dim tPt As POINTAPI
    Dim ps As PAINTSTRUCT
    Select Case Msg
        Case WM_CTLCOLORBTN:
            SetBkMode wParam, TRANSPARENT
            GetWindowRect lParam, rc
            tPt.x = rc.Left
            tPt.y = rc.Top
            MapWindowPoints 0, GetParent(lParam), tPt, 2
            rc.Left = tPt.x
            rc.Top = tPt.y
            SetBrushOrgEx wParam, -rc.Left, -rc.Top, tPt
            NewFotoWindowProc = hbshBackFoto
            Exit Function
    End Select
    NewFotoWindowProc = CallWindowProc _
      (OldFotoWindowProc, hWnd, Msg, wParam, lParam)
End Function


Полностью готовый тест во вложении, картинка ниже.
Заодно нашел несколько стилевых кнопок для Висты (и для 7 надо думать). Кнопка "СТАРТ" в 3-х ракурсах (редко-уродливое исполнение однако) и стрелки вправо-влево (также доступны для вызова из XP-стиля). Вот для прозрачности энтих без фона уже точно не обойтись.
...
Рейтинг: 0 / 0
Как облагородить кнопку которая поверх картинки?
    #37023155
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Полностью прозрачные кнопки есть на семерке:
Код: plaintext
1.
        SetWindowTheme Command116.hWnd, StrPtr("VerticalShowDesktop"),  0 
        SetWindowTheme Command117.hWnd, StrPtr("ShowDesktop"),  0 

Кнопка "Start" для XP рисуется так:
Код: plaintext
       SetWindowTheme Command115.hWnd, StrPtr("Start"),  0 
с надписью только чего-то не то по умолчанию

На семерке правда не знаю как кнопку "Start" достать.

В общем это в ресурсах .msstyle надо копаться хексом и искать методом тыка, там думаю много чего еще есть, главное знать название органа и имя класса, а тематизируется все одним пинком.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Как облагородить кнопку которая поверх картинки?
    #37851928
donpauls
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дмитрий77Полностью прозрачные кнопки есть на семерке:
Код: vbnet
1.
2.
        SetWindowTheme Command116.hWnd, StrPtr("VerticalShowDesktop"), 0
        SetWindowTheme Command117.hWnd, StrPtr("ShowDesktop"), 0



Кнопка "Start" для XP рисуется так:
Код: vbnet
1.
       SetWindowTheme Command115.hWnd, StrPtr("Start"), 0


с надписью только чего-то не то по умолчанию

На семерке правда не знаю как кнопку "Start" достать.

В общем это в ресурсах .msstyle надо копаться хексом и искать методом тыка, там думаю много чего еще есть, главное знать название органа и имя класса, а тематизируется все одним пинком.

Странно, файл expstyle.exe - запускается и отображается так как показано на картинке, а проект expstyle.vbp запускается так:
...
Рейтинг: 0 / 0
Как облагородить кнопку которая поверх картинки?
    #37851929
donpauls
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сорри, не просмотрел картинку, перед тем как загрузить..
Оутпост к делу никакого отношения не имеет.
...
Рейтинг: 0 / 0
Как облагородить кнопку которая поверх картинки?
    #37851935
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
donpaulsСтранно, файл expstyle.exe - запускается и отображается так как показано на картинке, а проект expstyle.vbp запускается так:
А чего странного?
В VB среде у вас по определению классика (а для классики эффекта не будет), Vista/XP стиль получается за счет файла манифеста, все эфффекты работают именно на "стилях".
...
Рейтинг: 0 / 0
Как облагородить кнопку которая поверх картинки?
    #37853716
donpauls
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дмитрий77donpaulsСтранно, файл expstyle.exe - запускается и отображается так как показано на картинке, а проект expstyle.vbp запускается так:
А чего странного?
В VB среде у вас по определению классика (а для классики эффекта не будет), Vista/XP стиль получается за счет файла манифеста, все эфффекты работают именно на "стилях".

А как комплировать проект, чтобы получить данный эффект?
...
Рейтинг: 0 / 0
Как облагородить кнопку которая поверх картинки?
    #37853860
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
donpaulsА как комплировать проект, чтобы получить данный эффект?
Обычным образом.
Манифест должен либо лежать отдельным файлом в папке с exe (он там есть) -простейший вариант, либо добавлен в ресурсы exe-шника, ну поиск то сделайте, я наверняка выкладывал какие-то проекты с внедренным манифестом.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как облагородить кнопку которая поверх картинки?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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