'  Advanced Techniques for Rapid-Q by William Yu 
'          -- How to create your own custom look-&-feel forms! 
' 
' What makes this so complicated is because you have to write your own 
' resize handlers!  Since we're using a borderless form, we can pretty much 
' make it look like anything we want.  Instead of the traditional title on 
' the top of the form, you can have it on the bottom, the left, or right! 

$INCLUDE "RAPIDQ.INC"
$TYPECHECK ON
$APPTYPE GUI

$RESOURCE BMP_CLOSE AS "CLOSE.BMP"
$RESOURCE BMP_MIN   AS "MIN.BMP"
$RESOURCE BMP_MAX   AS "MAX.BMP"
$RESOURCE BMP_HELP  AS "HELP.BMP"
'$RESOURCE BMP_IMAGE AS "C:\WINDOWS\CLOUDS.BMP" 

DIM MainForm AS QForm
DIM PanelR AS QPanel, PanelL AS QPanel, PanelD AS QPanel, PanelU AS QPanel
DIM PanelDL AS QPanel, PanelDDL AS QPanel
DIM PanelDR AS QPanel, PanelDDR AS QPanel
DIM PanelUL AS QPanel, PanelUUL AS QPanel
DIM PanelUR AS QPanel, PanelUUR AS QPanel
DIM MainPanel AS QPanel
DIM TitlePanel AS QPanel
DIM Image AS QImage
DIM Font AS QFont
    Font.Name = "Arial"
    Font.Size = 10
    Font.Color = &HFFFFFF
DIM CloseButton AS QButton, MinButton AS QCoolBtn
DIM MaxButton AS QCoolBtn, HelpButton AS QCoolBtn
DIM DownX AS INTEGER, DownY AS INTEGER
DIM PLMouse AS INTEGER, PRMouse AS INTEGER
DIM PUMouse AS INTEGER, PDMouse AS INTEGER
DIM PULMouse AS INTEGER, PUULMouse AS INTEGER
DIM PURMouse AS INTEGER, PUURMouse AS INTEGER
DIM PDLMouse AS INTEGER, PDDLMouse AS INTEGER
DIM PDRMouse AS INTEGER, PDDRMouse AS INTEGER
DIM TitleMouse AS INTEGER, FormX AS INTEGER, FormY AS INTEGER
DIM FilePopup AS QPopupMenu
DIM FileButton AS QCoolBtn
DIM NewItem AS QMenuItem, OpenItem AS QMenuItem
DIM Break1 AS QMenuItem, ExitItem AS QMenuItem
DIM RichEdit AS QRichEdit

SUB ResizeMainForm
  IF MainForm.ClientWidth < 22 THEN
    MainForm.ClientWidth = 22
  END IF
  IF MainForm.ClientHeight < 22 THEN
    MainForm.ClientHeight = 22
  END IF

  PanelR.Left = MainForm.ClientWidth-3
  PanelR.Height = MainForm.ClientHeight - 40
  PanelL.Height = MainForm.ClientHeight - 40
  PanelU.Width = MainForm.ClientWidth - 40
  PanelD.Top = MainForm.ClientHeight-3
  PanelD.Width = MainForm.ClientWidth - 40

  PanelDL.Top = MainForm.ClientHeight-20
  PanelDDL.Top = MainForm.ClientHeight-3

  PanelDR.Left = MainForm.ClientWidth-3
  PanelDR.Top = MainForm.ClientHeight-20
  PanelDDR.Left = MainForm.ClientWidth-20
  PanelDDR.Top = MainForm.ClientHeight-3

  PanelUR.Left = MainForm.ClientWidth-3
  PanelUUR.Left = MainForm.ClientWidth-20

  HelpButton.Left = MainForm.ClientWidth - 20

  TitlePanel.Width = MainForm.ClientWidth - 75

  MainPanel.Width = MainForm.ClientWidth - 6
  MainPanel.Height = 30'MainForm.ClientHeight - 23 

'  Image.Width = MainForm.ClientWidth - 6 
'  Image.Height = MainForm.ClientHeight - 50 

  RichEdit.Width = MainForm.ClientWidth - 8
  RichEdit.Height = MainForm.ClientHeight - 55
END SUB

