home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Source Code / Visual Basic Source Code.iso / vbsource / jigsaw / jigsaw.frm (.txt) < prev    next >
Encoding:
Visual Basic Form  |  1995-05-08  |  30.2 KB  |  791 lines

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