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

Delphi 在窗體上創(chuàng)建自己光標的實例

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

Delphi 在窗體上創(chuàng)建自己光標的實例

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

    用到的API函數如下

  • GetTextMetrics:獲取程序當前的字體信息,存放到TEXTMETRIC結構中
  • CreateCaret:為系統(tǒng)插入標記創(chuàng)建一個新的形狀,并且將插入標記的屬主關系指定給特定的窗口。插入標記的形狀??梢允蔷€、塊或位圖
  • 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); 
} 
 

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

相關文章

  • Delphi 在窗體上創(chuàng)建自己光標的實例

    Delphi 在窗體上創(chuàng)建自己光標的實例

    這篇文章主要介紹了Delphi 在窗體上創(chuàng)建自己光標的實例的相關資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • Delphi實現Listbox中的item根據內容顯示不同顏色的方法

    Delphi實現Listbox中的item根據內容顯示不同顏色的方法

    這篇文章主要介紹了Delphi實現Listbox中的item根據內容顯示不同顏色的方法,需要的朋友可以參考下
    2014-07-07
  • Delphi實現獲取進程列表及相關信息的實例

    Delphi實現獲取進程列表及相關信息的實例

    這篇文章主要介紹了Delphi實現獲取進程列表及相關信息的實例,希望通過本文大家能實現這樣的功能,需要的朋友可以參考下
    2017-09-09
  • Delphi隱藏TPageControl的標簽實例介紹

    Delphi隱藏TPageControl的標簽實例介紹

    件是一組頁面集,用于構造一個多頁對話框,它顯示多個交互頁(TTabSheet 對象),接下來為大家介紹下Delphi隱藏TPageControl的標簽方法
    2013-04-04
  • Delphi遠程連接Mysql的實現方法

    Delphi遠程連接Mysql的實現方法

    這篇文章主要介紹了Delphi遠程連接Mysql的實現方法,需要的朋友可以參考下
    2014-09-09
  • Delphi實現木馬自我拷貝方法

    Delphi實現木馬自我拷貝方法

    這篇文章主要介紹了Delphi實現木馬自我拷貝方法,對于研究木馬的運行原理很有幫助,需要的朋友可以參考下
    2014-07-07
  • 在Delphi實現在數據庫中存取圖像的圖文演示無錯

    在Delphi實現在數據庫中存取圖像的圖文演示無錯

    最近打算學習Delphi實現在數據庫中存取圖像,網上的好多Delphi實現在數據庫中存取圖像都是錯誤的,所以我把圖片給弄好了。
    2008-01-01
  • 初探Delphi中的插件編程

    初探Delphi中的插件編程

    前言我寫Delphi程序是從MIS系統(tǒng)入門的,開始嘗試子系統(tǒng)劃分的時候采用的是MDI窗體的結構。隨著系統(tǒng)功能的擴充,不斷有新的子系統(tǒng)加入系統(tǒng)中,單個工程會變得非常大,每次做一點修改都要重新編譯,單個工程的形式也不利于團隊協(xié)作。為了提高工作效率,我希望利用DLL動態(tài)鏈接庫的形式實現插件結構的編程。
    2008-03-03
  • Delphi下OpenGL2d繪圖之初始化流程詳解

    Delphi下OpenGL2d繪圖之初始化流程詳解

    這篇文章主要介紹了Delphi下OpenGL2d繪圖之初始化流程詳解,對于OpenGL的總體了解很有幫助,需要的朋友可以參考下
    2014-07-07
  • Delphi中判斷文件是否為文本文件的函數

    Delphi中判斷文件是否為文本文件的函數

    在用Delphi 編程處理文本文件的時候,如果要裝載的文件比較大,你可能會想在文件裝載過程中提供一個裝載進度的提示--那么你就必需自己編寫直接通過文件打開/讀取函數來裝載文件內容的函數。
    2008-03-03

最新評論