📄 sendmessage函数的应用(四)_悠哉游斋.htm
字号:
}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> </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> </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)
'光标所在行的首字符在文本中的位置<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> <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>
一般情况下,为了拉下或收起组合框的下拉列表,需要用键盘或鼠标进行操作,而有时我们希望程<BR>序运行的某个时刻自动拉出下拉列表(比如在一些演示程序中),为了实现这个目的,我们也只有借助<BR>于SendMessage函数,方法是发一个CB_SHOWDROPDOWN(&H14F)消息给组合框。<BR>
在发CB_SHOWDROPDOWN消息时,wParam参数决定了是拉下列表(=True)还是收起表(=False),<BR>lParam无用(设为0)。<BR>
为说明具体的使用方法,下面提供简单的程序片段:<BR><BR>Const
CB_SHOWDROPDOWN=&H14F<BR><BR>
当程序中某处需要拉下组合框Combol的列表时,调用如下语句:<BR><BR>SendMessage
Combol.hwnd,CB_SHOWDROPDOWN,True,0<BR><BR>
当需要收起组合框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> 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> tmHeight As
Long
'字符高度<BR> tmAscent As
Long
'字符上部高度(基线以上)<BR> tmDescent As
Long
'字符下部高度(基线以下)<BR> tmInternalLeading As Long
'由tmHeight定义的字符高度的顶部空间数目<BR> tmExternalLeading As
Long '加在两行之间的空间数目<BR> tmAveCharWidth As
Long '平均字符宽度<BR> tmMaxCharWidth
As Long '最宽字符的宽度<BR> tmWeight As
Long
'字体的粗细轻重程度<BR> tmOverhang As
Long
'加入某些拼接字体上的附加高度<BR> tmDigitizedAspectX As Long
'字体设计所针对的设备水平方向<BR> tmDigitizedAspectY As Long
'字体设计所针对的设备垂直方向<BR> tmFirstChar As
String '为字体定义的第一个字符<BR>
tmLastChar As String
'为字体定义的最后一个字符<BR> tmDefaultChar As
String '字体中所没有字符的替代字符<BR> tmBreakChar
As String '用于拆字的字符<BR>
tmItalic As
Byte
'字体为斜体时非零<BR> tmUnderlined As
Byte '字体为下划线时非零<BR>
tmStruckOut As Byte
'字体被删去时非零<BR> tmPitchAndFamily As Byte
'字体间距(低4位)和族(高4位)<BR> tmCharSet As
Byte
'字体的字符集<BR>End Type<BR>Type RECT<BR> Left As
Long<BR> Top As Long<BR> Right As
Long<BR> 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 '以象素为单位<BR>Dim tm As TEXTMETRIC<BR>Dim
hDC&, lfont&, oldfont& <BR>Dim di&, lc& <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 <> 0 Then oldfont =
SelectObject(hDC, lfont) <BR>di = GetTextMetrics(hDC, tm) <BR>If lfont
<> 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& = &HD3
<BR>Public Const EC_LEFTMARGIN& = &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
= &HF4,BS_RADIOBUTTON =
&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 = &H112<BR>Public Const SC_CLOSE = &HF060
'关闭窗体<BR>Public Const SC_MINIMIZE = &HF020 '最小化窗体<BR>Public Const
SC_MAXIMIZE = &HF030 '最大化窗体<BR>Public Const SC_RESTORE = &HF120
'恢复窗体大小<BR>Public Const WM_SETTEXT = &HC '设置窗体的Caption<BR>Public Const
WM_GETTEXT = &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&'窗体最大化<BR> Case 3: SendMessage Me.hwnd, WM_SYSCOMMAND, SC_MINIMIZE,
ByVal 0&'窗体最小化<BR> Case 4: SendMessage Me.hwnd, WM_SYSCOMMAND,
SC_RESTORE, ByVal 0&'窗体恢复原来的大小<BR> Case 5: SendMessage Me.hwnd,
WM_SYSCOMMAND, SC_CLOSE, ByVal 0&'关闭窗体<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> '进行位置数据计算<BR>With
Me.Font<BR> .Name = mText.Font.Name<BR> .Size =
mText.Font.Size<BR> .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>
'数据计算完毕,再发送EM_SETRECTNP消息(为一个编辑控件设置格式化矩形,与EM_SETRECT类似,只是控件此时不会重画)<BR>Call
SendMessage(mText.hwnd, EM_SETRECTNP, 0&, 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 * &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> (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;"> </div><div id="in_nav">'); if(pre[0]){ document.write('上一篇:<a href="' + pre[3] + '" title="' + pre[1] + '">' + pre[2] + '</a> '); } 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 + -