Win2000でのCreatePolygonRgn

解決


レノン  2003-11-27 19:06:23  No: 80573

Win98上でVB6を使用してCreatePolygonRgnによる平行四辺形のボタンを作成しました。
Win98上ではきちんと切り取れているのですが、Win2000では切り取れません。
CreateEllipticRgnやCreateRectRgnはきちんと両OSで動作しています。
どなたか詳しい方、教えてください。
よろしくお願いいたします。


岡田 之仁  2003-12-02 07:42:14  No: 80574

ちなみに、VB6のフォーム上にPictureコントロールを
貼り付けて、そのPicureBoxにCreatePolygonRgnしたら、
正しく動作しますか?(Win2000)で。

もしできない場合、CreatePlygonRgnしている部分(関数全て)
を、Picture1_Paint()内で呼び出すようにしたら、正しく
動作しますか?

私の環境(Win2000/XP)では、動作しています。

もし差し支えないようでしたら、そのCreatePolygonRgnしている
一式(関数部分)を掲載して下さい。

もしくは、メールアドレスを公開していますので、添付して
送って頂ければ確認できますが・・・

※  Win98の環境はありませんので・・・確認できません。

以上。


レノン  2003-12-02 18:58:48  No: 80575

岡田 之仁さん、レスありがとうございます。
アドバイスの件試してみました。
>ちなみに、VB6のフォーム上にPictureコントロールを
>貼り付けて、そのPicureBoxにCreatePolygonRgnしたら、
>正しく動作しますか?(Win2000)で。
Win98では切り取れますが、2000では駄目でした。

>もしできない場合、CreatePlygonRgnしている部分(関数全て)
>を、Picture1_Paint()内で呼び出すようにしたら、正しく
>動作しますか?
やはり、Win98では切り取れますが、2000では駄目でした。

少し長くなりますが、アドバイスにあったサンプルのソースを以下に示します。
フォームにPictureBoxを表示させて切り取るものです。
藁にもすがる思いです。よろしくお願いいたします。

Option Explicit

'作成したリージョンをセットする
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" ( _
    ByRef PointArray As POINT, _
    ByVal PointNum As Long, _
    ByVal PolyFillMode As Long) As Long

'点を表わすポイント型を定義
Private Type POINT
    X As Long
    Y As Long
End Type

Private Sub Picture1_Paint()
    
    Dim hRgn As Long
    Dim BtnPoint(5) As POINT
    
    BtnPoint(0).X = 26
    BtnPoint(0).Y = 7
    BtnPoint(1).X = 101
    BtnPoint(1).Y = 7
    BtnPoint(2).X = 89
    BtnPoint(2).Y = 71
    BtnPoint(3).X = 13
    BtnPoint(3).Y = 71
    hRgn = CreatePolygonRgn(BtnPoint(0), 4, 0)
    SetWindowRgn Picture1.hWnd, hRgn, True

End Sub


岡田 之仁  2003-12-02 19:16:55  No: 80576

リージョンの作成から描画の部分が間違っていると思いますが・・・
尚、このままだと、リソース食いつぶしてしまいますが・・・

以下のコードを参考に・・・

Option Explicit

Private Const ALTERNATE = 1
Private Const WHITE_BRUSH = 0

Private Type POINTAPI
        X As Long
        Y As Long
End Type

Private Declare Function CreatePolygonRgn Lib "gdi32" (lpPoint As POINTAPI, ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long
Private Declare Function FillRgn Lib "gdi32" (ByVal hDC As Long, ByVal hRgn As Long, ByVal hBrush As Long) As Long
Private Declare Function GetStockObject Lib "gdi32" (ByVal nIndex As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long

Private Sub Command1_Click()

    Me.Hide
    Unload Me
    
End Sub

Private Sub Test()

' 星の描画
    Const POINT_NUM As Long = 5
    Const PI As Single = 3.14159
    
    Dim p(POINT_NUM - 1) As POINTAPI
    Dim hRgn As Long
    Dim I As Long
    
    '星型リージョン作成用データ初期化
    For I = 0 To POINT_NUM - 1
        p(I).X = 100 * Cos(2 * PI * I * 2 / POINT_NUM) + 100
        p(I).Y = 100 * Sin(2 * PI * I * 2 / POINT_NUM) + 100
    Next
    
    'リージョンの作成
    hRgn = CreatePolygonRgn(p(0), POINT_NUM, ALTERNATE)
    
    'リージョンの描画
    FillRgn Picture1.hDC, hRgn, GetStockObject(WHITE_BRUSH)

    'リージョンの破棄
    DeleteObject hRgn

End Sub

Private Sub Test2()
    
    Dim hRgn As Long
    Dim BtnPoint(3) As POINTAPI
    
    BtnPoint(0).X = 26
    BtnPoint(0).Y = 7
    BtnPoint(1).X = 101
    BtnPoint(1).Y = 7
    BtnPoint(2).X = 89
    BtnPoint(2).Y = 71
    BtnPoint(3).X = 13
    BtnPoint(3).Y = 71
    
    'リージョンの作成
    hRgn = CreatePolygonRgn(BtnPoint(0), 4, 1)
   
    'リージョンの描画
    FillRgn Picture1.hDC, hRgn, GetStockObject(WHITE_BRUSH)

    'リージョンの破棄
    DeleteObject hRgn

End Sub

Private Sub Picture1_Paint()

    'Call Test
    Call Test2
    
End Sub

以上。


レノン  2003-12-02 20:34:46  No: 80577

岡田 之仁さん、ありがとうございました。
問題解決しました。
安易にサンプルをコピーして貼り付けて終わらそうとしたのが良くなかったようです。あのソースがWin98で動いてしまったのが、不思議なくらいでした。

>尚、このままだと、リソース食いつぶしてしまいますが・・・
インターネットで、このようなソースを掲載してしまったことをお詫びいたします。注意が足りませんでした。

本当にありがとうございました。


レノン  2003-12-03 18:21:35  No: 80578

チェックをつけ忘れましたのでつけときます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加