我们知道在文本框等可以接收输入的组件中,我们可以看到闪烁的光标,并可以输入文字,如果我们在,比如窗体上时,因为不支持输入,也无法显示闪烁的光标,那我们 有办法做自己的输入吗?当然可以,下面我们演示在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
-
- s:string;
- public
-
- end;
-
- var
- Form1: TForm1;
-
- implementation
-
- {$R *.dfm}
-
- procedure TForm1.FormCreate(Sender: TObject);
- var
-
- tm:TTextMetric;
- begin
- s := ‘‘;
- GetTextMetrics(Self.Canvas.Handle,tm);
-
- CreateCaret(Self.Handle,HBITMAP(nil),tm.tmAveCharWidth div 2,tm.tmHeight);
- ShowCaret(Self.Handle);
-
- SetCaretPos(10,10);
- end;
-
- 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);
- }
-
- 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);
- }
-
- 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);
- }
参考:
http://blog.csdn.net/bdmh/article/details/6456353
在窗体上创建自己的光标并输入文字,布布扣,bubuko.com
在窗体上创建自己的光标并输入文字
原文:http://www.cnblogs.com/findumars/p/3895869.html