SUB PLMouseDown (BTN AS INTEGER, X AS INTEGER, Y AS INTEGER)
  PLMouse = TRUE
  DownX = X
  DownY = Y
END SUB
SUB PLMouseMove (X AS INTEGER, Y AS INTEGER)
  IF PLMouse THEN
     IF MainForm.ClientWidth > 22 THEN
       MainForm.Left = MainForm.Left+(X - DownX)
     END IF
     MainForm.Width = MainForm.Width+(DownX - X)
     ResizeMainForm
  END IF
END SUB
SUB PLMouseUp (BTN AS INTEGER, X AS INTEGER, Y AS INTEGER)
  PLMouse = FALSE
END SUB

SUB PRMouseDown (BTN AS INTEGER, X AS INTEGER, Y AS INTEGER)
  PRMouse = TRUE
  DownX = X
  DownY = Y
END SUB
SUB PRMouseMove (X AS INTEGER, Y AS INTEGER)
  IF PRMouse THEN
     MainForm.Width = MainForm.Width+(X - DownX)
     ResizeMainForm
  END IF
END SUB
SUB PRMouseUp (BTN AS INTEGER, X AS INTEGER, Y AS INTEGER)
  PRMouse = FALSE
END SUB

SUB PUMouseDown (BTN AS INTEGER, X AS INTEGER, Y AS INTEGER)
  PUMouse = TRUE
  DownX = X
  DownY = Y
END SUB
SUB PUMouseMove (X AS INTEGER, Y AS INTEGER)
  IF PUMouse THEN
     IF MainForm.ClientHeight > 22 THEN
       MainForm.Top = MainForm.Top+(Y - DownY)
     END IF
     MainForm.Height = MainForm.Height+(DownY - Y)
     ResizeMainForm
  END IF
END SUB
SUB PUMouseUp (BTN AS INTEGER, X AS INTEGER, Y AS INTEGER)
  PUMouse = FALSE
END SUB

SUB PDMouseDown (BTN AS INTEGER, X AS INTEGER, Y AS INTEGER)
  PDMouse = TRUE
  DownX = X
  DownY = Y
END SUB
SUB PDMouseMove (X AS INTEGER, Y AS INTEGER)
  IF PDMouse THEN
     MainForm.Height = MainForm.Height+(Y - DownY)
     ResizeMainForm
  END IF
END SUB
SUB PDMouseUp (BTN AS INTEGER, X AS INTEGER, Y AS INTEGER)
  PDMouse = FALSE
END SUB

SUB PULMouseDown (BTN AS INTEGER, X AS INTEGER, Y AS INTEGER)
  PULMouse = TRUE
  DownX = X
  DownY = Y
END SUB
SUB PULMouseMove (X AS INTEGER, Y AS INTEGER)
  IF PULMouse THEN
     MainForm.Top = MainForm.Top+(Y - DownY)
     MainForm.Height = MainForm.Height+(DownY - Y)
     MainForm.Left = MainForm.Left+(X - DownX)
     MainForm.Width = MainForm.Width+(DownX - X)
     ResizeMainForm
  END IF
END SUB
SUB PULMouseUp (BTN AS INTEGER, X AS INTEGER, Y AS INTEGER)
  PULMouse = FALSE
END SUB
SUB PUULMouseDown (BTN AS INTEGER, X AS INTEGER, Y AS INTEGER)
  PUULMouse = TRUE
  DownX = X
  DownY = Y
END SUB
SUB PUULMouseMove (X AS INTEGER, Y AS INTEGER)
  IF PUULMouse THEN
     MainForm.Top = MainForm.Top+(Y - DownY)
     MainForm.Height = MainForm.Height+(DownY - Y)
     MainForm.Left = MainForm.Left+(X - DownX)
     MainForm.Width = MainForm.Width+(DownX - X)
     ResizeMainForm
  END IF
END SUB
SUB PUULMouseUp (BTN AS INTEGER, X AS INTEGER, Y AS INTEGER)
  PUULMouse = FALSE
END SUB

SUB PURMouseDown (BTN AS INTEGER, X AS INTEGER, Y AS INTEGER)
  PURMouse = TRUE
  DownX = X
  DownY = Y
