Вновь о прозрачность формы

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
andrey_manatin
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 13.10.2006 (Пт) 8:18
Откуда: Челябинская обл, Златоуст

Вновь о прозрачность формы

Сообщение andrey_manatin » 30.03.2007 (Пт) 8:46

Здравствуйте.
У меня возник вопрос.
Воспользовался кодом с одной из тем форума, который делает прозрачной только форму, а все контролы оставляет обычными.
Код работает, все хорошо.
Но в моем проекте форма которую надо сделать прозрачной не первая при загрузке. И при обработке кода в нужной форме прозрачность отображается коряво, т.е. контролы обрезаны.
Может кто подскажет как адоптировать данный код под мою задачу.
Заранее спасибо.
Вот пример кода:
Код: Выделить всё

Private Declare Function CreateRoundRectRgn Lib "gdi32" _
(ByVal x1 As Long, ByVal y1 As Long, ByVal x2 As Long, _
ByVal y2 As Long, ByVal x3 As Long, ByVal y3 As Long) As Long

Private Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long, _
ByVal hRgn As Long, ByVal bRedraw As Long) As Long

Private Declare Function CreateRectRgn Lib "gdi32" (ByVal x1 As Long, _
ByVal y1 As Long, ByVal x2 As Long, ByVal y2 As Long) As Long

Private Declare Function CreateEllipticRgn Lib "gdi32" (ByVal x1 As Long, _
ByVal y1 As Long, ByVal x2 As Long, ByVal y2 As Long) As Long

Private Declare Function DeleteObject Lib "gdi32" _
(ByVal hObject As Long) As Long

Private Declare Function CombineRgn Lib "gdi32" (ByVal hDestRgn As Long, _
ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, _
ByVal nCombineMode As Long) As Long

Private Declare Function CreatePolygonRgn Lib "gdi32" (lpPoint As POINTAPI, _
ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long

Private Declare Function BeginPath Lib "gdi32" (ByVal hdc As Long) As Long

Private Declare Function EndPath Lib "gdi32" (ByVal hdc As Long) As Long

Private Declare Function PathToRegion Lib "gdi32" (ByVal hdc As Long) As Long

Private Type POINTAPI
x As Long
y As Long
End Type

Private Const RGN_AND = 1
Private Const RGN_OR = 2
Private Const RGN_XOR = 3
Private Const RGN_DIFF = 4
Private Const RGN_COPY = 5

Private Sub Form_Load()
Dim r1 As Long
Dim r2 As Long
ScaleMode = vbPixels
r1 = CreateRectRgn(0, 0, 0, 0)
For Each Control In Form1.Controls
With Control
r2 = CreateRectRgn(.Left, .Top, .Left + .Width, .Top + .Height)
End With
CombineRgn r1, r1, r2, RGN_OR
Next
SetWindowRgn hwnd, r1, True
DeleteObject r1
DeleteObject r2
End Sub

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 30.03.2007 (Пт) 9:42

А ты не пробовал читать код, который используешь? Задаться, например, вопросом, почему именно Form1?
Попробуй. Это поможет. Честно.
Lasciate ogni speranza, voi ch'entrate.

andrey_manatin
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 13.10.2006 (Пт) 8:18
Откуда: Челябинская обл, Златоуст

Сообщение andrey_manatin » 30.03.2007 (Пт) 12:50

Я конечно не профессионал, но этот момент я учел, просто привел код не из проекта, а со страницы.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 30.03.2007 (Пт) 12:51

А какой код был использован в проекте?
Lasciate ogni speranza, voi ch'entrate.

andrey_manatin
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 13.10.2006 (Пт) 8:18
Откуда: Челябинская обл, Златоуст

Сообщение andrey_manatin » 30.03.2007 (Пт) 16:05

Код который был приведен в начале темы и был использован в проекте.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 30.03.2007 (Пт) 16:10

В таком случае прочитай код, который используешь.
Lasciate ogni speranza, voi ch'entrate.

andrey_manatin
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 13.10.2006 (Пт) 8:18
Откуда: Челябинская обл, Златоуст

Сообщение andrey_manatin » 30.03.2007 (Пт) 16:28

alibek писал(а):В таком случае прочитай код, который используешь.

Ну поясни пожалуйста в чем проблема.

Glyckmen
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 30.04.2006 (Вс) 15:32
Откуда: Санкт-Петербург

Сообщение Glyckmen » 30.03.2007 (Пт) 21:54

andrey_manatin

Ты внимательно читаешь те советы что тебе дают?
alibek писал(а):А ты не пробовал читать код, который используешь? Задаться, например, вопросом, почему именно Form1?


а теперь посмотри на строчку:
Код: Выделить всё
For Each Control In Form1.Controls


а, потом подумай если у тебя вторая форма назывется Form2 , то где у тебя ошибка?

andrey_manatin
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 13.10.2006 (Пт) 8:18
Откуда: Челябинская обл, Златоуст

Сообщение andrey_manatin » 31.03.2007 (Сб) 5:24

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

Glyckmen
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 30.04.2006 (Вс) 15:32
Откуда: Санкт-Петербург

Сообщение Glyckmen » 31.03.2007 (Сб) 9:43

andrey_manatin
Попробуй поиграть со строчкой
Код: Выделить всё
r2 = CreateRectRgn(.Left, .Top, .Left + .Width, .Top + .Height)

У меня по твоему коду функция CreateRectRgn создавала прямоугольную область со смещением в котором виднелись части контролов (хотя по размеру область соответсвовала размеру контролов),добавив в определение координат некоторую константу я получил то что нужно, у меня получилось так:
Код: Выделить всё
r2 = CreateRectRgn(.Left + 4, .Top + 30, .Left + .Width + 4, .Top + .Height + 30)

и все встало на место.
У меня отоброжалось все корректно на обеих испытуемых формах.

Cytron
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 266
Зарегистрирован: 15.02.2007 (Чт) 21:09

Сообщение Cytron » 31.03.2007 (Сб) 18:36

Glyckmen
твой пример не праильный, потому как ты не сможешь обьяснить откуда ты ту некую константу взял. на разных системах могут быть разные цифры. :wink:

Glyckmen
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 30.04.2006 (Вс) 15:32
Откуда: Санкт-Петербург

Сообщение Glyckmen » 01.04.2007 (Вс) 10:53

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

PS:
На работе Windows XP SP2, Видео GeForce4 MX 440, Размер экрана 1024X768
Дома Windows Vista Home Premium, Видео ATI 1950Pro, Размер экрана 1280х1024

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 01.04.2007 (Вс) 13:31

Ну вы издеваетесь? Эти ваши "тайные" константы, которые вы тут тщетно подбираете на самом деле толщина заголовка окна - по вертикали, и ширина боковой (левой) границы (бордера) окна.

Что, трудно их получить?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

andrey_manatin
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 13.10.2006 (Пт) 8:18
Откуда: Челябинская обл, Златоуст

Сообщение andrey_manatin » 02.04.2007 (Пн) 5:23

Хакер писал(а):Ну вы издеваетесь? Эти ваши "тайные" константы, которые вы тут тщетно подбираете на самом деле толщина заголовка окна - по вертикали, и ширина боковой (левой) границы (бордера) окна.
Что, трудно их получить?


Все правильно, если в свойствах формы поставить BorderStyle=0, то код начинает работать нормально и не обрезает контролы. Это проверено на тестовом проекте.
Но в проекте создаваемом мной он почемыто не срабатывает или срабатывает не корректно.

Может это связано с тем что нужная форма грузиться не первой.
Если после строчки кода
Код: Выделить всё
With Control

поставить
Код: Выделить всё
MsgBox Control

то система сообщает информацию о контролах с формы которая заргружается первой в проекте.

Может как нибудь можно сделать так, что бы не загружать нужную форму до определенного момента. Если есть такая возможность подскажите.

Glyckmen
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 30.04.2006 (Вс) 15:32
Откуда: Санкт-Петербург

Сообщение Glyckmen » 02.04.2007 (Пн) 15:06

andrey_manatin

Оператор With тут не причем, он применяется для более краткой записи и все, его можно убрать но тогда придется изменить сроку на такую:
Код: Выделить всё
r2 = CreateRectRgn(control.Left, control.Top, control.Left + control.Width, control.Top + control.Height)

а вот в строке начала цикла там явно какая-то ошибка, проверь всю эту строчку
Код: Выделить всё
For Each Control In Form1.Controls
эта строка как раз и создает специфический цикл для выполнения операций с каждым объектом, входящим в состав коллекции. Проще говоря какую коллецию ты укажешь( в твем случае это коллеция контролов на форме Имя формы.Controls) от туда и будет браться информация. Ищи ошибку здесь, другого быть не может.

andrey_manatin
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 13.10.2006 (Пт) 8:18
Откуда: Челябинская обл, Златоуст

Сообщение andrey_manatin » 03.04.2007 (Вт) 10:50

Glyckmen спасибо за подсказку, но к сожалению не помогло.
Я пробывал переносить формы в другой проект с другой последовательностью, но ничего не помогает.
Жалко. :cry:

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 03.04.2007 (Вт) 12:30

Всё таки издеваетесь :roll:

Код: Выделить всё
Private Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long, ByVal hRgn As Long, ByVal bRedraw As Long) As Long

Private Declare Function CreateRectRgn Lib "gdi32" (ByVal x1 As Long, _
ByVal y1 As Long, ByVal x2 As Long, ByVal y2 As Long) As Long

Private Declare Function DeleteObject Lib "gdi32" _
(ByVal hObject As Long) As Long

Private Declare Function CombineRgn Lib "gdi32" (ByVal hDestRgn As Long, _
ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, _
ByVal nCombineMode As Long) As Long

Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
Const SM_CXFRAME = 32
Const SM_CYFRAME = 33
Const SM_CYSMCAPTION = 51

Private Const RGN_AND = 1
Private Const RGN_OR = 2
Private Const RGN_XOR = 3
Private Const RGN_DIFF = 4
Private Const RGN_COPY = 5

Private Sub Form_Load()
    Dim r1 As Long
    Dim r2 As Long
    Dim xOffset As Long
    Dim yOffset As Long
    Dim ctl As Control
    ScaleMode = vbPixels
    yOffset = GetSystemMetrics(SM_CYSMCAPTION) + GetSystemMetrics(SM_CYFRAME) * 3
    xOffset = GetSystemMetrics(SM_CXFRAME)
   
    r1 = CreateRectRgn(0, 0, 0, 0)
   
    For Each ctl In Form1.Controls
        r2 = CreateRectRgn(ctl.Left + xOffset, _
                            ctl.Top + yOffset, _
                            ctl.Left + ctl.Width + xOffset, _
                            ctl.Top + ctl.Height + yOffset)
        CombineRgn r1, r1, r2, RGN_OR
    Next
   
    SetWindowRgn hwnd, r1, True
   
    DeleteObject r1
    DeleteObject r2
End Sub

—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

andrey_manatin
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 13.10.2006 (Пт) 8:18
Откуда: Челябинская обл, Златоуст

Сообщение andrey_manatin » 03.04.2007 (Вт) 13:18

Постараюсь разобраться.
Спасибо.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 72

    TopList