Software Archive
Read-only legacy content
17060 Discussions

tool tips on buttons?

davidgraham
Beginner
498 Views
You can have tooltips on toolbar items.
Can you have "tooltips" on buttons?
If you can, how do you do them.

Thanks,
David
0 Kudos
3 Replies
Jugoslav_Dujic
Valued Contributor II
498 Views
Here's a snip from an actual app which does just that. To be honest, it's evolved from a working 3rd-party example and I'm not on a solid ground why and whether it has to be so complicated... but then, if it works for me, it could also work for you. The dialog actually consists only of four buttons and serves as a "sub-toolbar" like in AutoCad. Here's its dialogproc:
 
!=============================================================== 
LOGICAL(4) FUNCTION BojenjeDlgProc(hWnd,Msg,wParam,lParam) 
!DEC$ATTRIBUTES STDCALL:: BojenjeDlgProc 
 
USE DFWIN 
USE COMCTL 
USE HISTORY 
USE GLOBALS 
USE REGISTRY 
USE UKS 
 
IMPLICIT NONE 
 
INCLUDE "Resource.fd" 
INCLUDE 'Strings.fd'     ! Contains string definitions (S_TT_ stuff) 
 
INTEGER::                     hWnd,Msg,wParam,lParam 
INTEGER::                     IDCommand(4)=(/ID_BUTTON_PONAP,ID_BUTTON_POGRA, & 
                                             ID_BUTTON_POIZV,ID_BUTTON_POSTA/) 
CHARACTER*32::                szTool(4)=                                & 
                             (/S_TT_COLOR_LEVEL,      & 
                               S_TT_COLOR_AREA,       & 
                               S_TT_COLOR_FEEDER,     & 
                               S_TT_COLOR_ENERGIZATION/) 
TYPE(T_RECT)::                Rect 
TYPE(T_POINT)::               PT 
TYPE(T_TTTOOLINFO)::          TI 
INTEGER::                     iSt, i, ID, iState 
 
INTERFACE 
      INTEGER(4) FUNCTION HookProc(nCode,wParam,lParam) 
      !DEC$ATTRIBUTES STDCALL::      HookProc 
      INTEGER,INTENT(IN)::    nCode,wParam,lParam 
      END FUNCTION 
END INTERFACE 
 
SELECT CASE(Msg) 
CASE (WM_INITDIALOG) 
      !iSt=ScreenToClient(hMDI,PT) 
      iSt=SendMessage(GetDlgItem(hWnd,ID_BUTTON_PONAP),BM_SETIMAGE,IMAGE_BITMAP,hBojenjeBmp(1)) 
      iSt=SendMessage(GetDlgItem(hWnd,ID_BUTTON_POGRA),BM_SETIMAGE,IMAGE_BITMAP,hBojenjeBmp(2)) 
      iSt=SendMessage(GetDlgItem(hWnd,ID_BUTTON_POIZV),BM_SETIMAGE,IMAGE_BITMAP,hBojenjeBmp(3)) 
      iSt=SendMessage(GetDlgItem(hWnd,ID_BUTTON_POSTA),BM_SETIMAGE,IMAGE_BITMAP,hBojenjeBmp(4)) 
      iSt=SendMessage(GetDlgItem(hWnd,ID_BUTTON_POSTA),BM_SETCHECK,BST_CHECKED,0) 
      hTooltip=CreateWindowEx(WS_EX_TOPMOST, "TOOLTIPS_CLASS32"C,""C,         & 
                TTS_ALWAYSTIP, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,   & 
                CW_USEDEFAULT, hFrame, NULL, hInst, NULL) 
      hHook=SetWindowsHookEx(WH_GETMESSAGE,LOC(HookProc),NULL,GetCurrentThreadId()) 
      Rect=T_RECT(0,0,0,0) 
      DO i=1,4 
            TI=T_TTTOOLINFO(32,TTF_IDISHWND,hWnd,GetDlgItem(hWnd,IDCommand(i)),Rect,0,LOC(szTool(i)),0) 
            iSt=SendMessage(hTooltip, TTM_ADDTOOL,0,LOC(TI)) 
      END DO 
      BojenjeDlgProc=.FALSE. 
