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

📄 sendmessage函数的应用(四)_悠哉游斋.htm

📁 自己总结的一些VB资料
💻 HTM
📖 第 1 页 / 共 3 页
字号:
				}else{					RelatedDocData = xhr.responseText;				}			}		}	}	xhr.send(null);})();/*]]>*/</SCRIPT>

<META content="MSHTML 6.00.2900.3354" name=GENERATOR></HEAD>
<BODY onload=formatonlinpic();>
<CENTER>
<SCRIPT type=text/javascript>
/*<![CDATA[*/
if(top.location != self.location){
	top.location = self.location;
}
var myref = encodeURI("http://hi.baidu.com/liguocan/blog/item/ed204cd99a68eeec38012f0e%2Ehtml");
/*]]>*/
</SCRIPT>
<LINK href="SendMessage函数的应用(四)_悠哉游斋.files/mods.css" type=text/css 
rel=stylesheet><LINK 
href="SendMessage函数的应用(四)_悠哉游斋.files/82535c813e6060d8bd3e1e33.css" type=text/css 
rel=stylesheet><LINK href="SendMessage函数的应用(四)_悠哉游斋.files/space.css" 
type=text/css rel=stylesheet>
<STYLE type=text/css>#usrbar {
	PADDING-RIGHT: 10px; PADDING-LEFT: 0px; FONT-SIZE: 12px; BACKGROUND: #ffffff; FILTER: alpha(opacity=65); PADDING-BOTTOM: 3px; WIDTH: 100%; COLOR: #000000; LINE-HEIGHT: 19px; PADDING-TOP: 4px; FONT-FAMILY: Arial; LETTER-SPACING: normal; HEIGHT: 19px; TEXT-ALIGN: right; moz-opacity: 0.5
}
#usrbar A {
	COLOR: #0000cc; TEXT-DECORATION: underline
}
#usrbar A:link {
	COLOR: #0000cc; TEXT-DECORATION: underline
}
#usrbar A:visited {
	COLOR: #0000cc; TEXT-DECORATION: underline
}
#ft {
	CLEAR: both; FONT-SIZE: 12px; COLOR: #666666; LINE-HEIGHT: 20px; FONT-FAMILY: Arial; HEIGHT: 20px; TEXT-ALIGN: center
}
#ft A {
	COLOR: #7777cc; TEXT-DECORATION: underline
}
#ft A:link {
	COLOR: #7777cc; TEXT-DECORATION: underline
}
#ft A:visited {
	COLOR: #7777cc; TEXT-DECORATION: underline
}
#usrbar {
	LETTER-SPACING: normal
}
#usrbar A {
	LETTER-SPACING: normal
}
#usrbar A:link {
	LETTER-SPACING: normal
}
#usrbar A:visited {
	LETTER-SPACING: normal
}
#ft {
	LETTER-SPACING: normal
}
#ft A {
	LETTER-SPACING: normal
}
#ft A:link {
	LETTER-SPACING: normal
}
#ft A:visited {
	LETTER-SPACING: normal
}
</STYLE>

<DIV id=usrbar><NOBR><A href="http://www.baidu.com/" target=_blank>百度首页</A> | <A 
id=hi_index href="http://hi.baidu.com/" target=_blank>百度空间</A>
<SCRIPT type=text/javascript>
		document.write('| <a href="http://passport.baidu.com/?login&tpl=sp&tpl_reg=sp&u=http://hi.baidu.com' + encodeURI('/liguocan/blog/item/ed204cd99a68eeec38012f0e%2Ehtml') + '">登录</a>');
		</SCRIPT>
 </NOBR></DIV>
