国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Delphi > 正文

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

2020-01-31 20:50:14
字體:
供稿:網(wǎng)友

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ū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 宜阳县| 宜君县| 阳江市| 河间市| 汤阴县| 黎川县| 扶沟县| 繁峙县| 贵港市| 乌兰浩特市| 宁阳县| 隆尧县| 闵行区| 安乡县| 延边| 正镶白旗| 明水县| 来安县| 巴彦县| 邛崃市| 罗平县| 保靖县| 漳浦县| 民和| 北辰区| 广灵县| 曲麻莱县| 崇州市| 增城市| 高青县| 连州市| 滕州市| 衡东县| 来凤县| 祁东县| 巴楚县| 三门县| 万源市| 馆陶县| 溧阳市| 平塘县|