麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Delphi > 正文

Delphi 在窗體上創建自己光標的實例

2020-01-31 20:50:14
字體:
來源:轉載
供稿:網友

Delphi 在窗體上創建自己光標的實例

我們知道在文本框等可以接收輸入的組件中,我們可以看到閃爍的光標,并可以輸入文字,如果我們在,比如窗體上時,因為不支持輸入,也無法顯示閃爍的光標,那我們 有辦法做自己的輸入嗎?當然可以,下面我們演示在Form上來輸入文字。

    用到的API函數如下

  • GetTextMetrics:獲取程序當前的字體信息,存放到TEXTMETRIC結構中
  • CreateCaret:為系統插入標記創建一個新的形狀,并且將插入標記的屬主關系指定給特定的窗口。插入標記的形狀。可以是線、塊或位圖
  • ShowCaret:顯示光標
  • SetCaretPos:設置光標的位置

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 的第二個參數是HBITMAP類型,所以你可以使用自己的圖形作為光標形狀,這里采用默認  后面兩個參數是光標的寬度和高度,可以自定義  }  CreateCaret(Self.Handle,HBITMAP(nil),tm.tmAveCharWidth div 2,tm.tmHeight);  ShowCaret(Self.Handle);  //在(10,,10)這個點上顯示  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);  //重新設置光標位置  SetCaretPos(Self.Canvas.TextWidth(s)+10,10); end;  end.  

VC代碼

//全局字符串變量 CString s;  //初始化時,設置光標 BOOL CTest_MFCDlg::OnInitDialog() {  CDialog::OnInitDialog();   ShowSelfCaret();    ...... }  //為窗體添加函數,初始化光標 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的內容畫到窗體上 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); }  

如有疑問請留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 久章草在线视频 | 欧美女同hd| 99re色| 粉嫩粉嫩一区二区三区在线播放 | 精品国产一区二区三 | 一区二区三区国产在线 | 欧美中文字幕一区二区三区亚洲 | 久久国产精品二区 | 亚洲国产精品一 | 欧美亚洲国产成人 | 亚洲第五色综合网 | 国产成人小视频在线观看 | 美女亚洲 | 中文字幕一二三区芒果 | 奶子吧naiziba.cc免费午夜片在线观看 | 免费久久精品 | 国产剧情在线观看一区二区 | 黄色特级一级片 | 色网免费观看 | 免费看成人av| omofun 动漫在线观看 | 色综合久久久久久久久久久 | 在线播放亚洲 | 久久精品免费国产 | 97中文字幕第一一一页 | 久久手机在线视频 | 性欧美在线视频 | 国产精品久久久久久久四虎电影 | 天堂成人国产精品一区 | 久久久久久亚洲国产精品 | 在线观看av国产一区二区 | 中文字幕精品在线视频 | 宅男噜噜噜66国产免费观看 | 免费午夜视频在线观看 | 国产精品九九久久一区hh | 国产一区二区三区在线免费观看 | 欧美xxxx精品另类 | 毛片在线免费观看完整版 | 国产精品自拍av | 亚洲性生活免费视频 | 国产午夜精品一区二区三区免费 |