⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lion-tut-c27.htm

📁 内有一些代码
💻 HTM
📖 第 1 页 / 共 2 页
字号:
    &nbsp;&nbsp;&nbsp; LOCAL rect:RECT <BR>
    &nbsp;&nbsp;&nbsp; .if uMsg==WM_INITDIALOG <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke InitCommonControls <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke CreateWindowEx,NULL,ADDR 
    ToolTipsClassName,NULL,\ <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TTS_ALWAYSTIP,CW_USEDEFAULT,\ 
    <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\ 
    <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hInstance,NULL 
    <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov hwndTool,eax <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov id,0 <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov ti.cbSize,sizeof TOOLINFO <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov ti.uFlags,TTF_SUBCLASS <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push hDlg <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop ti.hWnd <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke GetWindowRect,hDlg,addr 
    rect <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke SetDlgToolArea,hDlg,addr 
    ti,addr MainDialogText1,id,addr rect <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inc id <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke SetDlgToolArea,hDlg,addr 
    ti,addr MainDialogText2,id,addr rect <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inc id <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke SetDlgToolArea,hDlg,addr 
    ti,addr MainDialogText3,id,addr rect <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inc id <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke SetDlgToolArea,hDlg,addr 
    ti,addr MainDialogText4,id,addr rect <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke EnumChildWindows,hDlg,addr 
    EnumChild,addr ti </p>
  <p><BR>
    &nbsp;&nbsp;&nbsp; .elseif uMsg==WM_CLOSE <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke EndDialog,hDlg,NULL <BR>
    &nbsp;&nbsp;&nbsp; .else <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov eax,FALSE <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret <BR>
    &nbsp;&nbsp;&nbsp; .endif <BR>
    &nbsp;&nbsp;&nbsp; mov eax,TRUE <BR>
    &nbsp;&nbsp;&nbsp; ret <BR>
    DlgProc endp </p>
  <p>EnumChild proc uses edi hwndChild:DWORD,lParam:DWORD <BR>
    &nbsp;&nbsp;&nbsp; LOCAL buffer[256]:BYTE <BR>
    &nbsp;&nbsp;&nbsp; mov edi,lParam <BR>
    &nbsp;&nbsp;&nbsp; assume edi:ptr TOOLINFO <BR>
    &nbsp;&nbsp;&nbsp; push hwndChild <BR>
    &nbsp;&nbsp;&nbsp; pop [edi].uId <BR>
    &nbsp;&nbsp;&nbsp; or [edi].uFlags,TTF_IDISHWND <BR>
    &nbsp;&nbsp;&nbsp; invoke GetWindowText,hwndChild,addr buffer,255 <BR>
    &nbsp;&nbsp;&nbsp; lea eax,buffer <BR>
    &nbsp;&nbsp;&nbsp; mov [edi].lpszText,eax <BR>
    &nbsp;&nbsp;&nbsp; invoke SendMessage,hwndTool,TTM_ADDTOOL,NULL,edi <BR>
    &nbsp;&nbsp;&nbsp; assume edi:nothing <BR>
    &nbsp;&nbsp;&nbsp; ret <BR>
    EnumChild endp </p>
  <p>SetDlgToolArea proc uses edi esi hDlg:DWORD,lpti:DWORD,lpText:DWORD,id:DWORD,lprect:DWORD 
    <BR>
    &nbsp;&nbsp;&nbsp; mov edi,lpti <BR>
    &nbsp;&nbsp;&nbsp; mov esi,lprect <BR>
    &nbsp;&nbsp;&nbsp; assume esi:ptr RECT <BR>
    &nbsp;&nbsp;&nbsp; assume edi:ptr TOOLINFO <BR>
    &nbsp;&nbsp;&nbsp; .if id==0 <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov [edi].rect.left,0 <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov [edi].rect.top,0 <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov eax,[esi].right <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sub eax,[esi].left <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; shr eax,1 <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov [edi].rect.right,eax <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov eax,[esi].bottom <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sub eax,[esi].top <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; shr eax,1 <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov [edi].rect.bottom,eax <BR>
    &nbsp;&nbsp;&nbsp; .elseif id==1 <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov eax,[esi].right <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sub eax,[esi].left <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; shr eax,1 <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inc eax <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov [edi].rect.left,eax <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov [edi].rect.top,0 <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov eax,[esi].right <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sub eax,[esi].left <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov [edi].rect.right,eax <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov eax,[esi].bottom <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sub eax,[esi].top <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov [edi].rect.bottom,eax <BR>
    &nbsp;&nbsp;&nbsp; .elseif id==2 <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov [edi].rect.left,0 <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov eax,[esi].bottom <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sub eax,[esi].top <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; shr eax,1 <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inc eax <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov [edi].rect.top,eax <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov eax,[esi].right <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sub eax,[esi].left <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; shr eax,1 <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov [edi].rect.right,eax <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov eax,[esi].bottom <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sub eax,[esi].top <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov [edi].rect.bottom,eax <BR>
    &nbsp;&nbsp;&nbsp; .else <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov eax,[esi].right <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sub eax,[esi].left <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; shr eax,1 <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inc eax <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov [edi].rect.left,eax <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov eax,[esi].bottom <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sub eax,[esi].top <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; shr eax,1 <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inc eax <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov [edi].rect.top,eax <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov eax,[esi].right <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sub eax,[esi].left <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov [edi].rect.right,eax <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov eax,[esi].bottom <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sub eax,[esi].top <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov [edi].rect.bottom,eax <BR>
    &nbsp;&nbsp;&nbsp; .endif <BR>
    &nbsp;&nbsp;&nbsp; push lpText <BR>
    &nbsp;&nbsp;&nbsp; pop [edi].lpszText <BR>
    &nbsp;&nbsp;&nbsp; invoke SendMessage,hwndTool,TTM_ADDTOOL,NULL,lpti <BR>
    &nbsp;&nbsp;&nbsp; assume edi:nothing <BR>
    &nbsp;&nbsp;&nbsp; assume esi:nothing <BR>
    &nbsp;&nbsp;&nbsp; ret <BR>
    SetDlgToolArea endp </p>
  <p><BR>
    end start </p>