<DIV id=main align=left><!--[if IE]>
<SCRIPT>
var objmain = document.getElementById("main");
function updatesize(){ var bodyw = window.document.body.offsetWidth; if(bodyw <= 790) objmain.style.width="772px"; else if(bodyw >= 1016) objmain.style.width="996px"; else objmain.style.width="100%"; }
updatesize(); window.onresize = updatesize;
</SCRIPT>
<![endif]-->
<DIV id=header>
<DIV class=lc>
<DIV class=rc></DIV></DIV>
<DIV class=tit><A class=titlink title="fyeat111的空间 http://hi.baidu.com/liguocan" 
href="http://hi.baidu.com/liguocan">悠哉游斋</A></DIV>
<DIV class=desc>如没有说明,则本空间中的文章/帖子均为转贴,如有侵权问题,本人马上删除</DIV>
<DIV id=tabline></DIV>
<DIV id=tab><A href="http://hi.baidu.com/liguocan">主页</A><A class=on 
href="http://hi.baidu.com/liguocan/blog">博客</A><A 
href="http://hi.baidu.com/liguocan/album">相册</A><SPAN>|</SPAN><A 
href="http://hi.baidu.com/liguocan/profile">个人档案</A> <SPAN>|</SPAN><A 
href="http://hi.baidu.com/liguocan/friend">好友</A> </DIV></DIV>
<DIV class=stage>
<DIV class=stagepad>
<DIV style="WIDTH: 100%">
<TABLE class=modth cellSpacing=0 cellPadding=0 width="100%" border=0>
  <TBODY>
  <TR>
    <TD class=modtl width=7>&nbsp;</TD>
    <TD class=modtc noWrap>
      <DIV class=modhead><SPAN class=modtit>查看文章</SPAN></DIV></TD>
    <TD class=modtc noWrap align=right></TD>
    <TD class=modtr width=7>&nbsp;</TD></TR></TBODY></TABLE>
