home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 10 / 10.iso / l / l406 / 1.ddi / JIGSAW.FR_ / JIGSAW.bin (.txt)
Encoding:
Visual Basic Form  |  1992-10-21  |  30.4 KB  |  790 lines

  1. VERSION 2.00
  2. Begin Form JigSaw 
  3.    BackColor       =   &H00FFFFFF&
  4.    Caption         =   "VB JigSaw"
  5.    Height          =   5295
  6.    Icon            =   JIGSAW.FRX:0000
  7.    Left            =   1035
  8.    LinkMode        =   1  'Source
  9.    LinkTopic       =   "Form1"
  10.    ScaleHeight     =   307
  11.    ScaleMode       =   3  'Pixel
  12.    ScaleWidth      =   458
  13.    Top             =   1110
  14.    Width           =   6990
  15.    Begin PictureBox Pic_ScrollBarJoint 
  16.       BackColor       =   &H80000000&
  17.       BorderStyle     =   0  'None
  18.       Height          =   300
  19.       Left            =   6570
  20.       ScaleHeight     =   300
  21.       ScaleWidth      =   300
  22.       TabIndex        =   10
  23.       Top             =   4020
  24.       Width           =   300
  25.    End
  26.    Begin HScrollBar HScroll1 
  27.       Height          =   300
  28.       Left            =   0
  29.       TabIndex        =   4
  30.       Top             =   4020
  31.       Width           =   6585
  32.    End
  33.    Begin PictureBox Pic_PieceMask 
  34.       AutoRedraw      =   -1  'True
  35.       BackColor       =   &H00FFFFFF&
  36.       BorderStyle     =   0  'None
  37.       Height          =   945
  38.       Left            =   2160
  39.       ScaleHeight     =   63
  40.       ScaleMode       =   3  'Pixel
  41.       ScaleWidth      =   147
  42.       TabIndex        =   9
  43.       Top             =   3030
  44.       Visible         =   0   'False
  45.       Width           =   2205
  46.    End
  47.    Begin PictureBox Pic_FinalPiece 
  48.       AutoRedraw      =   -1  'True
  49.       BackColor       =   &H00FFFFFF&
  50.       BorderStyle     =   0  'None
  51.       Height          =   1935
  52.       Left            =   4410
  53.       ScaleHeight     =   129
  54.       ScaleMode       =   3  'Pixel
  55.       ScaleWidth      =   141
  56.       TabIndex        =   8
  57.       Top             =   2040
  58.       Visible         =   0   'False
  59.       Width           =   2115
  60.    End
  61.    Begin PictureBox Pic_PieceImage 
  62.       AutoRedraw      =   -1  'True
  63.       BackColor       =   &H00FFFFFF&
  64.       BorderStyle     =   0  'None
  65.       Height          =   945
  66.       Left            =   2160
  67.       ScaleHeight     =   945
  68.       ScaleWidth      =   2205
  69.       TabIndex        =   7
  70.       Top             =   2040
  71.       Visible         =   0   'False
  72.       Width           =   2205
  73.    End
  74.    Begin PictureBox Pic_Mask 
  75.       AutoRedraw      =   -1  'True
  76.       BackColor       =   &H00FFFFFF&
  77.       BorderStyle     =   0  'None
  78.       FillStyle       =   0  'Solid
  79.       ForeColor       =   &H00000000&
  80.       Height          =   1935
  81.       Left            =   60
  82.       ScaleHeight     =   129
  83.       ScaleMode       =   3  'Pixel
  84.       ScaleWidth      =   137
  85.       TabIndex        =   6
  86.       Top             =   2040
  87.       Visible         =   0   'False
  88.       Width           =   2055
  89.    End
  90.    Begin PictureBox Pic_Window 
  91.       BackColor       =   &H00FFFFFF&
  92.       BorderStyle     =   0  'None
  93.       Height          =   1950
  94.       Left            =   4410
  95.       ScaleHeight     =   130
  96.       ScaleMode       =   3  'Pixel
  97.       ScaleWidth      =   143
  98.       TabIndex        =   2
  99.       Top             =   30
  100.       Width           =   2145
  101.       Begin PictureBox Pic_Work 
  102.          BackColor       =   &H00000000&
  103.          BorderStyle     =   0  'None
  104.          DrawMode        =   6  'Invert
  105.          Height          =   915
  106.          Left            =   600
  107.          ScaleHeight     =   61
  108.          ScaleMode       =   3  'Pixel
  109.          ScaleWidth      =   65
  110.          TabIndex        =   5
  111.          Top             =   510
  112.          Visible         =   0   'False
  113.          Width           =   975
  114.       End
  115.    End
  116.    Begin PictureBox Pic_Bitmap 
  117.       AutoRedraw      =   -1  'True
  118.       AutoSize        =   -1  'True
  119.       BackColor       =   &H00FFFFFF&
  120.       BorderStyle     =   0  'None
  121.       ForeColor       =   &H00FFFFFF&
  122.       Height          =   1950
  123.       Left            =   2160
  124.       ScaleHeight     =   130
  125.       ScaleMode       =   3  'Pixel
  126.       ScaleWidth      =   148
  127.       TabIndex        =   0
  128.       Top             =   60
  129.       Visible         =   0   'False
  130.       Width           =   2220
  131.    End
  132.    Begin PictureBox Pic_PuzzleImage 
  133.       AutoRedraw      =   -1  'True
  134.       BackColor       =   &H00000000&
  135.       BorderStyle     =   0  'None
  136.       Height          =   1935
  137.       Left            =   60
  138.       ScaleHeight     =   129
  139.       ScaleMode       =   3  'Pixel
  140.       ScaleWidth      =   137
  141.       TabIndex        =   1
  142.       Top             =   60
  143.       Visible         =   0   'False
  144.       Width           =   2055
  145.    End
  146.    Begin VScrollBar VScroll1 
  147.       Height          =   4035
  148.       Left            =   6570
  149.       TabIndex        =   3
  150.       Top             =   0
  151.       Width           =   300
  152.    End
  153.    Begin Menu Menu_File 
  154.       Caption         =   "&File"
  155.       Begin Menu Menu_FileSelection 
  156.          Caption         =   "&Open..."
  157.          Index           =   0
  158.       End
  159.       Begin Menu Menu_FileSelection 
  160.          Caption         =   "&ClipBoard"
  161.          Index           =   1
  162.       End
  163.       Begin Menu Menu_FileSelection 
  164.          Caption         =   "-"
  165.          Index           =   2
  166.       End
  167.       Begin Menu Menu_FileSelection 
  168.          Caption         =   "E&xit"
  169.          Index           =   3
  170.       End
  171.    End
  172.    Begin Menu Menu_Options 
  173.       Caption         =   "&Options"
  174.       Enabled         =   0   'False
  175.       Begin Menu Menu_OptionsSelection 
  176.          Caption         =   "&Scramble"
  177.          Index           =   0
  178.       End
  179.       Begin Menu Menu_OptionsSelection 
  180.          Caption         =   "Sol&ve"
  181.          Index           =   1
  182.       End
  183.       Begin Menu Menu_OptionsSelection 
  184.          Caption         =   "&Animate"
  185.          Index           =   2
  186.       End
  187.       Begin Menu Menu_OptionsSelection 
  188.          Caption         =   "Bring &Pieces to Foreground"
  189.          Index           =   3
  190.       End
  191.       Begin Menu Menu_OptionsSelection 
  192.          Caption         =   "-"
  193.          Index           =   4
  194.       End
  195.       Begin Menu Menu_OptionsSelection 
  196.          Caption         =   "Sho&w Scrambling"
  197.          Index           =   5
  198.       End
  199.       Begin Menu Menu_OptionsSelection 
  200.          Caption         =   "S&cramble on Open"
  201.          Checked         =   -1  'True
  202.          Index           =   6
  203.       End
  204.       Begin Menu Menu_OptionsSelection 
  205.          Caption         =   "-"
  206.          Index           =   7
  207.       End
  208.       Begin Menu Menu_Background 
  209.          Caption         =   "Puzzle &Background"
  210.          Begin Menu Menu_BackgroundSelection 
  211.             Caption         =   "&Black"
  212.             Checked         =   -1  'True
  213.             Index           =   0
  214.          End
  215.          Begin Menu Menu_BackgroundSelection 
  216.             Caption         =   "&White"
  217.             Index           =   1
  218.          End
  219.       End
  220.       Begin Menu Menu_Outline 
  221.          Caption         =   "Piece &Outline"
  222.          Begin Menu Menu_OutlineSelection 
  223.             Caption         =   "&Black"
  224.             Index           =   0
  225.          End
  226.          Begin Menu Menu_OutlineSelection 
  227.             Caption         =   "&White"
  228.             Checked         =   -1  'True
  229.             Index           =   1
  230.          End
  231.       End
  232.    End
  233.    Begin Menu Menu_Pieces 
  234.       Caption         =   "&Pieces"
  235.       Enabled         =   0   'False
  236.       Begin Menu Menu_PiecesSelection 
  237.          Caption         =   "&Rectangles"
  238.          Checked         =   -1  'True
  239.          Index           =   0
  240.       End
  241.       Begin Menu Menu_PiecesSelection 
  242.          Caption         =   "&Circles"
  243.          Index           =   1
  244.       End
  245.       Begin Menu Menu_PiecesSelection 
  246.          Caption         =   "&Elipses"
  247.          Index           =   2
  248.       End
  249.       Begin Menu Menu_PiecesSelection 
  250.          Caption         =   "&Angels && Stars"
  251.          Index           =   3
  252.       End
  253.       Begin Menu Menu_PiecesSelection 
  254.          Caption         =   "C&ircles In Rectangles"
  255.          Index           =   4
  256.       End
  257.    End
  258.    Begin Menu Menu_Hint 
  259.       Caption         =   "&Hint!"
  260.       Enabled         =   0   'False
  261.    End
  262.    Begin Menu Menu_Stop 
  263.       Caption         =   "&Stop!"
  264.    End
  265.    Begin Menu Menu_Help 
  266.       Caption         =   "&Help"
  267.       Begin Menu Menu_HelpSelection 
  268.          Caption         =   "&About..."
  269.          Index           =   0
  270.       End
  271.    End
  272. DefInt A-Z
  273. Declare Function BitBlt Lib "Gdi" (ByVal destHdc, ByVal X, ByVal Y, ByVal w, ByVal h, ByVal srcHdc, ByVal srcX, ByVal srcY, ByVal Rop As Long)
  274. Declare Function CreateRectRgn Lib "Gdi" (ByVal X1, ByVal Y1, ByVal X2, ByVal Y2)
  275. Declare Function SetRectRgn Lib "Gdi" (ByVal hRgn, ByVal X1, ByVal Y1, ByVal X2, ByVal Y2)
  276. Declare Function SelectClipRgn Lib "Gdi" (ByVal hDC, ByVal hRgn)
  277. Declare Function CombineRgn Lib "Gdi" (ByVal hDestRgn, ByVal hSrcRgn1, ByVal hSrcRgn2, ByVal nCombineMode)
  278. Const SRCCOPY = &HCC0020
  279. Const SRCAND = &H8800C6
  280. Const SRCINVERT = &H660046
  281. Const NOTSRCCOPY = &H330008
  282. Const SRCINVERTANDDEST = &H220B24
  283. Const RGN_AND = 1
  284. Const RGN_DIFF = 4
  285. Const NULLREGION = 1
  286. Const MODAL = 1
  287. Const MID_OPEN = 0
  288. Const MID_CLIPBOARD = 1
  289. Const MID_EXIT = 3
  290. Const MID_SCRAMMBLE = 0
  291. Const MID_SOLVE = 1
  292. Const MID_ANIMATE = 2
  293. Const MID_PIECES_TO_FOREGROUND = 3
  294. Const MID_SHOW_SCRAMMBLING = 5
  295. Const MID_SCRAMMBLE_ON_OPEN = 6
  296. Const MID_CIRCLES_AND_OTHERS = 1
  297. Const MID_ELIPSES_AND_OTHERS = 2
  298. Const MID_ANGELS_AND_STARS = 3
  299. Const MID_CIRCLES_IN_SQUARES = 4
  300. Dim TotalPieces  As Integer
  301. Dim PuzzleSize   As Integer
  302. Dim PieceHeight  As Integer
  303. Dim PieceWidth   As Integer
  304. Dim MovingPiece  As Integer
  305. Dim LastMouseX   As Integer
  306. Dim LastMouseY   As Integer
  307. Dim MaskNeeded   As Integer
  308. Dim Solved       As Integer
  309. Dim Region1 As Integer
  310. Dim Region2 As Integer
  311. Dim Region3 As Integer
  312. Dim Region4 As Integer
  313. Dim Piece As PIECEINFO
  314. Dim Pieces() As PIECEINFO
  315. Dim Priority() As Integer
  316. Sub Animate_Puzzle ()
  317.             
  318.     Menu_Hint.Enabled = False
  319.     Menu_File.Enabled = False
  320.     Menu_Options.Enabled = False
  321.     Menu_Pieces.Enabled = False
  322.     Menu_Hint.Enabled = False
  323.     Menu_Stop.Visible = True
  324.     For I = 0 To TotalPieces
  325.         If (Pieces(Priority(0)).X <> Pieces(Priority(0)).HomeX) Or (Pieces(Priority(0)).Y <> Pieces(Priority(0)).HomeY) Then
  326.             XInc = Sgn(Pieces(Priority(0)).X - Pieces(Priority(0)).HomeX) * 14
  327.             YInc = Sgn(Pieces(Priority(0)).Y - Pieces(Priority(0)).HomeY) * 14
  328.             Prepare_To_Move_Piece Pieces(Priority(0)).X, Pieces(Priority(0)).Y
  329.             While (Pieces(Priority(0)).X <> Pieces(Priority(0)).HomeX) Or (Pieces(Priority(0)).Y <> Pieces(Priority(0)).HomeY)
  330.                 If Pieces(Priority(0)).X = Pieces(Priority(0)).HomeX Then XInc = 0
  331.                 If Pieces(Priority(0)).Y = Pieces(Priority(0)).HomeY Then YInc = 0
  332.                 X = Pieces(Priority(0)).X - XInc
  333.                 Y = Pieces(Priority(0)).Y - YInc
  334.                 If Sgn(X - Pieces(Priority(0)).HomeX) <> Sgn(XInc) Then X = Pieces(Priority(0)).HomeX
  335.                 If Sgn(Y - Pieces(Priority(0)).HomeY) <> Sgn(YInc) Then Y = Pieces(Priority(0)).HomeY
  336.                 Move_Piece X, Y
  337.             Wend
  338.             Display_A_Piece (Pic_PuzzleImage.hDC), 0
  339.         End If
  340.         X = DoEvents()
  341.         If Not Menu_Stop.Visible Then Exit For
  342.         Set_Piece_Priority TotalPieces
  343.     Next I
  344.     MovingPiece = False
  345.     Menu_Stop_Click
  346.     Restore_Bitmap
  347. End Sub
  348. Sub Bring_Pieces_To_Foreground ()
  349.             
  350.     For I = TotalPieces To 0 Step -1
  351.         If (Pieces(Priority(I)).X <> Pieces(Priority(I)).HomeX) Or (Pieces(Priority(I)).Y <> Pieces(Priority(I)).HomeY) Then
  352.             Set_Piece_Priority I
  353.             If MaskNeeded Then Get_Mask_And_Image I
  354.             Display_A_Piece (Pic_PuzzleImage.hDC), I
  355.         End If
  356.         R = BitBlt(Pic_Work.hDC, Pieces(Priority(I)).X, Pieces(Priority(I)).Y, PieceWidth, PieceHeight, Pic_PuzzleImage.hDC, Pieces(Priority(I)).X, Pieces(Priority(I)).Y, SRCCOPY)
  357.     Next I
  358. End Sub
  359. Sub Create_Angel_And_Stars_Mask ()
  360.     For Y = 1 To 3
  361.         For X = 1 To 3
  362.             If Y = 2 Then Half = 1 Else Half = 2
  363.             Pic_Mask.Circle (X * PieceWidth, Y * PieceHeight), PieceHeight / Half, , , , 2.5
  364.             Pic_Mask.Circle (X * PieceWidth, Y * PieceHeight), PieceWidth / 2, , , , .2
  365.         Next X
  366.     Next Y
  367.     For X = 1 To 3
  368.         Pic_Mask.FillStyle = 1
  369.         Pic_Mask.Line (X * PieceWidth - PieceWidth / 2, 2 * PieceHeight - PieceHeight / 2)-(X * PieceWidth + PieceWidth / 2, 2 * PieceHeight + PieceHeight / 2), &HFFFFFF, BF
  370.         Pic_Mask.FillStyle = 0
  371.         Pic_Mask.Circle (X * PieceWidth, 2 * PieceHeight), PieceHeight / 2, , , , 4.5
  372.         Pic_Mask.Circle (X * PieceWidth, 2 * PieceHeight), PieceWidth / 2, , , , .1
  373.     Next X
  374. End Sub
  375. Sub Create_Circles_In_Squares_Mask ()
  376. Dim Radius As Single
  377.     If PieceWidth < PieceHeight Then Radius = PieceWidth / 2 - 5 Else Radius = PieceHeight / 2 - 5
  378.     For Y = 0 To PuzzleSize - 1
  379.         For X = 0 To PuzzleSize - 1
  380.             Pic_Mask.Circle (X * PieceWidth + PieceWidth / 2, Y * PieceHeight + PieceHeight / 2), Radius
  381.         Next X
  382.     Next Y
  383. End Sub
  384. Sub Create_Circles_Mask ()
  385. Dim Radius As Single
  386.     If PieceWidth < PieceHeight Then Radius = PieceWidth / 2 - 1 Else Radius = PieceHeight / 2 - 1
  387.     For Y = 1 To PuzzleSize - 1
  388.         For X = 1 To PuzzleSize - 1
  389.             Pic_Mask.Circle (X * PieceWidth, Y * PieceHeight), Radius
  390.         Next X
  391.     Next Y
  392. End Sub
  393. Sub Create_Elipses_Mask ()
  394.     For Y = 1 To 3
  395.         For X = 1 To 3
  396.             If ((X * Y) Mod 2) Or (X * Y) = 4 Then
  397.                 Pic_Mask.Circle (X * PieceWidth, Y * PieceHeight), PieceHeight / 2 - 1, , , , 2.5
  398.             Else
  399.                 Pic_Mask.Circle (X * PieceWidth, Y * PieceHeight), PieceWidth / 2 - 1, , , , .3
  400.             End If
  401.         Next X
  402.     Next Y
  403. End Sub
  404. Sub Display_A_Piece (destHdc, Piece)
  405.     DestX = Pieces(Priority(Piece)).X
  406.     DestY = Pieces(Priority(Piece)).Y
  407.     If MaskNeeded Then
  408.         R = BitBlt(Pic_FinalPiece.hDC, 0, 0, PieceWidth, PieceHeight, Pic_PuzzleImage.hDC, DestX, DestY, SRCCOPY)
  409.         R = BitBlt(Pic_FinalPiece.hDC, 0, 0, PieceWidth, PieceHeight, Pic_PieceMask.hDC, 0, 0, SRCAND)
  410.         R = BitBlt(Pic_FinalPiece.hDC, 0, 0, PieceWidth, PieceHeight, Pic_PieceImage.hDC, 0, 0, SRCINVERT)
  411.         R = BitBlt(destHdc, DestX, DestY, PieceWidth, PieceHeight, Pic_FinalPiece.hDC, 0, 0, SRCCOPY)
  412.     Else
  413.         R = BitBlt(destHdc, DestX, DestY, PieceWidth, PieceHeight, Pic_Bitmap.hDC, Pieces(Priority(Piece)).HomeX, Pieces(Priority(Piece)).HomeY, SRCCOPY)
  414.     End If
  415. End Sub
  416. Sub Form_Load ()
  417.     WindowState = 2
  418.     Region1 = CreateRectRgn(0, 0, 0, 0)
  419.     Region2 = CreateRectRgn(0, 0, 0, 0)
  420.     Region3 = CreateRectRgn(0, 0, 0, 0)
  421.     Region4 = CreateRectRgn(0, 0, 0, 0)
  422.     PuzzleSize = 5
  423.     Menu_Stop.Visible = False
  424. End Sub
  425. Sub Form_Resize ()
  426.     Pic_Work.Move 0, 0
  427.     HScroll1.Move 0, ScaleHeight - HScroll1.Height, ScaleWidth - VScroll1.Width
  428.     VScroll1.Move ScaleWidth - VScroll1.Width, 0, VScroll1.Width, ScaleHeight - HScroll1.Height
  429.     Pic_ScrollBarJoint.Move VScroll1.Left, HScroll1.Top
  430.     Pic_Window.Move 0, 0, VScroll1.Left, HScroll1.Top
  431.     HScroll1.Enabled = Pic_Window.Width < Pic_Bitmap.Width
  432.     VScroll1.Enabled = Pic_Window.Height < Pic_Bitmap.Height
  433.     If VScroll1.Enabled Then
  434.         VScroll1.Value = 0
  435.         VScroll1.Max = Abs(Pic_Window.Height - Pic_Bitmap.Height)
  436.         VScroll1.LargeChange = VScroll1.Max \ 10
  437.     End If
  438.     If HScroll1.Enabled Then
  439.         HScroll1.Value = 0
  440.         HScroll1.Max = Abs(Pic_Window.Width - Pic_Bitmap.Width)
  441.         HScroll1.LargeChange = HScroll1.Max \ 10
  442.     End If
  443. End Sub
  444. Sub Form_Unload (Cancel As Integer)
  445.     End
  446. End Sub
  447. Sub Get_Mask_And_Image (Piece)
  448. Dim MaskROP As Long
  449.     If Priority(Piece) < 16 Then MaskROP = NOTSRCCOPY Else MaskROP = SRCCOPY
  450.     R = BitBlt(Pic_PieceMask.hDC, 0, 0, PieceWidth, PieceHeight, Pic_Mask.hDC, Pieces(Priority(Piece)).HomeX, Pieces(Priority(Piece)).HomeY, MaskROP)
  451.     R = BitBlt(Pic_PieceImage.hDC, 0, 0, PieceWidth, PieceHeight, Pic_Bitmap.hDC, Pieces(Priority(Piece)).HomeX, Pieces(Priority(Piece)).HomeY, SRCCOPY)
  452.     R = BitBlt(Pic_PieceImage.hDC, 0, 0, PieceWidth, PieceHeight, Pic_PieceMask.hDC, 0, 0, SRCINVERTANDDEST)
  453. End Sub
  454. Sub HScroll1_Change ()
  455.   ' Pic_Work.Left is set to the Negative of the value since
  456.   ' as you scroll the Scrollbar to the Right, the display
  457.   ' should move to the Left, showing more of the right
  458.   ' of the display, and vice-versa when scrolling to the
  459.   ' left
  460.   Pic_Work.Left = -HScroll1.Value
  461. End Sub
  462. Sub Menu_BackgroundSelection_Click (Index As Integer)
  463.     Menu_BackgroundSelection(Index).Checked = True
  464.     Menu_BackgroundSelection(Abs(1 - Index)).Checked = False
  465.     Pic_Work.BackColor = Pic_Window.BackColor
  466.     Pic_PuzzleImage.BackColor = Pic_Window.BackColor
  467.     Pic_Window.BackColor = (Not Pic_Work.BackColor) And &HFFFFFF
  468.     Prepare_Bitmap False
  469.     Pic_Window.Refresh
  470. End Sub
  471. Sub Menu_File_Click ()
  472.     Menu_FileSelection(MID_CLIPBOARD).Enabled = ClipBoard.GetFormat(2)
  473. End Sub
  474. Sub Menu_FileSelection_Click (Index As Integer)
  475.     Picture = LoadPicture()
  476.     Select Case Index
  477.         Case MID_OPEN
  478.             OpenFile.Show MODAL
  479.             If OpenFile.Tag = "0" Then Exit Sub
  480.             If OpenFile.File1.ListIndex >= 0 Then Picture = LoadPicture(OpenFile.File1.FileName)
  481.         Case MID_CLIPBOARD
  482.             Picture = ClipBoard.GetData()
  483.         Case MID_EXIT
  484.             Unload JigSaw
  485.     End Select
  486.     If Picture Then
  487.         Menu_Options.Enabled = True
  488.         Menu_Pieces.Enabled = True
  489.         Menu_Hint.Enabled = True
  490.         Pic_Work.Visible = True
  491.         Menu_PiecesSelection(4).Enabled = True
  492.         Screen.MousePointer = 11
  493.         Prepare_Bitmap (Menu_OptionsSelection(MID_SCRAMMBLE_ON_OPEN).Checked)
  494.         If PieceWidth < PieceHeight Then Radius = PieceWidth / 2 - 5 Else Radius = PieceHeight / 2 - 5
  495.         If Radius <= 0 Then Menu_PiecesSelection(4).Enabled = False
  496.         Screen.MousePointer = 0
  497.         Pic_Window.Refresh
  498.     End If
  499. End Sub
  500. Sub Menu_HelpSelection_Click (Index As Integer)
  501.     AboutDlg.Show MODAL
  502. End Sub
  503. Sub Menu_Hint_Click ()
  504.     For I = 1 To 6
  505.         Pic_Work.Line (Pieces(Priority(0)).X, Pieces(Priority(0)).Y)-(Pieces(Priority(0)).X + PieceWidth, Pieces(Priority(0)).Y + PieceHeight), , BF
  506.         Pic_Work.Line (Pieces(Priority(0)).HomeX, Pieces(Priority(0)).HomeY)-(Pieces(Priority(0)).HomeX + PieceWidth, Pieces(Priority(0)).HomeY + PieceHeight), , BF
  507.     Next
  508. End Sub
  509. Sub Menu_OptionsSelection_Click (Index As Integer)
  510.     Pic_Work.MousePointer = 11
  511.     Select Case Index
  512.         
  513.         Case MID_SCRAMMBLE
  514.             Scrammble_Puzzle
  515.         Case MID_SOLVE
  516.             Solve_Puzzle
  517.         Case MID_ANIMATE
  518.             Animate_Puzzle
  519.         
  520.         Case MID_PIECES_TO_FOREGROUND
  521.             Bring_Pieces_To_Foreground
  522.         Case MID_SHOW_SCRAMMBLING, MID_SCRAMMBLE_ON_OPEN
  523.             Menu_OptionsSelection(Index).Checked = Not Menu_OptionsSelection(Index).Checked
  524.     End Select
  525.     Pic_Work.MousePointer = 0
  526. End Sub
  527. Sub Menu_OutlineSelection_Click (Index As Integer)
  528.     Menu_OutlineSelection(Index).Checked = True
  529.     Menu_OutlineSelection(Abs(1 - Index)).Checked = False
  530.     Pic_Bitmap.ForeColor = (-Index) And &HFFFFFF
  531.     Prepare_Bitmap False
  532. End Sub
  533. Sub Menu_PiecesSelection_Click (Index As Integer)
  534.     Menu_PiecesSelection(MaskNeeded).Checked = False
  535.     Menu_PiecesSelection(Index).Checked = True
  536.     MaskNeeded = Index
  537.     If MaskNeeded Then PuzzleSize = 4 Else PuzzleSize = 5
  538.     Prepare_Bitmap True
  539.         
  540. End Sub
  541. Sub Menu_Stop_Click ()
  542.     Menu_File.Enabled = True
  543.     Menu_Options.Enabled = True
  544.     Menu_Pieces.Enabled = True
  545.     Menu_Hint.Enabled = True
  546.     Menu_Stop.Visible = False
  547. End Sub
  548. Sub Move_Piece (X, Y)
  549.         
  550.     LastX = Pieces(Priority(0)).X
  551.     LastY = Pieces(Priority(0)).Y
  552.     Pieces(Priority(0)).X = Pieces(Priority(0)).X + (X - LastMouseX)
  553.     Pieces(Priority(0)).Y = Pieces(Priority(0)).Y + (Y - LastMouseY)
  554.     Display_A_Piece (Pic_Work.hDC), 0
  555.     R = SetRectRgn(Region1, LastX, LastY, LastX + PieceWidth, LastY + PieceHeight)
  556.     R = SetRectRgn(Region2, Pieces(Priority(0)).X, Pieces(Priority(0)).Y, Pieces(Priority(0)).X + PieceWidth, Pieces(Priority(0)).Y + PieceHeight)
  557.     R = CombineRgn(Region3, Region1, Region2, RGN_DIFF)
  558.     R = SelectClipRgn(Pic_Work.hDC, Region3)
  559.     R = BitBlt(Pic_Work.hDC, LastX, LastY, PieceWidth, PieceHeight, Pic_PuzzleImage.hDC, LastX, LastY, SRCCOPY)
  560.     R = SelectClipRgn(Pic_Work.hDC, 0)
  561.     LastMouseX = X
  562.     LastMouseY = Y
  563. End Sub
  564. Sub Outline_Circles_In_Squares ()
  565. Dim Radius As Single
  566.     If PieceWidth < PieceHeight Then Radius = PieceWidth / 2 - 5 Else Radius = PieceHeight / 2 - 5
  567.     For Y = 0 To PuzzleSize - 1
  568.         For X = 0 To PuzzleSize - 1
  569.             Pic_Bitmap.Line (X * PieceWidth, Y * PieceHeight)-(X * PieceWidth + PieceWidth - 1, Y * PieceHeight + PieceHeight - 1), , B
  570.             If MaskNeeded <> MID_CIRCELS_IN_SQUARES Then
  571.                 Pic_Bitmap.Circle (X * PieceWidth + PieceWidth / 2, Y * PieceHeight + PieceHeight / 2), Radius
  572.                 Pic_Bitmap.Circle (X * PieceWidth + PieceWidth / 2, Y * PieceHeight + PieceHeight / 2), Radius + 1
  573.             End If
  574.         Next X
  575.     Next Y
  576. End Sub
  577. Sub Pic_Window_Paint ()
  578.     If Pic_Work.Visible Then Pic_Window.Line (0, 0)-(Pic_Work.Left + Pic_Work.Width + 2, Pic_Work.Top + Pic_Work.Height + 2), (Not Pic_Window.BackColor) And &HFFFFFF, B
  579. End Sub
  580. Sub Pic_Work_MouseDown (Button As Integer, Shift As Integer, X As Single, Y As Single)
  581.     If (Button = 1) And (Not Menu_Stop.Visible) Then
  582.         If Solved Then
  583.             Solved = False
  584.             Pic_PuzzleImage.Picture = Pic_Bitmap.Image
  585.             Pic_Work_Paint
  586.         End If
  587.         For I = 0 To TotalPieces
  588.             Piece = Pieces(Priority(I))
  589.             If (X >= Piece.X) And (X <= Piece.X + PieceWidth - 1) Then
  590.                 If (Y >= Piece.Y) And (Y <= Piece.Y + PieceHeight - 1) Then
  591.                     If Pic_Mask.Point(Piece.HomeX + (X - Piece.X), Piece.HomeY + (Y - Piece.Y)) = (Priority(I) < (PuzzleSize ^ 2) And &HFFFFFF) Then
  592.                         Set_Piece_Priority I
  593.                         Prepare_To_Move_Piece X + 0, Y + 0
  594.                         Pic_Work.MousePointer = 5
  595.                         Exit For
  596.                     End If
  597.                 End If
  598.             End If
  599.         Next I
  600.     ElseIf (Button = 2) And Solved Then
  601.         Pic_PuzzleImage.Picture = Pic_Bitmap.Image
  602.         Pic_Work_Paint
  603.     End If
  604. End Sub
  605. Sub Pic_Work_MouseMove (Button As Integer, Shift As Integer, X As Single, Y As Single)
  606.     If MovingPiece And (Not Menu_Stop.Visible) Then Move_Piece X + 0, Y + 0
  607. End Sub
  608. Sub Pic_Work_MouseUp (Button As Integer, Shift As Integer, X As Single, Y As Single)
  609.     If MovingPiece And (Not Menu_Stop.Visible) Then
  610.         
  611.         If CombineRgn(Region3, Region4, Region2, RGN_AND) <> NULLREGION Then
  612.             R = BitBlt(Pic_Work.hDC, Pieces(Priority(0)).X, Pieces(Priority(0)).Y, PieceWidth, PieceHeight, Pic_PuzzleImage.hDC, Pieces(Priority(0)).X, Pieces(Priority(0)).Y, SRCCOPY)
  613.             Pieces(Priority(0)).X = Pieces(Priority(I)).HomeX
  614.             Pieces(Priority(0)).Y = Pieces(Priority(I)).HomeY
  615.             Display_A_Piece (Pic_Work.hDC), 0
  616.             Beep
  617.         End If
  618.         Display_A_Piece (Pic_PuzzleImage.hDC), 0
  619.         For I = 0 To TotalPieces
  620.             If (Pieces(I).X <> Pieces(I).HomeX) Or (Pieces(I).Y <> Pieces(I).HomeY) Then Exit For
  621.         Next
  622.         If I > TotalPieces Then
  623.             Restore_Bitmap
  624.             MsgBox "You have solved the puzzle", 16, "VB JigSaw"
  625.         End If
  626.         Menu_Hint.Enabled = (Pieces(Priority(0)).X <> Pieces(Priority(0)).HomeX) Or (Pieces(Priority(0)).Y <> Pieces(Priority(0)).HomeY)
  627.         
  628.     End If
  629.     MovingPiece = False
  630.     Pic_Work.MousePointer = 0
  631. End Sub
  632. Sub Pic_Work_Paint ()
  633.     R = BitBlt(Pic_Work.hDC, 0, 0, Pic_Bitmap.Width, Pic_Bitmap.Height, Pic_PuzzleImage.hDC, 0, 0, SRCCOPY)
  634. End Sub
  635. Sub Prepare_Bitmap (Scrammble)
  636.             
  637.     Pic_Bitmap.Picture = Picture
  638.     Pic_Bitmap.Picture = Pic_Bitmap.Image
  639.     PieceWidth = Pic_Bitmap.Width / PuzzleSize
  640.     PieceHeight = Pic_Bitmap.Height / PuzzleSize
  641.     Pic_PuzzleImage.Cls
  642.     Pic_PuzzleImage.Move 0, 0, Pic_Bitmap.Width, Pic_Bitmap.Height
  643.     Pic_Work.Move 0, 0, Pic_Bitmap.Width, Pic_Bitmap.Height
  644.     Pic_Mask.Move 0, 0, Pic_Bitmap.Width, Pic_Bitmap.Height
  645.     Pic_Mask.Cls
  646.     Form_Resize
  647.     Randomize Timer
  648.     TotalPieces = 24
  649.     If MaskNeeded Then
  650.         
  651.         Pic_PieceImage.Move 0, 0, PieceWidth, PieceHeight
  652.         Pic_PieceMask.Move 0, 0, PieceWidth, PieceHeight
  653.         Pic_FinalPiece.Move 0, 0, PieceWidth, PieceHeight
  654.         
  655.         Select Case MaskNeeded
  656.             
  657.             Case MID_CIRCLES_AND_OTHERS
  658.                 Create_Circles_Mask
  659.             Case MID_ELIPSES_AND_OTHERS
  660.                 Create_Elipses_Mask
  661.             Case MID_ANGELS_AND_STARS
  662.                 Create_Angel_And_Stars_Mask
  663.             Case MID_CIRCLES_IN_SQUARES
  664.                 TotalPieces = 31
  665.                 Create_Circles_In_Squares_Mask
  666.         End Select
  667.     End If
  668.     ReDim Pieces(TotalPieces) As PIECEINFO
  669.     ReDim Priority(TotalPieces) As Integer
  670.     If (MaskNeeded > 0) And (MaskNeeded <> MID_CIRCLES_IN_SQUARES) Then
  671.         For Y = 0 To PuzzleSize - 2
  672.             For X = 0 To PuzzleSize - 2
  673.                 I = TotalPieces - (Y * (PuzzleSize - 1) + X)
  674.                 Pieces(I).HomeX = X * PieceWidth + PieceWidth / 2
  675.                 Pieces(I).HomeY = Y * PieceHeight + PieceHeight / 2
  676.                 Pieces(I).X = Pieces(I).HomeX
  677.                 Pieces(I).Y = Pieces(I).HomeY
  678.                 Priority(I) = I
  679.             Next X
  680.         Next Y
  681.     End If
  682.     For Y = 0 To PuzzleSize - 1
  683.         For X = 0 To PuzzleSize - 1
  684.             I = (PuzzleSize ^ 2 - 1) - (Y * PuzzleSize + X)
  685.             For Z = 0 To Abs(MaskNeeded = MID_CIRCLES_IN_SQUARES)
  686.                 Pieces(I + Z * 16).HomeX = X * PieceWidth
  687.                 Pieces(I + Z * 16).HomeY = Y * PieceHeight
  688.                 Pieces(I + Z * 16).X = Pieces(I).HomeX
  689.                 Pieces(I + Z * 16).Y = Pieces(I).HomeY
  690.                 Priority(I + Z * 16) = I + Z * 16
  691.             Next Z
  692.         Next X
  693.     Next Y
  694.     Select Case MaskNeeded
  695.         Case 0, 4
  696.             Outline_Circles_In_Squares
  697.         Case 1
  698.         Case 2
  699.         Case 3
  700.     End Select
  701.     If Scrammble Then
  702.         Scrammble_Puzzle
  703.     Else
  704.         Solved = True
  705.         R = BitBlt(Pic_PuzzleImage.hDC, 0, 0, Pic_Bitmap.Width, Pic_Bitmap.Height, Pic_Bitmap.hDC, 0, 0, SRCCOPY)
  706.         Pic_Work.Refresh
  707.     End If
  708. End Sub
  709. Sub Prepare_To_Move_Piece (X, Y)
  710.     Piece = Pieces(Priority(0))
  711.     If MaskNeeded Then Get_Mask_And_Image 0
  712.     Display_A_Piece (Pic_Work.hDC), 0
  713.                     
  714.     R = SetRectRgn(Region2, Piece.X, Piece.Y, Piece.X + PieceWidth, Piece.Y + PieceHeight)
  715.     R = SelectClipRgn(Pic_PuzzleImage.hDC, Region2)
  716.     Pic_PuzzleImage.Line (Piece.X, Piece.Y)-(Piece.X + PieceWidth, Piece.Y + PieceHeight), Pic_PuzzleImage.BackColor, BF
  717.     For N = TotalPieces To 1 Step -1
  718.         R = SetRectRgn(Region1, Pieces(Priority(N)).X, Pieces(Priority(N)).Y, Pieces(Priority(N)).X + PieceWidth, Pieces(Priority(N)).Y + PieceHeight)
  719.         If CombineRgn(Region3, Region2, Region1, RGN_AND) <> NULLREGION Then
  720.             If MaskNeeded Then
  721.                 Get_Mask_And_Image N
  722.                 R = BitBlt(Pic_PuzzleImage.hDC, Pieces(Priority(N)).X, Pieces(Priority(N)).Y, PieceWidth, PieceHeight, Pic_PieceMask.hDC, 0, 0, SRCAND)
  723.                 R = BitBlt(Pic_PuzzleImage.hDC, Pieces(Priority(N)).X, Pieces(Priority(N)).Y, PieceWidth, PieceHeight, Pic_PieceImage.hDC, 0, 0, SRCINVERT)
  724.             Else
  725.                 Display_A_Piece (Pic_PuzzleImage.hDC), N
  726.             End If
  727.         End If
  728.     Next N
  729.     R = SelectClipRgn(Pic_PuzzleImage.hDC, 0)
  730.     If MaskNeeded Then Get_Mask_And_Image 0
  731.     X1 = Piece.HomeX + 3 * (PieceWidth \ 8)
  732.     Y1 = Piece.HomeY + 3 * (PieceHeight \ 8)
  733.     X2 = X1 + PieceWidth \ 4
  734.     Y2 = Y1 + PieceHeight \ 4
  735.     R = SetRectRgn(Region4, X1, Y1, X2, Y2)
  736.     LastMouseX = X
  737.     LastMouseY = Y
  738.     MovingPiece = True
  739. End Sub
  740. Sub Restore_Bitmap ()
  741.     Solved = True
  742.     AutoRedraw = True
  743.     Pic_PuzzleImage.Picture = Image
  744.     AutoRedraw = False
  745.     Pic_Work_Paint
  746. End Sub
  747. Sub Scrammble_Puzzle ()
  748.             
  749.     Solved = False
  750.     Pic_Work.Cls
  751.     Pic_PuzzleImage.Picture = LoadPicture()
  752.     Randomize Timer
  753.     For I = TotalPieces To 0 Step -1
  754.         Pieces(Priority(I)).X = Int(Rnd * (Pic_Work.Width - PieceWidth) + 1)
  755.         Pieces(Priority(I)).Y = Int(Rnd * (Pic_Work.Height - PieceHeight) + 1)
  756.         If MaskNeeded Then
  757.             Get_Mask_And_Image I
  758.             R = BitBlt(Pic_PuzzleImage.hDC, Pieces(Priority(I)).X, Pieces(Priority(I)).Y, PieceWidth, PieceHeight, Pic_PieceMask.hDC, 0, 0, SRCAND)
  759.             R = BitBlt(Pic_PuzzleImage.hDC, Pieces(Priority(I)).X, Pieces(Priority(I)).Y, PieceWidth, PieceHeight, Pic_PieceImage.hDC, 0, 0, SRCINVERT)
  760.         Else
  761.             Display_A_Piece (Pic_PuzzleImage.hDC), I
  762.         End If
  763.         If Menu_OptionsSelection(MID_SHOW_SCRAMMBLING).Checked Then R = BitBlt(Pic_Work.hDC, Pieces(Priority(I)).X, Pieces(Priority(I)).Y, PieceWidth, PieceHeight, Pic_PuzzleImage.hDC, Pieces(Priority(I)).X, Pieces(Priority(I)).Y, SRCCOPY)
  764.     Next I
  765.     If Not Menu_OptionsSelection(MID_SHOW_SCRAMMBLING).Checked Then Pic_Work.Refresh
  766. End Sub
  767. Sub Set_Piece_Priority (Piece As Integer)
  768.     Temp = Priority(Piece)
  769.     For I = Piece To 1 Step -1
  770.         Priority(I) = Priority(I - 1)
  771.     Next
  772.     Priority(0) = Temp
  773. End Sub
  774. Sub Solve_Puzzle ()
  775.     Menu_Hint.Enabled = False
  776.     For I = 0 To TotalPieces
  777.         Priority(I) = I
  778.         Pieces(I).X = Pieces(I).HomeX
  779.         Pieces(I).Y = Pieces(I).HomeY
  780.     Next I
  781.     Restore_Bitmap
  782. End Sub
  783. Sub VScroll1_Change ()
  784.   ' Pic_Work.Top is set to the Negative of the value since
  785.   ' as you scroll the Scrollbar down, the display
  786.   ' should move up, showing more of the the bottom
  787.   ' of the display, and vice-versa when scrolling up
  788.   Pic_Work.Top = -VScroll1.Value
  789. End Sub
  790.