Hi.
I want a little notification window to popup, and I want it to look just like a tooltip window.
But... as I understand it, tooltip windows are always associated with a window somewhere and don't allow the programmer much control over when to show them or where to place them.
How do I pop up a tooltip-style window and show/hide it whenever I want?

You know, like Opera does when a download completes or you receive mail... :)
Posted on 2004-09-14 22:04:24 by Hugin
You can specify the WS_POPUP flag when calling CreateWindowEx. It can be shown/hidden by the ShowWindow function, either with parameter SW_SHOW or SW_HIDE. This does not work when processing the WM_CREATE msg in your WindowProc.

Dominik
Posted on 2004-09-15 00:07:54 by Dom
Sorry if I'm being stupid, but I can't get it to work even in this extremely simple app: (RosAsm code)
[call | push #L>2 | call #1]

[push | push #1 | #+1]

Main:

; Register ToolTip class
[CC: 8, &ICC_WIN95_CLASSES]
call 'Comctl32.InitCommonControlsEx' CC

; Create a tooltip
[TooltipClass: B$ "Tooltips_class32", 0]
call 'Kernel32.GetModuleHandleA' &NULL
call 'User32.CreateWindowExA' &NULL,
TooltipClass,
&NULL,
&WS_POPUP,
0, 0,
300, 300,
&NULL,
&NULL,
eax,
&NULL


; Show it
call 'User32.ShowWindow' eax, &SW_SHOW
call 'Kernel32.Sleep' 2000
call 'Kernel32.ExitProcess' 0
Posted on 2004-09-16 13:24:03 by Hugin
Here's my approach :)



.data
IHelp_Visible dd 0
IHelp_ParamNum dd 0
IHelp_Width dd 0
IHelp_Height dd 18

.data?
IHelp_txt db 260 dup (?)
.code

;=====[[ IHelp.Tools >>===\
IHelp_Show proc txt1
local pt:POINT,baka
.if IHelp_Visible
call IHelp_Hide
.endif

invoke lstrcpy,addr IHelp_txt,txt1

invoke GetThisTxtSize2,txt1
add eax,10
mov IHelp_Width,eax

invoke SendMessage,hwndEdit,EM_GETSEL,addr baka,0
dec baka
invoke SendMessage,hwndEdit,EM_POSFROMCHAR,baka,0
mov ebx,eax
movsx eax,ax
shr ebx,16
movsx ebx,bx
sub ebx,18
add eax,3
mov pt.x,eax
invoke GetThisTxtSize,txt1
sub pt.x,eax
mov pt.y,ebx
invoke ClientToScreen,hwndEdit,addr pt
invoke SetWindowPos,IHelp_hWnd,0,pt.x,pt.y,IHelp_Width,IHelp_Height,SWP_NOOWNERZORDER or SWP_NOZORDER



invoke ShowWindow,IHelp_hWnd,SW_SHOW
invoke SetFocus,hwndEdit

mov IHelp_Visible,1
ret
IHelp_Show endp
IHelp_Hide proc
invoke ShowWindow,IHelp_hWnd,SW_HIDE
mov IHelp_Visible,0
ret
IHelp_Hide endp
;========/
;=====[[ IHelp_Paint >>===\
IHelp_Paint proc uses esi edi hdc
invoke GetStockObject,DEFAULT_GUI_FONT
invoke SelectObject,hdc,eax
invoke GetStockObject,HOLLOW_BRUSH
invoke SelectObject,hdc,eax


xor eax,eax
.while IHelp_txt[eax]
inc eax
.endw
invoke TextOut,hdc,4,2,addr IHelp_txt,eax


ret
IHelp_Paint endp
;=======/
;=====<< IHelp_Loop >>===\
IHelp_Loop proc hWnd,msg,w,l
local ps:PAINTSTRUCT
.if msg==WM_PAINT
invoke BeginPaint,hWnd,addr ps
invoke IHelp_Paint,eax
invoke EndPaint,hWnd,addr ps
.else
invoke DefWindowProc,hWnd,msg,w,l
.endif
ret
IHelp_Loop endp
;=======/
;=====<< CreateIHelp >>===\
CreateIHelpWnd proc
local wc:WNDCLASSEX
.data
IHelpClassName db "UltranoIHelper",0
.code
lea edi,wc
xor eax,eax
mov ecx,sizeof WNDCLASSEX
rep stosb
mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.lpfnWndProc,IHelp_Loop
push hinst
pop wc.hInstance
invoke GetSysColor,COLOR_INFOBK
invoke CreateSolidBrush,eax
mov wc.hbrBackground,eax
mov wc.lpszClassName,offset IHelpClassName
invoke LoadIcon,hinst,1
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx, addr wc
invoke CreateWindowEx,WS_EX_LTRREADING or WS_EX_TOPMOST or WS_EX_TOOLWINDOW,\
addr IHelpClassName,0,\
WS_POPUP or WS_CLIPSIBLINGS or WS_CLIPCHILDREN or WS_OVERLAPPED or WS_BORDER,
200,200,170,160,hwndEdit,0,hinst,0
mov IHelp_hWnd,eax

ret
CreateIHelpWnd endp
;=======/

Posted on 2004-09-16 15:25:40 by Ultrano
Ultrano's code works, and works well, because it creates a custom window class.
If you want to reuse the tooltips_class32, have a look at Iczelion tutorial 27 (h..p://win32assembly.online.fr/files/tut27.zip)...

Regards, bilbo
Posted on 2004-09-17 11:24:46 by bilbo
Aww taken directly out of the context of TIX (an IDE), the code lacks two procs:



.data
GetThisTxtSizeOK db 0
.data?
GetThisTxtSizeData dd 256 dup (?)
.code
GetThisTxtSize proc uses ebx ecx edx txt1
local baka
.if !GetThisTxtSizeOK
mov GetThisTxtSizeOK,1
invoke CreateCompatibleDC,0
mov baka,eax
invoke GetStockObject,DEFAULT_GUI_FONT
invoke SelectObject,baka,eax
invoke GetCharWidth,baka,0,255,addr GetThisTxtSizeData
invoke DeleteDC,baka
.endif
.if !txt1
mov eax,100
ret
.endif
mov ecx,txt1
xor edx,edx
@@:
movzx eax,byte ptr[ecx]
or al,al
jz @F
cmp al,32
je @F
mov eax,GetThisTxtSizeData[eax*4]
add edx,eax
inc ecx
jmp @B
@@:
mov eax,edx

ret
GetThisTxtSize endp

GetThisTxtSize2 proc uses ebx ecx edx txt1 ; doesn't care about <space>
local baka
.if !GetThisTxtSizeOK
mov GetThisTxtSizeOK,1
invoke CreateCompatibleDC,0
mov baka,eax
invoke GetStockObject,DEFAULT_GUI_FONT
invoke SelectObject,baka,eax
invoke GetCharWidth,baka,0,255,addr GetThisTxtSizeData
invoke DeleteDC,baka
.endif
.if !txt1
mov eax,25
ret
.endif
mov ecx,txt1
xor edx,edx
@@:
movzx eax,byte ptr[ecx]
or al,al
jz @F
mov eax,GetThisTxtSizeData[eax*4]
add edx,eax
inc ecx
jmp @B
@@:
mov eax,edx

ret
GetThisTxtSize2 endp



These two calculate the width of text, that is about to be written with DEFAULT_GUI_FONT. Otherwise you'd have to first create a DC with big bitmap and test.
The code is designed to put a ToolTip help while typing code in an Edit control, whose handle is hwndEdit. Can be made to show at a given x:y screen pos.
Posted on 2004-09-18 04:36:47 by Ultrano
thx for the code, Ultrano
bilbo
Posted on 2004-09-20 03:48:24 by bilbo