Alone transfer the lessons of Iczelion I can't cope. Please help me!
Tutorial #27: Tooltip Control
a program is written exactly as a program for x86, except for passing parameters to procedures, but do not show tooltips. Why?
original text of tutorial #27.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\comctl32.inc
includelib \masm32\lib\comctl32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD
EnumChild proto :DWORD,:DWORD
SetDlgToolArea proto :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
.const
IDD_MAINDIALOG equ 101
.data
ToolTipsClassName db "Tooltips_class32",0
MainDialogText1 db "This is the upper left area of the dialog",0
MainDialogText2 db "This is the upper right area of the dialog",0
MainDialogText3 db "This is the lower left area of the dialog",0
MainDialogText4 db "This is the lower right area of the dialog",0
.data?
hwndTool dd ?
hInstance dd ?
.code
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke DialogBoxParam,hInstance,IDD_MAINDIALOG,NULL,addr DlgProc,NULL
invoke ExitProcess,eax
DlgProc proc hDlg:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
LOCAL ti:TOOLINFO
LOCAL id:DWORD
LOCAL rect:RECT
.if uMsg==WM_INITDIALOG
invoke InitCommonControls
invoke CreateWindowEx,NULL,ADDR ToolTipsClassName,NULL,\
TTS_ALWAYSTIP,CW_USEDEFAULT,\
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\
hInstance,NULL
mov hwndTool,eax
mov id,0
mov ti.cbSize,sizeof TOOLINFO
mov ti.uFlags,TTF_SUBCLASS
push hDlg
pop ti.hWnd
invoke GetWindowRect,hDlg,addr rect
invoke SetDlgToolArea,hDlg,addr ti,addr MainDialogText1,id,addr rect
inc id
invoke SetDlgToolArea,hDlg,addr ti,addr MainDialogText2,id,addr rect
inc id
invoke SetDlgToolArea,hDlg,addr ti,addr MainDialogText3,id,addr rect
inc id
invoke SetDlgToolArea,hDlg,addr ti,addr MainDialogText4,id,addr rect
invoke EnumChildWindows,hDlg,addr EnumChild,addr ti
.elseif uMsg==WM_CLOSE
invoke EndDialog,hDlg,NULL
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
DlgProc endp
EnumChild proc uses edi hwndChild:DWORD,lParam:DWORD
LOCAL buffer[256]:BYTE
mov edi,lParam
assume edi:ptr TOOLINFO
push hwndChild
pop [edi].uId
or [edi].uFlags,TTF_IDISHWND
invoke GetWindowText,hwndChild,addr buffer,255
lea eax,buffer
mov [edi].lpszText,eax
invoke SendMessage,hwndTool,TTM_ADDTOOL,NULL,edi
assume edi:nothing
ret
EnumChild endp
SetDlgToolArea proc uses edi esi hDlg:DWORD,lpti:DWORD,lpText:DWORD,id:DWORD,lprect:DWORD
mov edi,lpti
mov esi,lprect
assume esi:ptr RECT
assume edi:ptr TOOLINFO
.if id==0
mov [edi].rect.left,0
mov [edi].rect.top,0
mov eax,[esi].right
sub eax,[esi].left
shr eax,1
mov [edi].rect.right,eax
mov eax,[esi].bottom
sub eax,[esi].top
shr eax,1
mov [edi].rect.bottom,eax
.elseif id==1
mov eax,[esi].right
sub eax,[esi].left
shr eax,1
inc eax
mov [edi].rect.left,eax
mov [edi].rect.top,0
mov eax,[esi].right
sub eax,[esi].left
mov [edi].rect.right,eax
mov eax,[esi].bottom
sub eax,[esi].top
mov [edi].rect.bottom,eax
.elseif id==2
mov [edi].rect.left,0
mov eax,[esi].bottom
sub eax,[esi].top
shr eax,1
inc eax
mov [edi].rect.top,eax
mov eax,[esi].right
sub eax,[esi].left
shr eax,1
mov [edi].rect.right,eax
mov eax,[esi].bottom
sub eax,[esi].top
mov [edi].rect.bottom,eax
.else
mov eax,[esi].right
sub eax,[esi].left
shr eax,1
inc eax
mov [edi].rect.left,eax
mov eax,[esi].bottom
sub eax,[esi].top
shr eax,1
inc eax
mov [edi].rect.top,eax
mov eax,[esi].right
sub eax,[esi].left
mov [edi].rect.right,eax
mov eax,[esi].bottom
sub eax,[esi].top
mov [edi].rect.bottom,eax
.endif
push lpText
pop [edi].lpszText
invoke SendMessage,hwndTool,TTM_ADDTOOL,NULL,lpti
assume edi:nothing
assume esi:nothing
ret
SetDlgToolArea endp
end startWin x64 Tutorial #27OPTION DOTNAME
include temphls.inc
include win64.inc
include kernel32.inc
includelib kernel32.lib
include user32.inc
includelib user32.lib
include comctl32.inc
includelib comctl32.lib
OPTION PROLOGUE:none
OPTION EPILOGUE:none
IMAGE_BASE equ 400000h
IDD_MAINDIALOG equ 101
.code
WinMain proc
xor ebx,ebx
push rbx
mov r9d,offset DlgProc
mov r8,rbx
mov edx,IDD_MAINDIALOG
mov ecx,IMAGE_BASE
sub esp,20h
call DialogBoxParam
xor ecx,ecx
call ExitProcess
WinMain endp
DlgProc proc hDlg:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
LOCAL ti:TOOLINFO
LOCAL id:QWORD
LOCAL rect:RECT
push rbp
mov ebp,esp
sub esp,(20h+sizeof RECT+sizeof TOOLINFO+8+15)and(-16)
mov hDlg,rcx
mov wParam,r8
mov lParam,r9
cmp edx,WM_INITDIALOG
je wmINITDIALOG
cmp edx,WM_CLOSE
je wmCLOSE
xor eax,eax;mov eax,FALSE
leave
retn
wmINITDIALOG:call InitCommonControls
push rbx
mov eax,IMAGE_BASE
push rax
push rbx
push rbx
shl eax,9
push rax;CW_USEDEFAULT
push rax;CW_USEDEFAULT
push rax;CW_USEDEFAULT
push rax;CW_USEDEFAULT
mov r9d,TTS_ALWAYSTIP
mov r8,rbx
mov edx,offset ToolTipsClassName
xor ecx,ecx
sub esp,20h
call CreateWindowEx
mov hwndTool,rax
mov id,rbx
mov ti.cbSize,sizeof TOOLINFO
mov ti.uFlags,TTF_SUBCLASS
mov rcx,hDlg
mov ti.hwnd,rcx
lea edx,rect
call GetWindowRect
lea eax,rect
mov [esp+20h],rax
mov r9,id
mov r8d,offset MainDialogText1
lea edx,ti
mov rcx,hDlg
call SetDlgToolArea
inc id
lea eax,rect
mov [esp+20h],rax
mov r9,id
mov r8d,offset MainDialogText2
lea edx,ti
mov rcx,hDlg
call SetDlgToolArea
inc id
lea eax,rect
mov [esp+20h],rax
mov r9,id
mov r8d,offset MainDialogText3
lea edx,ti
mov rcx,hDlg
call SetDlgToolArea
inc id
lea eax,rect
mov [esp+20h],rax
mov r9,id
mov r8d,offset MainDialogText4
lea edx,ti
mov rcx,hDlg
call SetDlgToolArea
lea r8,ti
mov edx,offset EnumChild
mov rcx,hDlg
call EnumChildWindows
jmp wmBYE
wmCLOSE:xor edx,edx
;mov rcx,hDlg
call EndDialog
wmBYE: leave
mov eax,TRUE
retn
DlgProc endp
EnumChild proc hwndChild:QWORD,lParam:QWORD
LOCAL buffer[256]:BYTE
local old_rdi:QWORD
push rbp
mov ebp,esp
sub esp,(20h+256+8+15)and(-16)
mov hwndChild,rcx
mov lParam,rdx
mov old_rdi,rdi
mov edi,edx;lParam
mov [rdi+TOOLINFO.uId],ecx
or [rdi+TOOLINFO.uFlags],TTF_IDISHWND
mov r8d,255
lea edx,buffer
;mov rcx,hwndChild
call GetWindowText
lea eax,buffer
mov [rdi+TOOLINFO.lpszText],rax
mov r9,rdi
mov r8,rbx;NULL
mov edx,TTM_ADDTOOL
mov rcx,hwndTool
call SendMessage
mov rdi,old_rdi
leave
retn
EnumChild endp
SetDlgToolArea proc hDlg:QWORD,lpti:QWORD,lpText:QWORD,id:QWORD,lprect:QWORD
local old_rdi:qword
local old_rsi:qword
push rbp
mov ebp,esp
sub esp,20h+16
mov old_rdi,rdi
mov old_rsi,rsi
mov hDlg,rcx
mov lpti,rdx
mov lpText,r8
mov id,r9
mov edi,edx;lpti
mov rsi,lprect
cmp id,rbx;.if id==0
jnz @f
mov [rdi+TOOLINFO.Rect.left],0
mov [rdi+TOOLINFO.Rect.top],0
mov eax,[rsi+RECT.right]
sub eax,[rsi+RECT.left]
shr eax,1
mov [rdi+TOOLINFO.Rect.right],eax
mov eax,[rsi+RECT.bottom]
sub eax,[rsi+RECT.top]
shr eax,1
mov [rdi+TOOLINFO.Rect.bottom],eax
jmp wmBYE
@@: cmp id,1
jnz @f
mov eax,[rsi+RECT.right]
sub eax,[rsi+RECT.left]
shr eax,1
inc eax
mov [rdi+TOOLINFO.Rect.left],eax
mov [rdi+TOOLINFO.Rect.top],0
mov eax,[rsi+RECT.right]
sub eax,[rsi+RECT.left]
mov [rdi+TOOLINFO.Rect.right],eax
mov eax,[rsi+RECT.bottom]
sub eax,[rsi+RECT.top]
mov [rdi+TOOLINFO.Rect.bottom],eax
jmp wmBYE
@@: cmp id,2
jnz @f
mov [rdi+TOOLINFO.Rect.left],0
mov eax,[rsi+RECT.bottom]
sub eax,[rsi+RECT.top]
shr eax,1
inc eax
mov [rdi+TOOLINFO.Rect.top],eax
mov eax,[rsi+RECT.right]
sub eax,[rsi+RECT.left]
shr eax,1
mov [rdi+TOOLINFO.Rect.right],eax
mov eax,[rsi+RECT.bottom]
sub eax,[rsi+RECT.top]
mov [rdi+TOOLINFO.Rect.bottom],eax
jmp wmBYE
@@: mov eax,[rsi+RECT.right]
sub eax,[rsi+RECT.left]
shr eax,1
inc eax
mov [rdi+TOOLINFO.Rect.left],eax
mov eax,[rsi+RECT.bottom]
sub eax,[rsi+RECT.top]
shr eax,1
inc eax
mov [rdi+TOOLINFO.Rect.top],eax
mov eax,[rsi+RECT.right]
sub eax,[rsi+RECT.left]
mov [rdi+TOOLINFO.Rect.right],eax
mov eax,[rsi+RECT.bottom]
sub eax,[rsi+RECT.top]
mov [rdi+TOOLINFO.Rect.bottom],eax
wmBYE: mov rax,lpText
mov [rdi+TOOLINFO.lpszText],rax
mov r9,lpti
mov r8,rbx
mov edx,TTM_ADDTOOL
mov rcx,hwndTool
call SendMessage
mov rdi,old_rdi
mov rsi,old_rsi
leave
retn
SetDlgToolArea endp
;----------------------------------------------------------------
ToolTipsClassName db "Tooltips_class32",0
MainDialogText1 db "This is the upper left area of the dialog",0
MainDialogText2 db "This is the upper right area of the dialog",0
MainDialogText3 db "This is the lower left area of the dialog",0
MainDialogText4 db "This is the lower right area of the dialog",0
hwndTool dq ?
endrc-file#include "resource.h"
#define IDD_MAINDIALOG 101
#define IDC_OK 1000
#define IDC_EXIT 1001
IDD_MAINDIALOG DIALOG DISCARDABLE 0, 0, 229, 96
STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTION |
WS_SYSMENU | DS_CENTER
CAPTION "Tooltip Example"
FONT 8, "MS Sans Serif"
BEGIN
PUSHBUTTON "OK",IDC_OK,55,68,50,14
PUSHBUTTON "E&xit",IDC_EXIT,123,68,50,14
END