如何解决vb绘图变形问题?

drunkfsoul 2008-04-01 09:29:27
我尝试用以下代码绘制五角星,得到的结果跟窗体的大小设置有关。如果窗体大小设置不当,则发现五角星跟外圆不相切。如何解决这个问题?

ScaleMode = 3
Scale (0, 0)-(640, 480)

DrawWidth = 2
Circle (320, 240), 200
Dim i As Integer

Dim x1, x2, y1, y2 As Double
pi = 3.1415926
x1 = 320
y1 = 40
For i = 1 To 5
x2 = 320 - 200 * Sin(pi * 0.8 * i)
y2 = 240 - 200 * Cos(i * 0.8 * pi)
Line (x1, y1)-(x2, y2)
x1 = x2
y1 = y2

Next
...全文
131 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
drunkfsoul 2008-04-03
  • 打赏
  • 举报
回复
谢谢两位,不过你们好像都没提到为什么我的代码绘制图形时会出现图形变形。
东方之珠 2008-04-01
  • 打赏
  • 举报
回复
刘老师上面这个五角星真漂亮,还填充透明,不错!
cbm6666 2008-04-01
  • 打赏
  • 举报
回复
'打开窗体贴上代码即可, 随你要几角型的星,改变下面这行的参数即可

'Call DrawAngle(5, 0, 0, SizeWH) '参数:几角型,X座标,Y座标,边长

Option Explicit
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
Const WS_EX_LAYERED = &H80000
Const GWL_EXSTYLE = (-20)
Const LWA_COLORKEY = &H1
Const LWA_ALPHA = &H2
'*******************************
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function CreateSolidBrush Lib "gdi32" (ByVal crColor As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long
Private Declare Function ExtFloodFill Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal crColor As Long, ByVal wFillType As Long) As Long
Const FLOODFILLBORDER = 0
Const pi = 3.14159265358979
Const FLOODFILLSURFACE = 1
Const crNewColor = &HFFFF80
Const SizeWH = 5000 '边长
Dim rtn&, i&, X1&, Y1&, transcolor&, mBrush&
Private Sub Form_Load()
transcolor = RGB(66, 66, 66)
Me.BorderStyle = 0: Me.Caption = "": Me.BackColor = transcolor
Me.FillColor = QBColor(Int(Rnd * 6) + 9): Me.FillStyle = 0
Me.AutoRedraw = True
mBrush = CreateSolidBrush(crNewColor)
SelectObject Me.hdc, mBrush
Call DrawAngle(5, 0, 0, SizeWH) '参数:几角型,X座标,Y座标,边长
Me.ScaleMode = 3: Me.Width = SizeWH * 2: Me.Height = SizeWH * 2
Me.Move (Screen.Width - Me.Width) \ 2, (Screen.Height - Me.Height) \ 2
X1 = Me.Width \ 2 \ 15: Y1 = Me.Height \ 2 \ 15
ExtFloodFill Me.hdc, X1, Y1, Me.Point(X1, Y1), 1
rtn = GetWindowLong(hwnd, GWL_EXSTYLE)
rtn = rtn Or WS_EX_LAYERED
SetWindowLong hwnd, GWL_EXSTYLE, rtn
SetLayeredWindowAttributes hwnd, transcolor, 150, LWA_COLORKEY Or LWA_ALPHA
End Sub

Private Sub Form_Unload(Cancel As Integer)
DeleteObject mBrush
End
End Sub

Public Sub DrawAngle(Nangle%, StartX&, StartY&, Lsize&)
StartX = IIf(StartX <= Lsize, Lsize, StartX)
StartY = IIf(StartY <= Lsize, Lsize, StartY)
Me.Cls
Me.FillColor = QBColor(15)
Me.Circle (StartX, StartY), SizeWH
Me.FillColor = QBColor(10)
Me.PSet (StartX + Sin(0) * Lsize, StartY - Cos(0) * Lsize)
For i = 0 To 360 Step (360 / Nangle)
X1 = StartX + Sin(i * pi / 180) * Lsize
Y1 = StartY - Cos(i * pi / 180) * Lsize
Me.Line -(X1, Y1)
X1 = StartX + Sin((i + (180 / Nangle)) * pi / 180) * Lsize / 2
Y1 = StartY - Cos((i + (180 / Nangle)) * pi / 180) * Lsize / 2
Me.Line -(X1, Y1)
Next i
Me.Line -(StartX + Sin(0) * Lsize, StartY - Cos(0) * Lsize)
DeleteObject mBrush
End Sub

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 2 Then Unload Me
Me.FillColor = QBColor(Int(Rnd * 6) + 9)
ExtFloodFill Me.hdc, X, Y, Me.Point(X, Y), 1
End Sub


效果图:
http://p.blog.csdn.net/images/p_blog_csdn_net/cbm666/366646/o_Star5.jpg

东方之珠 2008-04-01
  • 打赏
  • 举报
回复
'参考一下我写的这个代码
'根据输入的直径画出五角星
Option Explicit

Private Sub Command1_Click()
Dim R, x1, y1, x2, y2, x3, y3, x4, y4, x5, y5
Dim X, Y, chenjl1031
Const Pi = 3.14159265358979
Cls
chenjl1031 = Val(InputBox("输入五角星的直径,大于10,小于窗体高度" & Me.ScaleHeight)) / 2

'中心坐标是(x,y)
X = Me.ScaleWidth / 2: Y = Me.ScaleHeight / 2

Circle (X, Y), chenjl1031 '画外接园

'五个点的坐标为
x1 = X: y1 = Y - chenjl1031
x2 = X + chenjl1031 * Cos(Pi / 10)
y2 = Y - chenjl1031 * Sin(Pi / 10)
x3 = X + chenjl1031 * Cos(54 / 180 * Pi)
y3 = Y + chenjl1031 * Sin(54 / 180 * Pi)
x4 = X - chenjl1031 * Cos(54 / 180 * Pi)
y4 = y3
x5 = X - chenjl1031 * Cos(18 / 180 * Pi)
y5 = y2

'画出五角星
Line (x1, y1)-(x3, y3)
Line -(x5, y5)
Line -(x2, y2)
Line -(x4, y4)
Line -(x1, y1)
End Sub

Private Sub FoRm_Load()
Me.ScaleMode = 3
Me.AutoRedraw = True
End Sub
东方之珠 2008-04-01
  • 打赏
  • 举报
回复
0.8有误差,还要精确

1,453

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