END SUB
SUB PURMouseMove (X AS INTEGER, Y AS INTEGER)
  IF PURMouse THEN
     MainForm.Top = MainForm.Top+(Y - DownY)
     MainForm.Height = MainForm.Height+(DownY - Y)
     MainForm.Width = MainForm.Width+(X - DownX)
     ResizeMainForm
  END IF
END SUB
SUB PURMouseUp (BTN AS INTEGER, X AS INTEGER, Y AS INTEGER)
  PURMouse = FALSE
END SUB
SUB PUURMouseDown (BTN AS INTEGER, X AS INTEGER, Y AS INTEGER)
  PUURMouse = TRUE
  DownX = X
  DownY = Y
END SUB
SUB PUURMouseMove (X AS INTEGER, Y AS INTEGER)
  IF PUURMouse THEN
     MainForm.Top = MainForm.Top+(Y - DownY)
     MainForm.Height = MainForm.Height+(DownY - Y)
     MainForm.Width = MainForm.Width+(X - DownX)
     ResizeMainForm
  END IF
END SUB
SUB PUURMouseUp (BTN AS INTEGER, X AS INTEGER, Y AS INTEGER)
  PUURMouse = FALSE
END SUB

SUB PDLMouseDown (BTN AS INTEGER, X AS INTEGER, Y AS INTEGER)
  PDLMouse = TRUE
  DownX = X
  DownY = Y
END SUB
SUB PDLMouseMove (X AS INTEGER, Y AS INTEGER)
  IF PDLMouse THEN
     MainForm.Left = MainForm.Left+(X - DownX)
     MainForm.Width = MainForm.Width+(DownX - X)
     MainForm.Height = MainForm.Height+(Y - DownY)
     ResizeMainForm
  END IF
END SUB
SUB PDLMouseUp (BTN AS INTEGER, X AS INTEGER, Y AS INTEGER)
  PDLMouse = FALSE
END SUB
SUB PDDLMouseDown (BTN AS INTEGER, X AS INTEGER, Y AS INTEGER)
  PDDLMouse = TRUE
  DownX = X
  DownY = Y
END SUB
SUB PDDLMouseMove (X AS INTEGER, Y AS INTEGER)
  IF PDDLMouse THEN
     MainForm.Left = MainForm.Left+(X - DownX)
     MainForm.Width = MainForm.Width+(DownX - X)
     MainForm.Height = MainForm.Height+(Y - DownY)
     ResizeMainForm
  END IF
END SUB
SUB PDDLMouseUp (BTN AS INTEGER, X AS INTEGER, Y AS INTEGER)
  PDDLMouse = FALSE
END SUB

SUB PDRMouseDown (BTN AS INTEGER, X AS INTEGER, Y AS INTEGER)
  PDRMouse = TRUE
  DownX = X
  DownY = Y
END SUB
SUB PDRMouseMove (X AS INTEGER, Y AS INTEGER)
  IF PDRMouse THEN
     MainForm.Height = MainForm.Height+(Y - DownY)
     MainForm.Width = MainForm.Width+(X - DownX)
     ResizeMainForm
  END IF
END SUB
SUB PDRMouseUp (BTN AS INTEGER, X AS INTEGER, Y AS INTEGER)
  PDRMouse = FALSE
END SUB
SUB PDDRMouseDown (BTN AS INTEGER, X AS INTEGER, Y AS INTEGER)
  PDDRMouse = TRUE
  DownX = X
  DownY = Y
END SUB
SUB PDDRMouseMove (X AS INTEGER, Y AS INTEGER)
  IF PDDRMouse THEN
     MainForm.Height = MainForm.Height+(Y - DownY)
     MainForm.Width = MainForm.Width+(X - DownX)
     ResizeMainForm
  END IF
END SUB
SUB PDDRMouseUp (BTN AS INTEGER, X AS INTEGER, Y AS INTEGER)
  PDDRMouse = FALSE
END SUB

SUB TitleMouseDown (BTN AS INTEGER, X AS INTEGER, Y AS INTEGER)
  TitleMouse = TRUE
  DownX = X
  DownY = Y
  FormX = MainForm.Left
  FormY = MainForm.Top
END SUB
SUB TitleMouseMove (X AS INTEGER, Y AS INTEGER)
  IF TitleMouse = TRUE AND MainForm.WindowState = wsNormal THEN
     MainForm.Left = FormX + (X - DownX)
     MainForm.Top = FormY + (Y - DownY)
     FormX = MainForm.Left
     FormY = MainForm.Top
  END IF
END SUB
SUB TitleMouseUp (BTN AS INTEGER, X AS INTEGER, Y AS INTEGER)
  TitleMouse = FALSE
END SUB

SUB MinButtonClick
  MainForm.WindowState = wsMinimized
END SUB

SUB MaxButtonClick
  IF MaxButton.Down = False THEN
    MainForm.WindowState = wsNormal
    ResizeMainForm
  ELSE
    MainForm.WindowState = wsMaximized
    ResizeMainForm
  END IF
END SUB

SUB HelpButtonClick
  ShowMessage "Beware the power of Rapid-Q"
END SUB

SUB FileClick
  FilePopup.Popup(MainForm.Left + 30, MainForm.Top + 50)
END SUB

SUB NewClick
  RichEdit.Clear
END SUB

SUB OpenClick
  DIM OpenDialog AS QOpenDialog

  IF OpenDialog.Execute THEN
     RichEdit.LoadFromFile(OpenDialog.FileName)
  END IF
END SUB

SUB ExitClick
  MainForm.Close
END SUB

MainForm.BorderStyle = bsNone
MainForm.Center
'MainForm.OnResize = ResizeMainForm 

PanelR.Parent = MainForm
  PanelR.Top = 20
  PanelR.Width = 3
  PanelR.OnMouseDown = PRMouseDown
  PanelR.OnMouseMove = PRMouseMove
  PanelR.OnMouseUp = PRMouseUp
PanelR.Cursor = crSizeWE
PanelL.Parent = MainForm
  PanelL.Left = 0
  PanelL.Top = 20
  PanelL.Width = 3
  PanelL.OnMouseDown = PLMouseDown
  PanelL.OnMouseMove = PLMouseMove
  PanelL.OnMouseUp = PLMouseUp
PanelL.Cursor = crSizeWE
PanelU.Parent = MainForm
  PanelU.Left = 20
  PanelU.Top = 0
  PanelU.Height = 3
  PanelU.OnMouseDown = PUMouseDown
  PanelU.OnMouseMove = PUMouseMove
  PanelU.OnMouseUp = PUMouseUp
PanelU.Cursor = crSizeNS
PanelD.Parent = MainForm
  PanelD.Left = 20
  PanelD.Height = 3
  PanelD.OnMouseDown = PDMouseDown
  PanelD.OnMouseMove = PDMouseMove
  PanelD.OnMouseUp = PDMouseUp
PanelD.Cursor = crSizeNS

PanelUL.Parent = MainForm
  PanelUL.Left = 0
  PanelUL.Top = 0
  PanelUL.Width = 3
  PanelUL.Height = 20
  PanelUL.OnMouseDown = PULMouseDown
  PanelUL.OnMouseMove = PULMouseMove
  PanelUL.OnMouseUp = PULMouseUp
PanelUL.Cursor = crSizeNWSE
PanelUUL.Parent = MainForm
  PanelUUL.Left = 0
  PanelUUL.Top = 0
  PanelUUL.Width = 20
  PanelUUL.Height = 3
  PanelUUL.OnMouseDown = PUULMouseDown
  PanelUUL.OnMouseMove = PUULMouseMove
  PanelUUL.OnMouseUp = PUULMouseUp
PanelUUL.Cursor = crSizeNWSE

PanelUR.Parent = MainForm
  PanelUR.Top = 0
  PanelUR.Width = 3
  PanelUR.Height = 20
  PanelUR.OnMouseDown = PURMouseDown
  PanelUR.OnMouseMove = PURMouseMove
  PanelUR.OnMouseUp = PURMouseUp
PanelUR.Cursor = crSizeNESW
PanelUUR.Parent = MainForm
  PanelUUR.Top = 0
  PanelUUR.Width = 20
  PanelUUR.Height = 3
  PanelUUR.OnMouseDown = PUURMouseDown
  PanelUUR.OnMouseMove = PUURMouseMove
  PanelUUR.OnMouseUp = PUURMouseUp
PanelUUR.Cursor = crSizeNESW

