' BILL K   2a   12-2002 1-2003 StatusBitmaps.rqb
' This demonstrates how to make Bitmaps appear
'   in a QStatusbar very easily.
' This has four LED style indicators in the
'   statusbar that indicate Capslock, Insert Mode,
'   Numlock On, and Richedit.modified status.
' This also shows how to adjust the width
'   of a statusbar.panel() depending on the text
'  that it's displaying using a QTimer
' I would appreciate any suggestions
'   Enjoy!  Bill K
'
'  NOTE: This relies on having 
'  eight 44 x 13 bitmap images for loading in
'  the program. One for each ON/OFF status
'  of each LED. Modify the lines according to where
'  you have the bitmaps located.
'
$OPTIMIZE ON
$APPTYPE GUI
$TYPECHECK ON
'
'DECLARE CONSTANTS=================
CONST CRLF=CHR$(13) & CHR$(10)
CONST VK_CAPITAL = &H14
CONST VK_NUMLOCK = &H90
CONST VK_INSERT = &H2D
'
'DECLARE VARIABLES===================
DEFSTR CURSPRV
DEFBYTE MODPREV,CAPSPREV,NUMPREV,INSRTSTAT
'
'DECLARE SUBS=======================
DECLARE SUB DOTIMER
DECLARE SUB DOINIT
DECLARE SUB INSERTSTAT(key AS byte,shift AS byte)
'
'DECLARE FUNCTIONS==================
DECLARE FUNCTION SetWindowLong LIB "User32" ALIAS _
"SetWindowLongA" (hwnd AS Long, nIndex AS Long, _
dwNewLong AS Long) AS LONG
DECLARE FUNCTION SetParent LIB "user32" ALIAS _
"SetParent" (hWndChild AS Long, hWndNewParent _
AS Long) AS LONG
DECLARE FUNCTION GetKeyState LIB "user32" ALIAS _
"GetKeyState" (nVirtKey AS Long) AS INTEGER
'
'===========
CREATE TIMEX AS QTIMER
   INTERVAL=50
   ONTIMER=DOTIMER
END CREATE
'
CREATE RFONT AS QFONT
   NAME="LETTER GOTHIC"
   SIZE=10
END CREATE
CREATE SBFONT AS QFONT
   NAME="ARIAL"
   SIZE=8
   BOLD=1
END CREATE
'{===========FORMS================
CREATE FORM AS QFORM '
   CAPTION="STATUSBAR BITMAPS DEMO"
   ONSHOW =DOINIT
   FONT=SBFONT
   WIDTH = 490
   HEIGHT = 520
   CENTER
   CREATE MenuBar1 AS QMAINMENU
      CREATE FileMenu AS QMENUITEM
         Caption = "&File"
      END CREATE
      CREATE EditMenu AS QMENUITEM
         Caption = "&Edit"
      END CREATE
      CREATE ToolsMenu AS QMENUITEM
         Caption = "&Tools"
      END CREATE
      CREATE HelpMenu AS QMENUITEM
         Caption = "&Help"
      END CREATE
   END CREATE 'MenuBar1
   CREATE REDIT AS QRICHEDIT
      LEFT = 0
      TOP = 89
      WIDTH = 532
      HEIGHT = 382
      ALIGN = 5
      FONT=RFONT
      ONKEYDOWN=INSERTSTAT
      HIDESELECTION = 0
      PLAINTEXT = 1
      SCROLLBARS = 3
      WANTTABS = 1
      TABORDER = 0
   END CREATE
   CREATE STATUSBAR AS QSTATUSBAR
      ADDPANELS "","",""
      PANEL(0).WIDTH = 185
      PANEL(1).WIDTH = 180
      PANEL(2).CAPTION="C:\RapidQ\Examples\zipview.rqb"
   END CREATE
   CREATE STPANEL AS QPANEL
      HEIGHT=STATUSBAR.HEIGHT-5
      BEVELOUTER=0
      TOP=4
      CREATE IMAGE1 AS QIMAGE
         TRANSPARENT=1
         LEFT=0
         BMP="INSERTONSQ.BMP"
      END CREATE
      CREATE IMAGE2 AS QIMAGE
         TRANSPARENT=1
         LEFT=44
         BMP="CAPSONSQ.BMP"
      END CREATE
      CREATE IMAGE3 AS QIMAGE
         TRANSPARENT=1
         LEFT=88
         BMP="NUMONSQ.BMP"
      END CREATE
      CREATE IMAGE4 AS QIMAGE
         TRANSPARENT=1
         LEFT=132
         BMP="SAVEDSQ.BMP"
      END CREATE
   END CREATE
END CREATE  ' FORM
'{==================SUBROUTINES==================
SUB DOINIT
'    force stpanel to be child of statusbar
   SetParent Stpanel.Handle , Statusbar.Handle
   STPANEL.WIDTH=StatusBar.PANEL(1).WIDTH - 4
END SUB
'
SUB INSERTSTAT(KEY,SHIFT)
   DEFBYTE KEYST
   IF KEY=45 AND SHIFT=0 THEN
      INSRTSTAT=1-INSRTSTAT
      IF INSRTSTAT=0 THEN
         IMAGE1.BMP="INSERTONSQ.BMP"
      ELSE
         IMAGE1.BMP="INSERTOFFSQ.BMP"
      END IF
   END IF
END SUB
'
SUB DOTIMER
   DEFSTR CAPSTR,CURSTR
   CURSTR=STR$(REDIT.WHEREY+1) & " : " & _
   STR$(REDIT.WHEREX+1) _
   & " / " &  STR$(REDIT.LINECOUNT) & _
   " Lines, Size=" & STR$(len(REDIT.text))
   IF CURSPRV<>CURSTR THEN
      CURSPRV=CURSTR
      STPANEL.FONT=SBFONT
      StatusBar.PANEL(0).CAPTION=CURSTR
      StatusBar.PANEL(0).WIDTH=FORM.TEXTWIDTH(CURSTR)+6
      STPANEL.LEFT=StatusBar.PANEL(0).WIDTH + 3
   END IF
   IF MODPREV<>REDIT.MODIFIED THEN
      MODPREV=REDIT.MODIFIED
      IF REDIT.MODIFIED THEN
         IMAGE4.BMP="MODIFYSQ.BMP"
      ELSE
         IMAGE4.BMP="SAVEDSQ.BMP"
      END IF
   END IF
   IF CAPSPREV<>GetKeyState(VK_CAPITAL) OR _
   NUMPREV<>GetKeyState(VK_NUMLOCK) THEN
   CAPSPREV=GetKeyState(VK_CAPITAL)
   NUMPREV=GetKeyState(VK_NUMLOCK)
   IF CAPSPREV THEN
      IMAGE2.BMP="CAPSONSQ.BMP"
   ELSE
      IMAGE2.BMP="CAPSOFFSQ.BMP"
   END IF
   IF NUMPREV THEN
      IMAGE3.BMP="NUMONSQ.BMP"
   ELSE
      IMAGE3.BMP="NUMOFFSQ.BMP"
   END IF
END IF
END SUB
'{===========INITIALIZE CODE======
' So Main Form Minimizes Correctly
SetWindowLong FORM.HANDLE, -8, 0
SetWindowLong application.HANDLE, -8, FORM.HANDLE
'----------------
FORM.SHOWMODAL
' end