<DIV class=modbox id=m_blog>
<DIV class=tit>SendMessage函数的应用(四)</DIV>
<DIV class=date>2008-07-09 16:44</DIV>
<TABLE style="TABLE-LAYOUT: fixed">
  <TBODY>
  <TR>
    <TD>
      <DIV class=cnt id=blog_text>
      <P>1,获得光标位置和字符个数.<BR>Cpos=SendMessage(text1.hwnd,187,-1,0)&nbsp;&nbsp;&nbsp; 
      '光标所在行的首字符在文本中的位置<BR>Lpos=SendMessage(text1.hwnd,201,Cpos,0) 
      '光标所在的行号<BR>Line=SendMessage(text1.hwnd,193,Cpos,0) 
      '这行的字符数.<BR><BR>2.获取第N行的文本<BR>Dim ST As String<BR>ST = 
      Space(110)'必须要事先赋空格<BR>Line=SendMessage(text1.hwnd,196, N-1, ByVal ST 
      'ST返回获取到的文本,Line返回文本的长度字节数<BR><BR>'下面的未成功<BR>Dim str(256) As Byte, K As 
      Integer<BR>str(1)=1 '最大允许存放256个字符<BR>K = SendMessage 
      (Text1.hwnd,196,2,str(0)) '获取第3行的数据放在str中<BR>text1.text = 
      StrConv(str,vbUnicode) 
      '转换为字符串后显示<BR>&nbsp;&nbsp;&nbsp;<BR>  说明:在调用SendMessage获取第N行字符串时,lParam需要说明为字节数组,在调用完成后,再将<BR>字节数组转换为字符串;另外,调用前必须在lParam的前两个字节指明允许存放的最大长度,其中第一<BR>个字节为低位,第二个字节为高位,本例将高位(即str(1))置1.说明最大允许存放256个字符。<BR> <BR>3.开关显示器.<BR><BR>SendMessage 
      Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 0 '关闭显示器.<BR>SendMessage Handle, 
      WM_SYSCOMMAND, SC_MONITORPOWER, -1 
      '打开显示器<BR><BR>4.程序控制拉下或收起组合框的下拉列表<BR>&nbsp;&nbsp;&nbsp; 
      一般情况下,为了拉下或收起组合框的下拉列表,需要用键盘或鼠标进行操作,而有时我们希望程<BR>序运行的某个时刻自动拉出下拉列表(比如在一些演示程序中),为了实现这个目的,我们也只有借助<BR>于SendMessage函数,方法是发一个CB_SHOWDROPDOWN(&amp;H14F)消息给组合框。<BR>&nbsp;&nbsp;&nbsp; 
      在发CB_SHOWDROPDOWN消息时,wParam参数决定了是拉下列表(=True)还是收起表(=False),<BR>lParam无用(设为0)。<BR>&nbsp;&nbsp;&nbsp; 
      为说明具体的使用方法,下面提供简单的程序片段:<BR><BR>Const 
      CB_SHOWDROPDOWN=&amp;H14F<BR><BR>&nbsp;&nbsp;&nbsp; 
      当程序中某处需要拉下组合框Combol的列表时,调用如下语句:<BR><BR>SendMessage 
      Combol.hwnd,CB_SHOWDROPDOWN,True,0<BR><BR>&nbsp;&nbsp;&nbsp; 
      当需要收起组合框Combol的列表时,调用如下语句:<BR><BR>SendMessage 
      Combol.hwnd,CB_SHOWDROPDOWNN,False,0<BR><BR><BR>5. 
      返回控件中显示的第一行的行号。<BR><BR>LineNo = SendMessageBynum(CTextBox.hwnd, 
      EM_GETFIRSTVISIBLELINE, 0, 0) 
      <BR>  <BR>6.下面的函数能够滚动控件,不过在滚动之前最好判断控件的文本行数和能够显示的行数,以免滚动时<BR>发生混乱。函数SendMessageBynum是SendMessage函数的安全声明函数,其定义与SendMessage函数完全<BR>相同,只是函数名不同。 
      <BR><BR>Function ScrollTextBox(CTextBox As TextBox, nVal As Long, Optional 
      nVertical As _<BR>&nbsp;&nbsp; Boolean = True) As Long <BR>If nVertical 
      Then <BR> ScrollTextBox = SendMessageBynum(CTextBox.hwnd, EM_LINESCROLL, 
      0, nVal) <BR>Else <BR> ScrollTextBox = SendMessageBynum(CTextBox.hwnd, 
      EM_LINESCROLL, nVal, 0) <BR>End If <BR>End Function 
      <BR><BR>7.下面的函数将返回控件能显示的行数:(经试,总是引起程序崩溃)<BR><BR>'获取当前字体的矩形区域(即字体的高度与平均宽度等信息)<BR>Private 
      Declare Function GetTextMetrics Lib "gdi32" Alias "GetTextMetricsA" (ByVal 
      hdc As Long, lpMetrics As TEXTMETRIC) As Long<BR>Private Type 
      TEXTMETRIC<BR>&nbsp;&nbsp; tmHeight As 
      Long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      '字符高度<BR>&nbsp;&nbsp; tmAscent As 
      Long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      '字符上部高度(基线以上)<BR>&nbsp;&nbsp; tmDescent As 
      Long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      '字符下部高度(基线以下)<BR>&nbsp;&nbsp; tmInternalLeading As Long&nbsp;&nbsp; 
      '由tmHeight定义的字符高度的顶部空间数目<BR>&nbsp;&nbsp; tmExternalLeading As 
      Long&nbsp;&nbsp; '加在两行之间的空间数目<BR>&nbsp;&nbsp; tmAveCharWidth As 
      Long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '平均字符宽度<BR>&nbsp;&nbsp; tmMaxCharWidth 
      As Long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '最宽字符的宽度<BR>&nbsp;&nbsp; tmWeight As 
      Long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      '字体的粗细轻重程度<BR>&nbsp;&nbsp; tmOverhang As 
      Long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      '加入某些拼接字体上的附加高度<BR>&nbsp;&nbsp; tmDigitizedAspectX As Long 
      '字体设计所针对的设备水平方向<BR>&nbsp;&nbsp; tmDigitizedAspectY As Long 
      '字体设计所针对的设备垂直方向<BR>&nbsp;&nbsp; tmFirstChar As 
      String&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '为字体定义的第一个字符<BR>&nbsp;&nbsp; 
      tmLastChar As String&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      '为字体定义的最后一个字符<BR>&nbsp;&nbsp; tmDefaultChar As 
      String&nbsp;&nbsp;&nbsp;&nbsp; '字体中所没有字符的替代字符<BR>&nbsp;&nbsp; tmBreakChar 
      As String&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '用于拆字的字符<BR>&nbsp;&nbsp; 
      tmItalic As 
      Byte&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      '字体为斜体时非零<BR>&nbsp;&nbsp; tmUnderlined As 
      Byte&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '字体为下划线时非零<BR>&nbsp;&nbsp; 
      tmStruckOut As Byte&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      '字体被删去时非零<BR>&nbsp;&nbsp; tmPitchAndFamily As Byte&nbsp;&nbsp;&nbsp; 
      '字体间距(低4位)和族(高4位)<BR>&nbsp;&nbsp; tmCharSet As 
      Byte&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      '字体的字符集<BR>End Type<BR>Type RECT<BR>&nbsp;&nbsp; Left As 
      Long<BR>&nbsp;&nbsp; Top As Long<BR>&nbsp;&nbsp; Right As 
      Long<BR>&nbsp;&nbsp; bottom As Long<BR>End Type<BR>Public ST As 
      String<BR><BR>Function GetVisibleLines(CTextBox As TextBox) As Long 
      <BR>Dim rc As RECT&nbsp;&nbsp; '以象素为单位<BR>Dim tm As TEXTMETRIC<BR>Dim 
      hDC&amp;, lfont&amp;, oldfont&amp; <BR>Dim di&amp;, lc&amp; <BR>lc = 
      SendMessage(CTextBox.hwnd, EM_GETRECT, 0, rc) <BR>lfont = 
      SendMessage(CTextBox.hwnd, WM_GETFONT, 0, 0) <BR>hDC = 
      GetDC(CTextBox.hwnd) <BR>If lfont &lt;&gt; 0 Then oldfont = 
      SelectObject(hDC, lfont) <BR>di = GetTextMetrics(hDC, tm) <BR>If lfont 
      &lt;&gt; 0 Then lfont = SelectObject(hDC, oldfont) <BR>GetVisibleLines = 
      (rc.bottom - rc.top) / tm.tmHeight <BR>di = ReleaseDC(CTextBox.hwnd, hDC) 
      <BR>End Function</P>
      <P>8.设置控件的左边距。 <BR><BR>Public Const EM_SETMARGINS&amp; = &amp;HD3 
      <BR>Public Const EC_LEFTMARGIN&amp; = &amp;H1 <BR><BR>Function 
      SetMargins(CTextBox As TextBox, nVal As Long) As Long <BR>SetMargins = 
      SendMessageBynum(CTextBox.hwnd, EM_SETMARGINS, EC_LEFTMARGIN, nVal) 
      <BR>End 
      Function<BR><BR>9.利用SendMessage函数还可以实现一些有趣的效果:<BR>  例如在按钮的Click事件中加入如下语句:<BR><BR>SendMessage(Command1.hWnd,BM_SETSTYLE,BS_RADIOBUTTON,1)'BM_SETSTYLE 
      = &amp;HF4,BS_RADIOBUTTON = 
      &amp;H4<BR><BR>  运行后点击按钮,就可以把按钮变成一个收音机按钮(经试,变成一个圆孔,有点象单选按纽)。<BR>  如要得到圆形或椭圆形按纽可使用另外2个API函数:<BR><BR>hdc=CreateEllipticRgn(3, 
      3, 25, 25) '试验成功,这两个函数也用于创建圆形窗体<BR>SetWindowRgn Command1.hWnd, hdc, 
      True<BR>DeleteObject hdc<BR><BR>10.窗体操作<BR>  <BR>Public Const 
      WM_SYSCOMMAND = &amp;H112<BR>Public Const SC_CLOSE = &amp;HF060 
      '关闭窗体<BR>Public Const SC_MINIMIZE = &amp;HF020 '最小化窗体<BR>Public Const 
      SC_MAXIMIZE = &amp;HF030 '最大化窗体<BR>Public Const SC_RESTORE = &amp;HF120 
      '恢复窗体大小<BR>Public Const WM_SETTEXT = &amp;HC '设置窗体的Caption<BR>Public Const 
      WM_GETTEXT = &amp;HD '取得窗体的caption<BR><BR>Private Sub Command_Click(Index 
      As Integer)<BR>Dim S As String<BR>S = String(80, Chr(0)) <BR>Select Case 
      Index<BR> Case 0: SendMessage Me.hwnd, WM_GETTEXT, Len(S), ByVal S: Text1 
      = Left(S, InStr(S, Chr(0)) - 1) '读出窗体的Caption<BR> Case 1: SendMessage 
      Me.hwnd, WM_SETTEXT, 0, ByVal 
      CStr(Text1.Text)'设置窗体的Caption,由于Text1.text属于Variant类型,所以一定先要用CStr把它转换成字符串<BR> Case 
      2: SendMessage Me.hwnd, WM_SYSCOMMAND, SC_MAXIMIZE, ByVal 
      0&amp;'窗体最大化<BR> Case 3: SendMessage Me.hwnd, WM_SYSCOMMAND, SC_MINIMIZE, 
      ByVal 0&amp;'窗体最小化<BR> Case 4: SendMessage Me.hwnd, WM_SYSCOMMAND, 
      SC_RESTORE, ByVal 0&amp;'窗体恢复原来的大小<BR> Case 5: SendMessage Me.hwnd, 
      WM_SYSCOMMAND, SC_CLOSE, ByVal 0&amp;'关闭窗体<BR>End Select<BR>End 
      Sub<BR><BR>11.文本垂直居中:<BR>  实现这个效果首先TextBox的MultiLine属性必须为True(多行文本,其实这个属性关系创建TextBox内部<BR><BR>使用哪个类,因此一旦创建就不能修改这个属性,所以不能在代码中修改这个属性)<BR><BR>Public 
      Sub VerMiddleText(mText As TextBox)<BR>Dim rc As RECT '以象素为单位<BR>Dim 
      tmpTop As Long<BR>Dim tmpBot As Long<BR>If mText.MultiLine = False Then 
      Exit Sub<BR>Call SendMessage(mText.hwnd, EM_GETRECT, 0, 
      rc)'获得窗口区域的边界<BR>&nbsp;&nbsp;&nbsp; '进行位置数据计算<BR>With 
      Me.Font<BR>&nbsp;&nbsp; .Name = mText.Font.Name<BR>&nbsp;&nbsp; .Size = 
      mText.Font.Size<BR>&nbsp;&nbsp; .Bold = mText.Font.Bold<BR>End 
      With<BR>tmpTop = ((rc.Bottom - rc.Top) - (mText.Parent.TextHeight("H") \ 
      Screen.TwipsPerPixelY)) \ 2<BR>tmpBot = ((rc.Bottom - rc.Top) + 
      (mText.Parent.TextHeight("H") \ Screen.TwipsPerPixelY)) \ 2<BR>rc.Top = 
      tmpTop<BR>rc.Bottom = tmpBot<BR>mText.Alignment = 
      vbCenter<BR>&nbsp;&nbsp;&nbsp; 
      '数据计算完毕,再发送EM_SETRECTNP消息(为一个编辑控件设置格式化矩形,与EM_SETRECT类似,只是控件此时不会重画)<BR>Call 
      SendMessage(mText.hwnd, EM_SETRECTNP, 0&amp;, rc)<BR>mText.Refresh<BR>End 
      Sub<BR><BR>12.调整边距:<BR>  如果你查看TextBox中常用的消息,你会发现有这样一对消息:EM_GETMARGINS 和 
      EM_SETMARGINS,MSDN的解<BR>释是:获取和设置编辑控件的左、右边距(不得用于NT3.51)。具体是左还是右由该消息的参数决定。<BR>  这样做有什么意义呢?有的时候如果你想在texebox中放入其他对象,而又不希望文本被覆盖掉,你就需要用<BR>到这个方法。<BR><BR>Private 
      Sub SetMargin(nLeft As Integer, nRight As Integer, lhWnd As Long)<BR>Dim 
      lLongValue As Long<BR>lLongValue = nRight * &amp;H10000 + nLeft 
      '高四位表示右边距,低四位为左边距<BR>SendMessage lhWnd, EM_SETMARGINS, EC_LEFTMARGIN Or 
      EC_RIGHTMARGIN, lLongValue<BR>End Sub</P></DIV></TD></TR></TBODY></TABLE><BR>
