Проблема с CreatePolygonRgn и SetWindowRgn

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

Проблема с CreatePolygonRgn и SetWindowRgn

Сообщение 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

Re: Проблема с CreatePolygonRgn и SetWindowRgn

Сообщение 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

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

Сейчас этот форум просматривают: Google-бот и гости: 57

    TopList