
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.3] |
![]() |
|
![]() |
Сообщ.
#1
,
|
|
Только для Windows XP, к сожалению.
![]() ![]() Option Explicit Private Const CS_DROPSHADOW = &H20000 Private Const GCL_STYLE = -26 Private Declare Function SetClassLongA Lib "user32.dll" (ByVal hWnd As Long, ByVal nVal As Long, _ ByVal dwValue As Long) As Long Private Declare Function GetClassLongA Lib "user32.dll" (ByVal hWnd As Long, ByVal nVal As Long) As Long Sub AddShadowToForm(ByVal hWnd As Long) Call SetClassLongA(hWnd, GCL_STYLE, GetClassLongA(hWnd, GCL_STYLE) Or CS_DROPSHADOW) End Sub Private Sub Form_Load() Call AddShadowToForm(Me.hWnd) End Sub В FAQ? ![]() |
![]() |
Сообщ.
#2
,
|
|
Как я не люблю код, где вместо констант пишут их значения...
Ну, и что это за стиль со значением 0x20000? |
![]() |
Сообщ.
#3
,
|
|
Сорри, привычка. CS_DROPSHADOW.
GCL_STYLE = -26 - соответственно. |
![]() |
Сообщ.
#4
,
|
|
работает!
|
![]() |
Сообщ.
#5
,
|
|
|
![]() |
Сообщ.
#6
,
|
|
а с чего это и другие формы программы начинают отображаться с тенью =(
|
![]() |
Сообщ.
#7
,
|
|
Есть только маленькое "НО": тень добавляется ко всем формам (т.к. SetClassLong, все же), которые будут открыты позже. Если стиль убрать, то тень "отлипнет" от формы и будет висеть уже сама по себе. Ничего лучше не нашел, чем сделать так, т.к. определить родителя Shadow нет возможности (а может и есть, но док-ции к SysShadow толковой нет):
![]() ![]() Sub KillShadow() Dim hShadow As Long, pID As Long, cpID As Long cpID = GetCurrentProcessId Do hShadow = FindWindowExA(hShadow, 0, "SysShadow", 0&) If hShadow <> 0 Then GetWindowThreadProcessId hShadow, pID If pID = cpID Then DestroyWindow hShadow Exit Do ElseIf hShadow = 0 Then Exit Do End If Loop End Sub Т.к. Shadow создают окна, которые имеют данный стиль (меню или tooltips), то боятся за то, что убьются "не те" тени нечего. Впрочем, вероятно, есть вариант и получше. ps: Данный способ (KillShadow с удалением стиля с класса форм в Form_Unload) прокатывает на УРА. |
![]() |
Сообщ.
#8
,
|
|
мда. геморная фишка.
ответов в сети не нашел. |
![]() |
Сообщ.
#9
,
|
|
Собственно, тень, в основном, хочется использовать либо для SPLASH-окон, либо для собственных имитаций меню или тултипов. А т.к. используется GetClassLong, то единственный верный способ вешать тень на нужное окно - регистрировать свой класс. Вот, набросал на WinAPI класс Splash-окон. Код особенно не старался причесать, много где используются числа вместо констант, но все работает.
Прикреплённый файл ![]() |