</BLOCKQUOTE>
<p>分析:</p>
<p>创建主对话框窗口之后,使用CreateWindowEx创建工具提示控件.</p>
<BLOCKQUOTE>invoke InitCommonControls <BR>invoke CreateWindowEx,NULL,ADDR 
  ToolTipsClassName,NULL,\ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  TTS_ALWAYSTIP,CW_USEDEFAULT,\ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\ 
  <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hInstance,NULL <BR>mov hwndTool,eax 
</BLOCKQUOTE>
&nbsp;&nbsp; 
<p>之后,我们继续定义对话框四个角作为焦点域.</p>
<p>mov id,0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; 焦点域ID <BR>
  &nbsp;&nbsp;&nbsp; mov ti.cbSize,sizeof TOOLINFO <BR>
  &nbsp;&nbsp;&nbsp; mov ti.uFlags,TTF_SUBCLASS&nbsp;&nbsp;&nbsp; ; 告诉控件子类化窗口. 
  <BR>
  &nbsp;&nbsp;&nbsp; push hDlg <BR>
  &nbsp;&nbsp;&nbsp; pop ti.hWnd&nbsp;&nbsp;&nbsp; ; 包含焦点域的窗口句柄<BR>
  &nbsp;&nbsp;&nbsp; invoke GetWindowRect,hDlg,addr rect&nbsp;&nbsp;&nbsp; ; 获得客户区的大小<BR>
  &nbsp;&nbsp;&nbsp; invoke SetDlgToolArea,hDlg,addr ti,addr MainDialogText1,id,addr 
  rect </p>
<P>我们初始化<B>TOOLINFO</B>结构. 注意我们要把客户区分成4个焦点域,因此我们需要知道客户区的大小,所以调用<b>GetWindowRect</b>.因为我们不想自己向控件转发消息,因此指定<b>TIF_SUBCLASS 
  </b>标志.<BR>
  <B>SetDlgToolArea</B> 是计算焦点域矩形范围的并向控件注册的函数,我不详细解释计算过程.只说明它把对话框分成4个焦点域.然后向控件发送<B>TTM_ADDTOOL</B> 
  消息, 在<B>lParam</B>参数中传递<B>TOOLINFO</B>结构的地址.
<P><B>&nbsp;&nbsp;&nbsp; invoke SendMessage,hwndTool,TTM_ADDTOOL,NULL,lpti </B>
<P> 在四个控件注册之后,我们来看看对话框的按钮,我们可以用ID来处理每个按钮,但是实在太乏味了.我们使用<b>EnumChildWindows</b>函数列举对话框上的所有控件并把他们注册给控件,<b>EnumChildWindows</b>原型如下:
<BLOCKQUOTE><B>EnumChildWindows proto hWnd:DWORD, lpEnumFunc:DWORD, 
  lParam:DWORD</B></BLOCKQUOTE>