<DIV class=opt><A title=查看该分类中所有文章 
href="http://hi.baidu.com/liguocan/blog/category/Api">类别:Api</A> | <A 
title=将此文章添加到百度搜藏 onclick="return addToFavor();" 
href="http://cang.baidu.com/do/add" target=_blank>添加到搜藏</A> | 浏览(<SPAN 
id=result></SPAN>) | <A 
href="http://hi.baidu.com/liguocan/blog/item/ed204cd99a68eeec38012f0e.html#send">评论</A>&nbsp;(0)
<SCRIPT language=javascript>/*<![CDATA[*/var pre = [true,'SendMessage函数应用(三)', 'SendMessage函数应用(三)','/liguocan/blog/item/a5288745d8de6d23cefca30e.html'];var post = [true,'SendMessage函数应用(五)','SendMessage函数应用(五)', '/liguocan/blog/item/f7fef8fca4b62cf8fd037f0e.html'];if(pre[0] || post[0]){	document.write('<div style="height:5px;line-height:5px;">&nbsp;</div><div id="in_nav">');	if(pre[0]){		document.write('上一篇:<a href="' + pre[3] + '" title="' + pre[1] + '">' +  pre[2] + '</a>&nbsp;&nbsp;&nbsp;&nbsp;');	}	if(post[0]){		document.write('下一篇:<a href="' + post[3] + '" title="' + post[1] + '">' +  post[2] + '</a>');	}	document.write('</div>');}

⌨️ 快捷键说明

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