CASE (WM_COMMAND) 
      !(Stripped) 
CASE DEFAULT 
      BojenjeDlgProc=.FALSE. 
END SELECT 
 
END FUNCTION BojenjeDlgProc 


(To be continued...)
0 Kudos
Jugoslav_Dujic
Valued Contributor II
498 Views
...here's HookProc:
 
!================================================================ 
INTEGER(4) FUNCTION HookProc(nCode,wParam,lParam)  
!DEC$ATTRIBUTES STDCALL::      HookProc 
 
USE DFWIN 
USE COMCTL 
USE GLOBALS 
USE REGISTRY 
 
IMPLICIT NONE 
 
INTEGER,INTENT(IN)::    nCode,wParam,lParam 
 
INTEGER::         iSt 
TYPE(T_MSG)::     Msg,MsgOut 
POINTER(pMsg,Msg) 
 
INCLUDE "Resource.fd" 
 
pMsg=lParam 
IF (Msg%hWnd.EQ.GetDlgItem(hBojenje,ID_BUTTON_PONAP) .OR.         & 
         Msg%hWnd.EQ.GetDlgItem(hBojenje,ID_BUTTON_POGRA) .OR.   & 
         Msg%hWnd.EQ.GetDlgItem(hBojenje,ID_BUTTON_POIZV) .OR.   & 
         Msg%hWnd.EQ.GetDlgItem(hBojenje,ID_BUTTON_POSTA)) THEN 
      SELECT CASE (Msg%Message) 
      CASE (WM_MOUSEMOVE,WM_LBUTTONDOWN,WM_LBUTTONUP,WM_RBUTTONDOWN,WM_RBUTTONUP) 
          MsgOut%lParam = Msg%lParam  
          MsgOut%wParam = Msg%wParam 
          MsgOut%Message = Msg%Message 
          MsgOut%hwnd = Msg%Hwnd 
          iSt=SendMessage(hTooltip, TTM_RELAYEVENT, 0, LOC(MsgOut)) 
      END SELECT 
      HookProc=CallNextHookEx(hHook,nCode,wParam,lParam) 
ELSE IF (... 
      !Snipped part for other dialogs 
      HookProc=CallNextHookEx(hHook,nCode,wParam,lParam)  
ELSE 
      HookProc=CallNextHookEx(hHook,nCode,wParam,lParam)  
END IF 
 
END FUNCTION HookProc 


HTH
Jugoslav
0 Kudos
davidgraham
Beginner
498 Views
Jugoslav,
Thanks again for you help.
I got the tool tips to work. I don't know how any body could work that out for themselves.
I simplified HookProc, I wanted tips for all the buttons.

 
INTEGER(4) FUNCTION HookProc(nCode,wParam,lParam) 
------------------------------------------------- 
!DEC$ATTRIBUTES STDCALL::      HookProc 
! tool tips 
 USE dfwin 
 USE global 
 INTEGER::    nCode,wParam,lParam 
 INTEGER::         iSt 
 TYPE(T_MSG)::     Msg 
 POINTER(pMsg,Msg) 
 INCLUDE 'Resource.fd' 
 pMsg=lParam 
 SELECT CASE (Msg%Message) 
 CASE (WM_MOUSEMOVE,WM_LBUTTONDOWN,WM_LBUTTONUP,WM_RBUTTONDOWN,WM_RBUTTONUP) 
 iSt=SendMessage(hTooltip, TTM_RELAYEVENT, 0, LOC(Msg)) 
 END SELECT 
 HookProc=CallNextHookEx(hHook,nCode,wParam,lParam) 
 END FUNCTION HookProc 
0 Kudos
Reply