

Option Explicit
Dim WithEvents Pic As PictureBox
'
Private Sub Form_Load()
Dim pp As Integer
ScaleMode = 3: AutoRedraw = True: Caption = "象棋": Font.Size = 20
Height = 9900: Width = 12000
Controls.Add "Vb.TextBox", "Co3", Me: Controls(0).Move 7, 585, 770, 22
Controls(0).Visible = True: Controls(0).BackColor = &HFFEEEE: Controls(0).Font.Size = 14
For pp = 1 To 3
Controls.Add "Vb.Label", "La" & CStr(pp), Me: Controls(pp).Move 100 + pp * 12, 404, 40 + Sgn(1 - pp) * 34, 30
Controls(pp).Visible = False: Controls(pp).BackColor = &HFFDDDD + Sgn(1 - pp) * &H113333
Next pp
Controls(1).ForeColor = &HEEBBBB: Controls.Add "Vb.Label", "La4", Me
Controls(4).Visible = False: Controls(4).BackColor = &HDD8888: Controls(4).Caption = "选择"
Controls(4).ForeColor = &HFFFFFF: Controls(4).Move 566, 547, 58, 30
Set Pic = Controls.Add("Vb.PictureBox", "Pic", Me)
Pic.ScaleMode = 3: Pic.BorderStyle = 1: Pic.Move 541, 12, 242, 528
Pic.AutoRedraw = True: Pic.BackColor = &HDDFFBB: Pic.Visible = True
Line (5, 7)-(536, 580), 15658751, BF '画棋盘底色
For pp = 0 To 8 '在循环结构中,完成位置不规则的炮台标记制作
Line (40 + pp * 57, 39)-(40 + pp * 57, 268) '画横纵线条
Line (40, 39 + pp * 57)-(496, 39 + pp * 57)
Line (40 + pp * 57, 324)-(40 + pp * 57, 552)
If pp = 1 Or pp = 2 Then '生成棋盘网格之外的其它构造
Line (211, 39 + 399 * (pp \ 2))-(325, 153 + 399 * (pp \ 2)) '画斜线
Line (325, 39 + 399 * (pp \ 2))-(211, 153 + 399 * (pp \ 2))
Line (97 - Sgn(1.5 - pp) * 6, 153 - 12)-(97 - Sgn(1.5 - pp) * 6, 153 - 6) '画左上炮台标记
Line (97 - Sgn(1.5 - pp) * 12, 153 - 6)-(97 - Sgn(1.5 - pp) * 6, 153 - 6) '由8根短线条构成
Line (97 - Sgn(1.5 - pp) * 6, 153 + 12)-(97 - Sgn(1.5 - pp) * 6, 153 + 6)
Line (97 - Sgn(1.5 - pp) * 12, 165 - 6)-(97 - Sgn(1.5 - pp) * 6, 165 - 6)
If pp = 2 Then Picture = Image: PaintPicture Picture, 427, 140, _
25, 30, 85, 140, 25, 30 '改变已画图形属性,复制炮台标记至右上位置
ElseIf pp > 2 And pp < 6 Then '复制其余同类标记
PaintPicture Picture, 142 + (pp - 3) * 114, 197, 25, 30, 85, 140, 25, 30
PaintPicture Picture, 142 + (pp - 3) * 114, 368, 25, 30, 85, 140, 25, 30
If pp > 3 Then PaintPicture Picture, 85 + (pp \ 5) * 342, 425, 25, 30, 85, 140, 25, 30
ElseIf pp > 6 Then '复制靠边界的半个标记
PaintPicture Picture, 40, 197 + (pp \ 8) * 171, 12, 30, 97, 140, 12, 30
PaintPicture Picture, 484, 197 + (pp \ 8) * 171, 12, 30, 85, 140, 12, 30
End If
Next pp
Line (40, 39 + pp * 57)-(496, 39 + pp * 57)
Line (40, 268)-(40, 328): Line (496, 268)-(496, 328)
End Sub
'
Private Sub Form_Resize()
If WindowState <> 1 Then '当窗口非最小化变动时
WindowState = 0
Left = (Screen.Width - 12000) / 2
Top = (Screen.Height - 9900) / 2
Move Left, Top, 12000, 9900 '还原初始的尺寸与位置
End If
End Sub
'函数 Sgn() 有特别的属性,考察其在两个 For 循环结构中的不同表现,认识它的变异作用
'语句 Picture = Image 相对关键,请深刻了解它们不同的图形内涵