PanelDL.Parent = MainForm
  PanelDL.Left = 0
  PanelDL.Width = 3
  PanelDL.Height = 20
  PanelDL.OnMouseDown = PDLMouseDown
  PanelDL.OnMouseMove = PDLMouseMove
  PanelDL.OnMouseUp = PDLMouseUp
PanelDL.Cursor = crSizeNESW
PanelDDL.Parent = MainForm
  PanelDDL.Left = 0
  PanelDDL.Width = 20
  PanelDDL.Height = 3
  PanelDDL.OnMouseDown = PDDLMouseDown
  PanelDDL.OnMouseMove = PDDLMouseMove
  PanelDDL.OnMouseUp = PDDLMouseUp
PanelDDL.Cursor = crSizeNESW

PanelDR.Parent = MainForm
  PanelDR.Width = 3
  PanelDR.Height = 20
  PanelDR.OnMouseDown = PDRMouseDown
  PanelDR.OnMouseMove = PDRMouseMove
  PanelDR.OnMouseUp = PDRMouseUp
PanelDR.Cursor = crSizeNWSE
PanelDDR.Parent = MainForm
  PanelDDR.Width = 20
  PanelDDR.Height = 3
  PanelDDR.OnMouseDown = PDDRMouseDown
  PanelDDR.OnMouseMove = PDDRMouseMove
  PanelDDR.OnMouseUp = PDDRMouseUp
PanelDDR.Cursor = crSizeNWSE

TitlePanel.Parent = MainForm
TitlePanel.Alignment = taLeftJustify
TitlePanel.Left = 54
TitlePanel.Top = 3
TitlePanel.Height = 17
TitlePanel.Color = &HDD7777
TitlePanel.Font = Font
TitlePanel.Caption = " Custom Forms in Rapid-Q"
TitlePanel.OnMouseDown = TitleMouseDown
TitlePanel.OnMouseMove = TitleMouseMove
TitlePanel.OnMouseUp = TitleMouseUp

CloseButton.Parent = MainForm
CloseButton.Top = 3
CloseButton.Width = 17
CloseButton.Height = 17
CloseButton.Left = 3
CloseButton.BMPHandle = BMP_Close
CloseButton.ModalResult = mrCANCEL

MinButton.Parent = MainForm
MinButton.Top = 3
MinButton.Width = 17
MinButton.Height = 17
MinButton.Left = 20
MinButton.BMPHandle = BMP_Min
MinButton.OnClick = MinButtonClick

MaxButton.Parent = MainForm
MaxButton.Top = 3
MaxButton.Width = 17
MaxButton.Height = 17
MaxButton.Left = 37
MaxButton.GroupIndex = 1
MaxButton.Down = False
MaxButton.AllowAllUp = True
MaxButton.BMPHandle = BMP_Max
MaxButton.OnClick = MaxButtonClick

HelpButton.Parent = MainForm
HelpButton.Top = 3
HelpButton.Width = 17
HelpButton.Height = 17
HelpButton.BMPHandle = BMP_Help
HelpButton.OnClick = HelpButtonClick

MainPanel.Parent = MainForm
MainPanel.Left = 3
MainPanel.Top = 21

'Image.Parent = MainForm 
'Image.BMPHandle = BMP_IMAGE 
'Image.Top = 50 
'Image.Left = 3 

RichEdit.Parent = MainForm
RichEdit.Top = 51
RichEdit.Left = 3
RichEdit.PlainText = True
RichEdit.ScrollBars = ssBoth
RichEdit.WordWrap = False

FileButton.Parent = MainPanel
FileButton.Caption = "&File"
FileButton.Left = 5
FileButton.Top = 5
FileButton.Width = 50
FileButton.Height = 20
FileButton.Flat = True
FIleButton.OnClick = FileClick

NewItem.Caption = "&New"
NewItem.OnClick = NewClick

OpenItem.Caption = "&Open"
OpenItem.OnClick = OpenClick

Break1.Caption = "-"
ExitItem.Caption = "E&xit"
ExitItem.OnClick = ExitClick

FilePopup.AddItems NewItem, OpenItem, Break1, ExitItem

ResizeMainForm
MainForm.Caption = "Custom form"
MainForm.ShowModal