Delphi 在窗體上創(chuàng)建自己光標(biāo)的實(shí)例
Delphi 在窗體上創(chuàng)建自己光標(biāo)的實(shí)例
我們知道在文本框等可以接收輸入的組件中,我們可以看到閃爍的光標(biāo),并可以輸入文字,如果我們在,比如窗體上時(shí),因?yàn)椴恢С州斎?,也無法顯示閃爍的光標(biāo),那我們 有辦法做自己的輸入嗎?當(dāng)然可以,下面我們演示在Form上來輸入文字。
用到的API函數(shù)如下
- GetTextMetrics:獲取程序當(dāng)前的字體信息,存放到TEXTMETRIC結(jié)構(gòu)中
- CreateCaret:為系統(tǒng)插入標(biāo)記創(chuàng)建一個(gè)新的形狀,并且將插入標(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 的第二個(gè)參數(shù)是HBITMAP類型,所以你可以使用自己的圖形作為光標(biāo)形狀,這里采用默認(rèn)
后面兩個(gè)參數(shù)是光標(biāo)的寬度和高度,可以自定義
}
CreateCaret(Self.Handle,HBITMAP(nil),tm.tmAveCharWidth div 2,tm.tmHeight);
ShowCaret(Self.Handle);
//在(10,,10)這個(gè)點(diǎn)上顯示
SetCaretPos(10,10);
end;
//窗體按鍵事件,每次按一個(gè)鍵后,重寫s的值,在OnPaint事件中會(huì)把s的值 畫到窗體上
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
//如果是退格鍵,則刪除前一個(gè)字符
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í),設(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ū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
Delphi 實(shí)現(xiàn)軟件自動(dòng)升級(jí)的功能
這篇文章主要介紹了Delphi 實(shí)現(xiàn)軟件自動(dòng)升級(jí)的功能的相關(guān)資料,希望通過本文能幫助到大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下2017-09-09
delphi mysql adbquery數(shù)據(jù)提供程序或其他服務(wù)返回 E_FAIL 狀態(tài)
這篇文章主要介紹了delphi mysql adbquery數(shù)據(jù)提供程序或其他服務(wù)返回 E_FAIL 狀態(tài)的解決方法2013-11-11
Delphi 中內(nèi)存映射對(duì)于大文件的使用
這篇文章主要介紹了Delphi 中內(nèi)存映射對(duì)于大文件的使用的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下2017-09-09
wordpress主題支持自定義菜單及修改css樣式實(shí)現(xiàn)方法
使用wordpress過程中會(huì)遇到主題支持自定義菜單以及修改css樣式問題,本文將介紹詳細(xì)解決方法,需要朋友可以參考下2012-12-12
Delphi實(shí)現(xiàn)窗口文字淡入淡出漸變效果的方法
這篇文章主要介紹了Delphi實(shí)現(xiàn)窗口文字淡入淡出漸變效果,需要的朋友可以參考下2014-07-07
Delphi實(shí)現(xiàn)窗體感知鼠標(biāo)滑過并自動(dòng)隱藏與顯示窗口的方法
這篇文章主要介紹了Delphi實(shí)現(xiàn)窗體感知鼠標(biāo)滑過并自動(dòng)隱藏與顯示窗口的方法,涉及Delphi操作窗口及鼠標(biāo)事件的技巧,需要的朋友可以參考下2015-05-05
Delphi遠(yuǎn)程連接Mysql的實(shí)現(xiàn)方法
這篇文章主要介紹了Delphi遠(yuǎn)程連接Mysql的實(shí)現(xiàn)方法,需要的朋友可以參考下2014-09-09
TImage組件實(shí)現(xiàn)保存圖片到Stream
這篇文章主要介紹了TImage組件實(shí)現(xiàn)保存圖片到Stream以及從stream中讀取圖片的方法,非常的實(shí)用,有需要的小伙伴可以參考下2016-05-05

