Страница: 1 | 2 | 3 |
Вопрос: Кнопки: VB что, заколдован?
Добавлено: 17.06.05 16:37
Автор вопроса: Morpheus | Web-сайт:
Всем добрый день!
Короче, вопрос вот в чём: изучая классы всех кнопок в винде, стало мне ясно, что во всех нормальных прогах, мессажах и даже в кнопке Пуск используется класс Button. И только в мои кнопки кто-то подсыпает какую-то грозу :) И вот мне не понятно, возможно ли вообще создать WinXPStyle кнопку, не применяя контролов и ручной рисовки и обойтись апи? Ок, исследования я начал с того, что заменил MsgBox на API MessageBox в надежде увидеть нормальные кнопки. Безуспешно. Как тогда остальные приложения получают нормальные, ХРшные кнопки в мессаджбоксах? потом я решил явно указать класс окна и создать кнопку через CreateWindowEx. Кнопка создалась, класс - Button... но, опять серая и квадратная :( Возможно ли вообще сделать кнопку Хр через апи, классы и стили? Или я что то не так делал? вот мой код создания окна кнопки:
Private Declare Function CreateWindowEx Lib "user32" Alias "CreateWindowExA" (ByVal dwExStyle As Long, ByVal lpClassName As String, ByVal lpWindowName As String, ByVal dwStyle As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hWndParent As Long, ByVal hMenu As Long, ByVal hInstance As Long, lpParam As Any) As Long
Private Const WS_CHILD = &H40000000
Private Const WS_VISIBLE = &H10000000
Private Const WS_EX_STATICEDGE = 20000
Dim h As Long
Dim w As Long
Private Sub Form_Load()
h = CreateWindowEx(WS_EX_STATICEDGE, "Button", "Push Me", WS_CHILD Or WS_VISIBLE, 10, 10, 100, 50, Me.hWnd, 0, 0, 0)
w = CreateWindowEx(0, "Button", "Push Me", WS_CHILD Or WS_VISIBLE, 200, 10, 100, 50, Me.hWnd, 0, 0, 0)
End Sub
Обе в стиле 98 :(
Ответы
Всего ответов: 34
Номер ответа: 1
Автор ответа:
Morpheus
Вопросов: 224
Ответов: 3777
Web-сайт:
Профиль | | #1
Добавлено: 17.06.05 17:10
Похоже, дело не в вб, или и в вб и в делфях, так как CreateWindowEx в Delpi6 создаёт точно такую же кнопку. может расжиреный стиль надо другой?
Номер ответа: 2
Автор ответа:
bas
Вопросов: 16
Ответов: 30
Web-сайт:
Профиль | | #2
Добавлено: 17.06.05 17:59
О! И правда - кнопки то в vb квадратыне получаются, а в блокноте винды круглые. vb6(sp5)
Я тож бы хотел круглые ()
Номер ответа: 3
Автор ответа:
Дмитрий Щапов
Вопросов: 71
Ответов: 321
Профиль | | #3
Добавлено: 17.06.05 18:19
Манифест...
Наверно на этом сайте качал "Пример помещения Манифеста в файл ресурсов"
Там с кругло-кнопками всё, и мсдж-бокс в т.числе.
Номер ответа: 4
Автор ответа:
bas
Вопросов: 16
Ответов: 30
Web-сайт:
Профиль | | #4
Добавлено: 17.06.05 19:30
Ага, если exe-ку с манифестом сбацать, то работает (почти - некоторые элементы коряво отображаются). Вот только про эти манифеты бы для VB почитать, чтоб корявость исправить. кто знает где?
Номер ответа: 5
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #5
Добавлено: 17.06.05 19:59
В отображении некоторых контролов, в частности бывает черными заливает...
Номер ответа: 6
Автор ответа:
Дмитрий Щапов
Вопросов: 71
Ответов: 321
Профиль | | #6
Добавлено: 17.06.05 20:24
Полагаю про манифест там немного можно вычитать. Думаю манифест - это тока отображение контролов согласно активному стилю в винде и это "чёрное дело" - результат корявых стилей (из-зи [настроек] или [рук программёров] или [мелкософт не любит Frame] - мне думается второе)
Номер ответа: 7
Автор ответа:
Morpheus
Вопросов: 224
Ответов: 3777
Web-сайт:
Профиль | | #7
Добавлено: 17.06.05 20:59
Кстити, DrawFrameConrol тоже не работает. или неверные параметры задал я
2 bas:
Ну, круглые то это не сложно: CreateEllipticRgn кстати, кнопки и правда круглые выходят... даже слишком.
А чё за манифест то? в примерах? в каком разделе? через апи сделан?
Номер ответа: 8
Автор ответа:
AgentFire
ICQ: 192496851
Вопросов: 75
Ответов: 3178
Профиль | | #8
Добавлено: 17.06.05 22:45
*.exe.manifest
Номер ответа: 9
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #9
Добавлено: 17.06.05 23:52
а я рисованные (UcserControl) всегда делаю, ну если стиль XP нужен ... Ну это есстно не то
Номер ответа: 10
Автор ответа:
Дмитрий Щапов
Вопросов: 71
Ответов: 321
Профиль | | #10
Добавлено: 18.06.05 03:55
Но есть и плюс: стиль-то не меняется у проги, а то бывает настроешь,накрасишь так классно, винде стиль поменяешь - сразу такое чудовище, бррр....
Номер ответа: 11
Автор ответа:
Morpheus
Вопросов: 224
Ответов: 3777
Web-сайт:
Профиль | | #11
Добавлено: 18.06.05 07:03
Ну, вообще то мне не нужен именно стиль ХР, мне нужны кнопки, какими их хочет видеть пользователь, а это уже зависит от оси и от настроек. Ведь если дело происходит в 98 или в 2000 мои нарсованные будут смешновато выглядеть у меня вообще в голове не укладывается - как можно вызывать стандартные Winddows API, которые вызывают все проги, а получать другое
ЗЫ: Никакой Манифест на сайте не могу найти чё то зато нашёл пару контроллов
Номер ответа: 12
Автор ответа:
SyavX
Вопросов: 25
Ответов: 149
Профиль | | #12
Добавлено: 18.06.05 09:56
1-й способ
Создаем модуль и стартуем проект с Sub Main
Private Type tagInitCommonControlsEx
lngSize As Long
lngICC As Long
End Type
Private Declare Function InitCommonControlsEx Lib "comctl32.dll" (iccex As tagInitCommonControlsEx) As Boolean
Private Const ICC_USEREX_CLASSES = &H200
'Preventing crashes at shutdown
Private Declare Sub InitCommonControls Lib "comctl32.dll" ()
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Public Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Public m_hMod As Long
Public Sub Main()
' we need to call InitCommonControls before we
' can use XP visual styles. Here I'm using
' InitCommonControlsEx, which is the extended
' version provided in v4.72 upwards (you need
' v6.00 or higher to get XP styles)
On Error Resume Next
' this will fail if Comctl not available
' - unlikely now though!
Dim iccex As tagInitCommonControlsEx
With iccex
.lngSize = LenB(iccex)
.lngICC = ICC_USEREX_CLASSES
End With
InitCommonControlsEx iccex
m_hMod = LoadLibrary("shell32.dll"
InitCommonControls
On Error GoTo 0
' Now start the application
frmMain.Show
End Sub
2-й способ
Не создаем модуль, а пишем это
Private Declare Sub InitCommonControls Lib "comctl32" ()
Private Sub Form_Initialize()
InitCommonControls
End Sub
Бросаем возле exe'шника файл с иминем типа YourProgramName.exe.manifest или засовываем в ехе редактором ресурсов (я исп. Resource Hacker), указываем тип ресурса "24"
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity name="exe.exe" processorArchitecture="x86" version="5.1.0.0" type="win32"/>
<description>
 escription
</description>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="x86" publicKeyToken="6595b64144ccf1df" language="*"/>
</dependentAssembly>
</dependency>
</assembly>
В папочке Windows (в XP естесственно) их достаточно этих манифестов
Вот и усё...
Номер ответа: 13
Автор ответа:
bas
Вопросов: 16
Ответов: 30
Web-сайт:
Профиль | | #13
Добавлено: 18.06.05 12:46
А как избавиться от черноты в фреймах вокруг кнопок и переключателей? Кто-нибудь знает?
Номер ответа: 14
Автор ответа:
Mihalыch
ICQ: 373-509-101
Вопросов: 56
Ответов: 330
Профиль | | #14
Добавлено: 18.06.05 14:20
Переключатели можно поместить в PictureBox
Номер ответа: 15
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #15
Добавлено: 18.06.05 14:45
Да муть ето всё... есть хорошие отлаженные контролы в хр стиле. А проверить какая ось на компе и показать соответственную кнопку вроде не сложно.