<p>hWnd 是父窗口句柄. </p>
<p>lpEnumFunc 是每个控件将调用的<B>EnumChildProc</B>函数地址.lParam 是应用程序定义的要传给<B>EnumChildProc</B> 
  函数的值. <B>EnumChildProc</B> 函数定义如下:</p>
<BLOCKQUOTE><B>EnumChildProc proto hwndChild:DWORD, 
lParam:DWORD</B></BLOCKQUOTE>
hwndChild是<B>EnumChildWindows</B>函数枚举的句柄. lParam 就是你传递给<B>EnumChildWindows</B>函数的同一个lParam. 
<BR>
在例子中.我们如此调用<B> EnumChildWindows</B> 函数:
<BLOCKQUOTE><B>invoke EnumChildWindows,hDlg,addr EnumChild,addr ti 
</B></BLOCKQUOTE>
我们把<b>TOOLINFO</b>结构的地址放在lParam参数中传递,是因为我们要在<b>EnumChild</b>函数中注册每个子控件.如果我们不使用这种方法,就需要将<b>ti</b>声明为全局变量,但这可能会引入很多bug.<BR>
当我们调用<B> EnumChildWindows</B>时, Windows会枚举出对话框上所有的子控件并为每个子控件调用一次<B>EnumChild</B> 
f函数. 这样如果我们的对话框有两个控件,<b>EnumChild</b>将被调用两次.<BR>
EnumChild 函数填充TOOLINFO 结构的相应成员并向控件注册. 
<BLOCKQUOTE><B>EnumChild proc uses edi hwndChild:DWORD,lParam:DWORD 
  </B><BR><B>&nbsp;&nbsp;&nbsp; LOCAL buffer[256]:BYTE 
  </B><BR><B>&nbsp;&nbsp;&nbsp; mov edi,lParam </B><BR><B>&nbsp;&nbsp;&nbsp; 
  assume edi:ptr TOOLINFO </B><BR><B>&nbsp;&nbsp;&nbsp; push hwndChild 
  </B><BR><B>&nbsp;&nbsp;&nbsp; pop [edi].uId&nbsp;&nbsp;&nbsp; ; we use the 
  whole client area of the control as the tool </B><BR><B>&nbsp;&nbsp;&nbsp; or 
  [edi].uFlags,TTF_IDISHWND </B><BR><B>&nbsp;&nbsp;&nbsp; invoke 
  GetWindowText,hwndChild,addr buffer,255 </B><BR><B>&nbsp;&nbsp;&nbsp; lea 
  eax,buffer&nbsp;&nbsp;&nbsp; ; use the window text as the tooltip text 
  </B><BR><B>&nbsp;&nbsp;&nbsp; mov [edi].lpszText,eax 
  </B><BR><B>&nbsp;&nbsp;&nbsp; invoke SendMessage,hwndTool,TTM_ADDTOOL,NULL,edi 
  </B><BR><B>&nbsp;&nbsp;&nbsp; assume edi:nothing </B><BR><B>&nbsp;&nbsp;&nbsp; 
  ret </B><BR><B>EnumChild endp </B></BLOCKQUOTE>
<font size="2" face="宋体">注意在例子中,我们使用了一种不同&quot;工具&quot;:覆盖整个客户区的</font>&quot;工具&quot;,因此我们需要用包含&quot;工具&quot;窗口的句柄来填充<b>uID</b>成员,也必须在<b>uFlags</b> 
成员中指定<b>TTF_IDISHWND</b>标志. 
<HR SIZE=1>
<DIV align=center> 
  <SCRIPT language=JavaScript1.1 src="../lion-tut-c13.files/textclick"></SCRIPT>
  <BR>
</DIV>
<!-- 10:1 文本广告交换 --> 
<DIV align=center> 
  <SCRIPT language=JavaScript1.1 src="../lion-tut-c13.files/c21.htm"></SCRIPT>
  <!-- 10:1 文本广告交换 --></DIV>
<HR SIZE=1>
<DIV align=center>This article come from Iczelion's asm page, Welcom to <A 
href="http://asm.yeah.net/">http://asm.yeah.net/</A></DIV></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -