QWToolbar
ThreadDlg

 

QWToolbar.f90 Source

 

MODULE GLOBALS

INTEGER::   hFrame,     &     !Handle of the frame window
            hInst,      &     !Instance handle
            hMDI,       &     !Handle of the MDI client window
            hToolbar,   &     !Toolbar handle
            lpfnOldFrameProc  !Address of the default MDI windos procedure

INTEGER,PARAMETER::     &     !Define our own message for toolbar creation.
                              !Should be > WM_USER=#0400
            WM_CREATETOOLBAR=#0500
            

END MODULE GLOBALS
!===================================================================
PROGRAM QWToolbar

USE DFLIB
USE DFWIN
USE GLOBALS

IMPLICIT NONE

LOGICAL::               bSt
TYPE(WindowConfig)::    WConf
TYPE(T_RECT)::          Rect
CHARACTER*15::          sClass
INTEGER::               iSt, jTop, jBottom, jLeft, jRight, jWidth, jHeight

INTERFACE
      INTEGER(4) FUNCTION FrameWndProc(hWnd,Msg,wParam,lParam)
      !DEC$ATTRIBUTES STDCALL::  FrameWndProc
      INTEGER::      hWnd,Msg,wParam,lParam
      END FUNCTION
END INTERFACE

iSt=SETEXITQQ(QWIN$EXITNOPERSIST)

hFrame=GETHWNDQQ(QWIN$FRAMEWINDOW)           !Handle of the frame window
hInst=GetWindowLong(hFrame,GWL_HINSTANCE)    !Instance handle (needed to load resources)

iSt=SetWindowText(hFrame,"QuickWin Toolbar Sample")

hMDI = GetWindow(hFrame, GW_CHILD)          !MDI parent window (the dark surface beneath childs)


!Subclass the Frame window with FrameWndProc. lpfnOldFrameProc is the
!address of default ("Old") Frame window procedure
lpfnOldFrameProc=SetWindowLong(hFrame,GWL_WNDPROC,LOC(FrameWndProc))

!This is a user-defined message sent to Frame window to create toolbar.
!Note that a direct call to CreateMyToolbar from here would fail (i.e.
!the toolbar would be created, but "dead", since QW has two threads:
!"primary", where mouse and menu callbacks, along with QW internal
!stuff is executed, and "secondary", where PROGRAM is executed).
!This, secondary thread does not contain a message loop; the primary
!(where FrameWndProc is executed) has.
iSt=SendMessage(hFrame,WM_CREATETOOLBAR,0,0)


iSt=SETACTIVEQQ(0)

WConf%numxpixels=200
WConf%numypixels=100
WConf%numtextcols=0
WConf%numtextrows=0
WConf%numcolors=256
WConf%fontsize=#0008000C
WConf%title=' 'C
bSt = SETWINDOWCONFIG(WConf)
IF (.NOT.bSt) bSt = SETWINDOWCONFIG(WConf)

iSt=SETBKCOLOR(7)
CALL CLEARSCREEN($GCLEARSCREEN)

DO WHILE (.TRUE.)
   CALL SLEEPQQ(500)
END DO

END PROGRAM
!==================================================================
!Subclassed procedure of Frame client window
INTEGER FUNCTION FrameWndProc(hWnd,Msg,wParam,lParam)
!DEC$ATTRIBUTES STDCALL::      FrameWndProc

USE DFWIN
!DEC$IF (_DF_VERSION_ <=650)
USE COMCTL
!DEC$ENDIF
USE GLOBALS

INTEGER::               hWnd,Msg,wParam,lParam
INTEGER::               iSt, ID, iState, itbHeight
TYPE(T_RECT)::          tbRect, mdiRect
TYPE(T_NMHDR)::         NMH; POINTER(pNMH, NMH)
TYPE(T_NMTTDISPINFO)::  DI; POINTER(pDI, DI)

INCLUDE "Resource.fd"

SELECT CASE(Msg)
CASE (WM_CREATETOOLBAR)
      !Request for toolbar creation
      CALL CreateMyToolbar
      FrameWndProc=0
