Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Тень от окна Добавлено: 08.05.04 13:11  

Автор вопроса:  ZeroX | ICQ: 220401330 
Народ кто знает как сотворить сабж

Ответить

  Ответы Всего ответов: 9  

Номер ответа: 1
Автор ответа:
 Alexander



Вопросов: 19
Ответов: 118
 Профиль | | #1 Добавлено: 08.05.04 15:07

пихаеш в модуль,

Option Explicit

Private Declare Function CallWindowProcA Lib "user32" (ByVal lpPrevWndFunc As Long, ByVal lngHandle As Long, ByVal lngMsg As Long, ByVal lngFirstParam As Long, ByVal lngLastParam As Long) As Long

Private Declare Function SetWindowLongA Lib "user32" (ByVal lngHandle As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long

Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long

Private lngOldProc As Long

Public Sub SetProc(ByVal lngHandle As Long)

lngOldProc = SetWindowLongA(lngHandle, -4, AddressOf WinProc)

End Sub

Private Function WinProc(ByVal lngHandle As Long, ByVal lngMsg As Long, ByVal lngFirstParam As Long, ByVal lngLastParam As Long) As Long

If lngMsg = &H3 Then

frmMain.picShadow.Move frmMain.Left, frmMain.Top

DoEvents

BitBlt frmMain.picShadow.hDC, 0, 0, frmMain.picShadow.Width, frmMain.picShadow.Height, GetDC(0), frmMain.picShadow.Left / Screen.TwipsPerPixelX + 30, frmMain.picShadow.Top / Screen.TwipsPerPixelY + 30, vbSrcCopy

frmMain.picShadow.Line (0, 0)-(frmMain.picShadow.ScaleWidth, frmMain.picShadow.ScaleHeight), vbGrayText, BF

frmMain.picShadow.Move frmMain.Left + (30 * Screen.TwipsPerPixelX), frmMain.Top + (30 * Screen.TwipsPerPixelY), frmMain.Width, frmMain.Height

End If

WinProc = CallWindowProcA(lngOldProc, lngHandle, lngMsg, lngFirstParam, lngLastParam)

End Function

Пихаеш в форму

Option Explicit

Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long

Private Declare Function GetDesktopWindow Lib "user32" () As Long

Private Sub Form_Load()

SetParent picShadow.hwnd, GetDesktopWindow

SetProc hwnd

End Sub

нормально работает под Win2000 и Win98 на других не тестил.

Ответить

Номер ответа: 2
Автор ответа:
 ZeroX



ICQ: 220401330 

Вопросов: 47
Ответов: 406
 Профиль | | #2 Добавлено: 08.05.04 15:32

Дык этот пример здесь на сайте есть. Он бредовый

Тень нужна как от менюх в XP

Ответить

Номер ответа: 3
Автор ответа:
 ZeroX



ICQ: 220401330 

Вопросов: 47
Ответов: 406
 Профиль | | #3 Добавлено: 08.05.04 17:27

Sub ;DropShadow(hwnd As Long)

    SetClassLong hwnd, GCL_STYLE, GetClassLong(hwnd, GCL_STYLE) Or CS_DROPSHADOW
End Sub

Вот нашел код. Плюс ко всему этому нужно включать в настройках системы

SystemParametersInfo(SPI_SETDROPSHADOW,0,TRUE,0);

Только вот немогу найти значение константы CS_DROPSHADOW

Ответить

Номер ответа: 4
Автор ответа:
 ZeroX



ICQ: 220401330 

Вопросов: 47
Ответов: 406
 Профиль | | #4 Добавлено: 08.05.04 17:35

Нашел!

Private Const CS_DROPSHADOW = &H20000

Ответить

Номер ответа: 5
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #5 Добавлено: 08.05.04 17:38
131072  (десятичное значение)

Ответить

Номер ответа: 6
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #6 Добавлено: 08.05.04 17:40
Опоздал совсем чуть

Ответить

Номер ответа: 7
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #7 Добавлено: 09.05.04 08:36

А теперь продолжение вопроса: Как избавиться от сабжа???

После применения тени к одной из форм проекта, все окна, что будут открыты после этой формы, тоже автоматом рисуются с тенями, независимо от того, выгружена эта форма или нет, ну и соответственно, всё жутко морозится, всё-таки тень требует ресурсов дай боже. Вроде комп у меня не самый медленный, но страшно всё мерзнет. Так как избавиться от тени там, где она не нужна? Отключать всей системе тень - как-то неправильно...

Ответить

Номер ответа: 8
Автор ответа:
 ZeroX



ICQ: 220401330 

Вопросов: 47
Ответов: 406
 Профиль | | #8 Добавлено: 10.05.04 11:06

Sub ;DropShadow(hwnd As Long)

CurrentStyle= GetClassLong hwnd, GCL_STYLE)   

SetClassLong hwnd, GCL_STYLE, CurrentStyle Or CS_DROPSHADOW
End Sub

А где нибудь в анлоад_форм пишешь вот это

SetClassLong hwnd, GCL_STYLE, CurrentStyle

Вроде бы так, я точно не помню

Ответить

Номер ответа: 9
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #9 Добавлено: 10.05.04 16:37

Всё правильно, так и делаю, но при этом:

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

2.Если в программе всего одна форма, и к ней применялась тень - проблем нет. Если форм несколько, то применив тень хотя бы к одной, от теней уже не избавишься, даже выгружая эту форму. Пока полностью не закончит работу программа, тени будут присутствовать.

3.Экспериментально нащупал, что тень - это что-то вроде какого-то объекта, вернее часть формы. Сделаешь форме SetWindowPos c HWND_TOPMOST - тени посл её выгрузки тоже остаются TOPMOST.

4.Единственное, что пока придумал - перед Unload задвинуть форму с тенью за пределы экрана, пусь там висят.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам