Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут
закрыты.
Читайте
требования к создаваемым темам.
-
giaber
-
- Продвинутый пользователь
-
-
- Сообщения: 108
- Зарегистрирован: 14.01.2009 (Ср) 13:51
giaber » 02.01.2018 (Вт) 11:37
Скачал пример из сети - PictureBox нестандартной формы. Но не работает. Подскажите, в чём моя ошибка?
- Код: Выделить всё
Option Explicit
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 SetWindowRgn Lib "user32" (ByVal hwnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
Private Declare Function CreatePolygonRgn Lib "gdi32" (lpPoint As POINTAPI, ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long
Private Type POINTAPI
X As Long
Y As Long
End Type
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Sub ReleaseCapture Lib "user32" ()
Dim P(50) As POINTAPI
Dim Rgn As Long
Private Sub cmdCreatePolygon_Click()
P(0).X = 132: P(0).Y = 6
P(1).X = 173: P(1).Y = 64
P(2).X = 303: P(2).Y = 71
P(3).X = 213: P(3).Y = 123
P(4).X = 291: P(4).Y = 241
P(5).X = 157: P(5).Y = 154
P(6).X = 5: P(6).Y = 239
P(7).X = 78: P(7).Y = 103
P(8).X = 10: P(8).Y = 58
P(9).X = 100: P(9).Y = 60
P(10).X = 132: P(10).Y = 6
Rgn = CreatePolygonRgn(P(0), 11, 0)
Call SetWindowRgn(Picture1.hwnd, Rgn, True)
End Sub
Private Sub cmdCreateEllipse_Click()
Call SetWindowRgn(Picture1.hwnd, CreateEllipticRgn(0, 0, 299, 200), True)
End Sub
Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 1 Then
Call ReleaseCapture
Call SendMessage(Picture1.hwnd, &HA1, 2, 0&)
End If
End Sub
SetWindowRgn с CreateEllipticRgn работает нормально, а вот с CreatePolygonRgn - ноль реакции
-
giaber
-
- Продвинутый пользователь
-
-
- Сообщения: 108
- Зарегистрирован: 14.01.2009 (Ср) 13:51
giaber » 04.01.2018 (Чт) 23:00
ТЕМА ЗАКРЫТА
Была ошибка в 3-ем параметре функции CreatePolygonRgn.
Вместо:
- Код: Выделить всё
Rgn = CreatePolygonRgn(P(0), 11, 0)
должно быть:
- Код: Выделить всё
Rgn = CreatePolygonRgn(P(0), 11, 1)
Спасибо The trick
Рабочий вариант:
- Код: Выделить всё
Option Explicit
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 SetWindowRgn Lib "user32" (ByVal hwnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
Private Declare Function CreatePolygonRgn Lib "gdi32" (lpPoint As POINTAPI, ByVal nCount As Long, ByVal nPolyFillMode 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 Type POINTAPI
X As Long
Y As Long
End Type
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Sub ReleaseCapture Lib "user32" ()
Dim P(50) As POINTAPI
Dim Rgn As Long
Private Sub cmdCreatePolygon_Click()
P(0).X = 132: P(0).Y = 6
P(1).X = 173: P(1).Y = 64
P(2).X = 303: P(2).Y = 71
P(3).X = 213: P(3).Y = 123
P(4).X = 291: P(4).Y = 241
P(5).X = 157: P(5).Y = 154
P(6).X = 5: P(6).Y = 239
P(7).X = 78: P(7).Y = 103
P(8).X = 10: P(8).Y = 58
P(9).X = 100: P(9).Y = 60
P(10).X = 132: P(10).Y = 6
'
Rgn = CreatePolygonRgn(P(0), 11, 1)
Call SetWindowRgn(Picture1.hwnd, Rgn, True)
End Sub
Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 1 Then
Call ReleaseCapture
Call SendMessage(Picture1.hwnd, &HA1, 2, 0&)
End If
End Sub
Вернуться в Visual Basic 1–6
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 49