Страница: 1 |
пихаеш в модуль, 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 на других не тестил. Дык этот пример здесь на сайте есть. Он бредовый Тень нужна как от менюх в XP Sub ropShadow(hwnd As Long) SetClassLong hwnd, GCL_STYLE, GetClassLong(hwnd, GCL_STYLE) Or CS_DROPSHADOW Вот нашел код. Плюс ко всему этому нужно включать в настройках системы SystemParametersInfo(SPI_SETDROPSHADOW,0,TRUE,0); Только вот немогу найти значение константы CS_DROPSHADOW Нашел! Private Const CS_DROPSHADOW = &H20000 А теперь продолжение вопроса: Как избавиться от сабжа??? После применения тени к одной из форм проекта, все окна, что будут открыты после этой формы, тоже автоматом рисуются с тенями, независимо от того, выгружена эта форма или нет, ну и соответственно, всё жутко морозится, всё-таки тень требует ресурсов дай боже. Вроде комп у меня не самый медленный, но страшно всё мерзнет. Так как избавиться от тени там, где она не нужна? Отключать всей системе тень - как-то неправильно... Sub ropShadow(hwnd As Long) CurrentStyle= GetClassLong hwnd, GCL_STYLE) SetClassLong hwnd, GCL_STYLE, CurrentStyle Or CS_DROPSHADOW А где нибудь в анлоад_форм пишешь вот это SetClassLong hwnd, GCL_STYLE, CurrentStyle Вроде бы так, я точно не помню Всё правильно, так и делаю, но при этом: 1.Один раз появившись, тень не исчезнет, хотя и выгрузишь форму, даже вернув прежний стиль класса, так вот эти тени бесхозные висят по всему экрану, там где появлялось окно с тенью. 2.Если в программе всего одна форма, и к ней применялась тень - проблем нет. Если форм несколько, то применив тень хотя бы к одной, от теней уже не избавишься, даже выгружая эту форму. Пока полностью не закончит работу программа, тени будут присутствовать. 3.Экспериментально нащупал, что тень - это что-то вроде какого-то объекта, вернее часть формы. Сделаешь форме SetWindowPos c HWND_TOPMOST - тени посл её выгрузки тоже остаются TOPMOST. 4.Единственное, что пока придумал - перед Unload задвинуть форму с тенью за пределы экрана, пусь там висят. Страница: 1 |
Вопрос: Тень от окна
Добавлено: 08.05.04 13:11
Автор вопроса: ZeroX | ICQ: 220401330
Народ кто знает как сотворить сабж
Ответы
Всего ответов: 9
Номер ответа: 1
Автор ответа:
Alexander
Вопросов: 19
Ответов: 118
Профиль | | #1
Добавлено: 08.05.04 15:07
Номер ответа: 2
Автор ответа:
ZeroX
ICQ: 220401330
Вопросов: 47
Ответов: 406
Профиль | | #2
Добавлено: 08.05.04 15:32
Номер ответа: 3
Автор ответа:
ZeroX
ICQ: 220401330
Вопросов: 47
Ответов: 406
Профиль | | #3
Добавлено: 08.05.04 17:27
End Sub
Номер ответа: 4
Автор ответа:
ZeroX
ICQ: 220401330
Вопросов: 47
Ответов: 406
Профиль | | #4
Добавлено: 08.05.04 17:35
Номер ответа: 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
End Sub
Номер ответа: 9
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #9
Добавлено: 10.05.04 16:37