Win98上でVB6を使用してCreatePolygonRgnによる平行四辺形のボタンを作成しました。
Win98上ではきちんと切り取れているのですが、Win2000では切り取れません。
CreateEllipticRgnやCreateRectRgnはきちんと両OSで動作しています。
どなたか詳しい方、教えてください。
よろしくお願いいたします。
ちなみに、VB6のフォーム上にPictureコントロールを
貼り付けて、そのPicureBoxにCreatePolygonRgnしたら、
正しく動作しますか?(Win2000)で。
もしできない場合、CreatePlygonRgnしている部分(関数全て)
を、Picture1_Paint()内で呼び出すようにしたら、正しく
動作しますか?
私の環境(Win2000/XP)では、動作しています。
もし差し支えないようでしたら、そのCreatePolygonRgnしている
一式(関数部分)を掲載して下さい。
もしくは、メールアドレスを公開していますので、添付して
送って頂ければ確認できますが・・・
※ Win98の環境はありませんので・・・確認できません。
以上。
岡田 之仁さん、レスありがとうございます。
アドバイスの件試してみました。
>ちなみに、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
リージョンの作成から描画の部分が間違っていると思いますが・・・
尚、このままだと、リソース食いつぶしてしまいますが・・・
以下のコードを参考に・・・
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
以上。
岡田 之仁さん、ありがとうございました。
問題解決しました。
安易にサンプルをコピーして貼り付けて終わらそうとしたのが良くなかったようです。あのソースがWin98で動いてしまったのが、不思議なくらいでした。
>尚、このままだと、リソース食いつぶしてしまいますが・・・
インターネットで、このようなソースを掲載してしまったことをお詫びいたします。注意が足りませんでした。
本当にありがとうございました。
チェックをつけ忘れましたのでつけときます。
ツイート | ![]() |