Delphi 在窗體上創(chuàng)建自己光標(biāo)的實(shí)例
Delphi 在窗體上創(chuàng)建自己光標(biāo)的實(shí)例
我們知道在文本框等可以接收輸入的組件中,我們可以看到閃爍的光標(biāo),并可以輸入文字,如果我們在,比如窗體上時,因?yàn)椴恢С州斎?,也無法顯示閃爍的光標(biāo),那我們 有辦法做自己的輸入嗎?當(dāng)然可以,下面我們演示在Form上來輸入文字。
用到的API函數(shù)如下
- GetTextMetrics:獲取程序當(dāng)前的字體信息,存放到TEXTMETRIC結(jié)構(gòu)中
- CreateCaret:為系統(tǒng)插入標(biāo)記創(chuàng)建一個新的形狀,并且將插入標(biāo)記的屬主關(guān)系指定給特定的窗口。插入標(biāo)記的形狀??梢允蔷€、塊或位圖
- ShowCaret:顯示光標(biāo)
- SetCaretPos:設(shè)置光標(biāo)的位置
Delphi代碼
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormKeyPress(Sender: TObject; var Key: Char); procedure FormPaint(Sender: TObject); private { Private declarations } s:string; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var //TTextMetric存放字體信息 tm:TTextMetric; begin s := ''; GetTextMetrics(Self.Canvas.Handle,tm); { 注意 CreateCaret 的第二個參數(shù)是HBITMAP類型,所以你可以使用自己的圖形作為光標(biāo)形狀,這里采用默認(rèn) 后面兩個參數(shù)是光標(biāo)的寬度和高度,可以自定義 } CreateCaret(Self.Handle,HBITMAP(nil),tm.tmAveCharWidth div 2,tm.tmHeight); ShowCaret(Self.Handle); //在(10,,10)這個點(diǎn)上顯示 SetCaretPos(10,10); end; //窗體按鍵事件,每次按一個鍵后,重寫s的值,在OnPaint事件中會把s的值 畫到窗體上 procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); begin //如果是退格鍵,則刪除前一個字符 if Ord(Key) = VK_BACK then begin if (s <> '') then Delete(s,Length(s),1); end else s := s + Key; //重繪 Self.Invalidate; end; procedure TForm1.FormPaint(Sender: TObject); begin Self.Canvas.TextOut(10,10,s); //重新設(shè)置光標(biāo)位置 SetCaretPos(Self.Canvas.TextWidth(s)+10,10); end; end.
VC代碼
//全局字符串變量 CString s; //初始化時,設(shè)置光標(biāo) BOOL CTest_MFCDlg::OnInitDialog() { CDialog::OnInitDialog(); ShowSelfCaret(); ...... } //為窗體添加函數(shù),初始化光標(biāo) void CTest_MFCDlg::ShowSelfCaret(void) { CClientDC dc(this); TEXTMETRIC tm; dc.GetTextMetrics(&tm); CreateSolidCaret(tm.tmAveCharWidth/2,tm.tmHeight); ShowCaret(); POINT p; p.x = 0; p.y = 0; SetCaretPos(p); } //重載PreTranslateMessage BOOL CTest_MFCDlg::PreTranslateMessage(MSG* pMsg) { //如果是按鍵按下 if (pMsg->message == WM_KEYDOWN) { //如果是退格鍵,刪除末尾字符 if (pMsg->wParam == VK_BACK) { if (s.GetLength() != 0) { s.Delete(s.GetLength() - 1,1); } } else //追加字符 s.Insert(s.GetLength(),(TCHAR)pMsg->wParam); Invalidate(true); } return CDialog::PreTranslateMessage(pMsg); } //自畫,將s的內(nèi)容畫到窗體上 void CTest_MFCDlg::OnPaint() { CPaintDC dc(this); CRect rect; GetClientRect(&rect); CSize size = dc.GetTextExtent(s); POINT p; p.x = size.cx; p.y = 0; SetCaretPos(p); dc.DrawText(s,s.GetLength(),rect,DT_LEFT); }
如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
上一篇:Delphi基本圖像處理方法匯總
欄 目:Delphi
下一篇:Delphi實(shí)現(xiàn)截屏存盤的方法
本文標(biāo)題:Delphi 在窗體上創(chuàng)建自己光標(biāo)的實(shí)例
本文地址:http://mengdiqiu.com.cn/a1/Delphi/8601.html
您可能感興趣的文章
- 01-10在Delphi實(shí)現(xiàn)在數(shù)據(jù)庫中存取圖像的圖文演示無錯
- 01-10delphi建立、讀取、存貯INI文件的方法《三》
- 01-10Delphi Command模式
- 01-10delphi 正弦曲線圖
- 01-10delphi建立、讀取、存貯INI文件的方法《二》
- 01-10插件管理框架 for Delphi(二)
- 01-10插件管理框架 for Delphi(一)
- 01-10Delphi中判斷文件是否為文本文件的函數(shù)
- 01-10delphi中一個值得大家來考慮的DLL問題
- 01-10初探Delphi中的插件編程


閱讀排行
本欄相關(guān)
- 01-10在Delphi實(shí)現(xiàn)在數(shù)據(jù)庫中存取圖像的圖
- 01-10delphi建立、讀取、存貯INI文件的方法
- 01-10delphi 正弦曲線圖
- 01-10Delphi Command模式
- 01-10delphi建立、讀取、存貯INI文件的方法
- 01-10插件管理框架 for Delphi(二)
- 01-10插件管理框架 for Delphi(一)
- 01-10Delphi中判斷文件是否為文本文件的函
- 01-10delphi中一個值得大家來考慮的DLL問題
- 01-10初探Delphi中的插件編程
隨機(jī)閱讀
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 01-10delphi制作wav文件的方法
- 04-02jquery與jsp,用jquery
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05DEDE織夢data目錄下的sessions文件夾有什