CASE (WM_COMMAND)
      !Click on a menu or toolbar button
      ID=IAND(wParam,#FFFF)         !Button ID
      !TODO add your own handlers here. See "Toolbars" section in SDK help
      !for toolbar messages (TB_xxx)
      SELECT CASE(ID)
      CASE(ID_BUTTON_1)
            iSt=MessageBox(hFrame,"Button 1"C,"Toolbar"C,MB_OK)
      CASE(ID_BUTTON_2)
            iSt=MessageBox(hFrame,"Button 2"C,"Toolbar"C,MB_OK)
      CASE(ID_BUTTON_3)
            iState=SendMessage(hToolbar,TB_GETSTATE,ID,0)
            IF (IAND(iState,TBSTATE_CHECKED).NE.0) THEN
                  iSt=MessageBox(hFrame,"Button 3 pushed"C,"Toolbar"C,MB_OK)
            ELSE
                  iSt=MessageBox(hFrame,"Button 3 released"C,"Toolbar"C,MB_OK)
            END IF
      END SELECT
      FrameWndProc=CallWindowProc(lpfnOldFrameProc,hWnd,Msg,wParam,lParam)
CASE (WM_NOTIFY)
      !Tooltips send a WM_NOTIFY message. 
      !lParam points to NMHDR structure. Its code member contains TTN_GETDISPINFO
      pNMH = lParam
      IF (NMH%code.EQ.TTN_GETDISPINFO) THEN
            !NMTTDISPINFO DI contains NMHDR as the first member. So, we 
            !have to cast lParam to a pointer to DI.
            pDI = lParam
            DI%hInst = GetModuleHandle(0)
            DI%lpszText = wParam
      END IF
      FrameWndProc = CallWindowProc(lpfnOldFrameProc,hWnd,Msg,wParam,lParam)
CASE (WM_SIZE)
      !QuickWin will try to move the MDI client area over the toolbar. We have to 
      !resize hMDI so that it comes below the toolbar.
      iSt = GetClientRect(hWnd, mdiRect)
      iSt = GetWindowRect(hToolbar, tbRect)
      itbHeight = tbRect%Bottom-tbRect%Top
      iSt = MoveWindow(hMDI, 0, itbHeight, mdiRect%Right, mdiRect%Bottom - itbHeight, .TRUE.)
      FrameWndProc = 0
CASE DEFAULT
      !Send all other messages further to normal processing
      FrameWndProc=CallWindowProc(lpfnOldFrameProc,hWnd,Msg,wParam,lParam)
END SELECT

END FUNCTION FrameWndProc
!======================================================================
!Creation of toolbar
SUBROUTINE CreateMyToolbar()

USE DFWIN
!DEC$IF (_DF_VERSION_ >= 650) 
USE COMCTL32, ONLY: CreateToolbarEx
!DEC$ELSE
USE COMCTL
!DEC$ENDIF
USE GLOBALS

IMPLICIT NONE

INCLUDE 'Resource.fd'

INTEGER::               i, iSt, iStyle
TYPE(T_TBBUTTON)::      Button(4)

Button(1)=T_TBBUTTON(0,ID_BUTTON_1,TBSTATE_ENABLED,TBSTYLE_BUTTON,(/0_1,0_1/),0,NULL)
Button(2)=T_TBBUTTON(0,0,TBSTATE_ENABLED,TBSTYLE_SEP,(/0_1,0_1/),0,NULL)
Button(3)=T_TBBUTTON(1,ID_BUTTON_2,TBSTATE_ENABLED,TBSTYLE_BUTTON,(/0_1,0_1/),0,NULL)
Button(4)=T_TBBUTTON(2,ID_BUTTON_3,TBSTATE_ENABLED,TBSTYLE_CHECK,(/0_1,0_1/),0,NULL)

hToolbar=CreateToolbarEx(hFrame,   &                     !Parent window
      WS_CHILD.OR.WS_VISIBLE.OR.WS_CLIPSIBLINGS.OR.TBSTYLE_TOOLTIPS,    &    !Toolbar style
      IDR_TOOLBAR1,           &                          !Bitmap ID
      3,                      &                          !Number of bitmaps
      hInst,                  &                          !Instance handle
      IDR_TOOLBAR1,           &                          !Toolbar ID
      Button,                 &                          !Address of Button array
      4,                      &                          !Number of buttons (incl. separators)
      0,                      &                          !Button width (default)
      0,                      &                          !Button height (default)
      16,                     &                          !Bitmap width 
      15,                     &                          !Bitmap height
      SizeOf(Button(1)))                                 !Size of T_TBBUTTON

END SUBROUTINE CreateMyToolbar