欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Delphi 在窗體上創(chuàng)建自己光標(biāo)的實(shí)例

 更新時(shí)間:2017年09月04日 09:05:24   作者:bdmh  
這篇文章主要介紹了Delphi 在窗體上創(chuàng)建自己光標(biāo)的實(shí)例的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下

Delphi 在窗體上創(chuàng)建自己光標(biāo)的實(shí)例

我們知道在文本框等可以接收輸入的組件中,我們可以看到閃爍的光標(biāo),并可以輸入文字,如果我們?cè)冢热绱绑w上時(shí),因?yàn)椴恢С州斎?,也無(wú)法顯示閃爍的光標(biāo),那我們 有辦法做自己的輸入嗎?當(dāng)然可以,下面我們演示在Form上來(lái)輸入文字。

    用到的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); 
} 
 

如有疑問(wèn)請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

最新評(píng)論