SendMessage函式巧應用

2022-12-20 20:12:04 字數 3080 閱讀 8306

1、獲得游標所在的行和列

一般的比較完善的文字編輯器一般都有在狀態列中顯示當前游標所在行和列的功能。利用sendmessage向textbox控制項傳送編輯控制項型別訊息。也可以實現這樣的功能。

下面首先來看程式,然後再分析。

首先在vb中建立乙個新工程,並在form1中加入乙個textbox控制項和兩個label控制項。將textbox控制項的multiline屬性設定為true。然後在form1的**視窗中加入如下**:

optionexplicit

privatedeclarefunctionsendmessagelib"user32"alias"sendmessagew"_(byvalhwndaslong,byvalwmsgaslong,byvalwparamaslong,_lparamasany)aslong

privatedeclarefunctionsendmessagebyreflib"user32"alias"sendmessagea"_(byvalhwndaslong,byvalwmsgaslong,wparamaslong,_lparamaslong)aslong

dimilinex,ilineyaslong

subgetcurpos(txtaastextbox)diml,l1,l2aslongdimastrasstring*256

l=sendmessage(

iliney=sendmessage(

"列:"+str(ilinex)"行:"+str(iliney)endsub

privatesubform_load()dimifile

dimastrasstring

""""""

ifile=freefile

open"c:\windows\"forinputas#ifiledo

lineinput#ifile,astr

privatesubform_resize()

privatesubtext1_click()getcurpostext1endsub

privatesubtext1_keyup(keycodeasinteger,shiftasinteger)getcurpostext1endsub

在執行程式前,確保在你的硬碟上有c:\windows\這個檔案。否則程式會出錯。然後執行程式。當在編輯文字時,可以看到在視窗底部可以顯示當前游標所在的行、列值。

在上面的程式中。我們首先傳送em_lineindex訊息,傳送該訊息可以返回某一行的第乙個字元在整個文字控制項中的位置,如果wparam引數設定為-1,則返回當前行的字元位置。然後傳送em_linefromchar,傳送該訊息可以根據引數wparam指定的字元位置返回該字元所在的行號,文字第一行的位置為0。

這樣使用這兩個訊息就獲得當前游標所在的行號。要取得列號,首先傳送em_getsel訊息,傳送該訊息返回當前被選中文字的起始位置,如果沒有文字被選中,則返回當前游標所在字元在文字中的位置。由於上面的em_lineindex訊息返回的是當前行的第乙個字元在文字中的位置。

所以將兩值相減,就是游標所在字元的列位置。在上面的程式中,如果你的文字中有中文字元的話,當你的游標在中文字元中移動乙個位置,你會看到

標籤中的列位置增加了2,這是由於sendmessage傳送的訊息所得到的結果是不支援中文的,它將乙個中文字算做兩個字元。這也算是程式中的乙個bug吧(這也就是為什麼我要使用em_getsel訊息而不直接使用textbox控制項的selstart屬性來獲取游標所在字元位置了,因為如果使用selstart返回的值將乙個中文算乙個字元,同

em_lineindex返回值相減有可能得到負值),如果你有什麼更好的建議,歡迎到我的主頁同我討論。

2、獲得文字控制項中整行文字

利用em_getline訊息我們可以獲得文字控制項中某一行的文字。具體的範例如下:

optionexplicit

privatedeclarefunctionsendmessagelib"user32"alias"sendmessagew"_(byvalhwndaslong,byvalwmsgaslong,byvalwparamaslong,_lparamasany)aslong

privatedeclarefunctionsendmessagestrlib"user32"alias"sendmessagea"_(byvalhwndaslong,byvalwmsgaslong,byvalwparamaslong,_byvallparamasstring)aslong

privatesubtext1_click()dimastrasstringdiml,ilineyaslong

astr=space(1024)

l=sendmessage(

iliney=sendmessage("該行包含文字長度:"+str(l)

要執行上面的程式,首先你要在form中加入兩個textbox控制項,並將text1的multiline屬性設定為true。然後執行程式,在text1中點選滑鼠,text2中就會顯示游標所在行的文字。

3、其它訊息

下面介紹一些控制textbox控制項行為的訊息em_getfirstvisibleline

傳送em_getfirstvisibleline訊息可以獲得文字控制項中處於可見位置的最頂部的文字所在的行。如果訊息處理成功,將返回該行的索引,以0為基數。em_linescroll

傳送該訊息可以控制textbox水平或垂直滾動。引數wparam指定水平滾動的字元數。引數lparam指定垂直滾動的行數,定義以及呼叫方法如下:

privatedeclarefunctionsendmessagelib"user32"alias"sendmessagew"_(byvalhwndaslong,byvalwmsgaslong,byvalwparamaslong,_lparamasany)aslong

constem_linescroll=&hb6

'將text1中的文字向下滾動1行,向右滾動5個字元

em_setreadonly

傳送該訊息可以設定文字控制項是否具有唯讀屬性,如果將sendmessage引數wparam設定為true,則控制項具有唯讀屬性,否則控制項可讀寫。範例如下:constem_setreadonly=&hcf

'設定text1為唯讀

em_undo

傳送該訊息將使文字控制項回覆上一次的操作,相當於執行時在文字控制項的右鍵選單中選擇「撤銷」操作。

函式1函式 圖象

函式1.函式 影象 知識概要 函式是兩個數集間的對應關係,這個對應必須使非空數集a中任一元素在b中都有唯一元素和它對應。a叫定義域,c 叫值域。定義域 值域 對應法則是函式的三要素。一 定義域求法 1.使解析式有意義 2.幾個式子組合的解析式,必須都有意義 3.實際問題要有實際。二 值域求法 根據表...

指數函式 對數函式與冪函式

一 知識網路 見下頁 附 1 指數函式的圖象和性質 2 對數函式的影象和性質 二 考綱解析 3 題型分類與例題精講 題型一指數和對數的運算 同步練習 4 2009全國卷2 設,則 a.b.c.d.5 2010四川 a 0b 1c 2d 4 6 2011天津 已知則 a bc d 題型二指數函式的影象...

printf函式稱為格式輸出函式

printf函式稱為格式輸出函式,其關鍵字最末乙個字母f即為 格式 format 之意。其功能是按使用者指定的格式,把指定的資料顯示到顯示器螢幕上。在前面的例題中我們已多次使用過這個函式。printf函式呼叫的一般形式 printf函式是乙個標準庫函式,它的函式原型在標頭檔案 stdio.h 中。但...