Windows 10 中插入符號的正常行為似乎是,一旦具有插入符號功能的控制元件獲得焦點,插入符號就會閃爍約 5 秒鐘,然后穩定(不閃爍)。每當按下向左或向右箭頭鍵時,它都會移動插入符號,然后它會再次開始閃爍 5 秒,依此類推。
我無法在我的自定義控制元件上獲得相同的行為。插入符號的創建、顯示、移動和銷毀似乎作業正常,但它只會在獲得焦點后閃爍 5 秒,也許在使用箭頭鍵移動它時再閃爍一次,但之后再也不會閃爍。每次我用箭頭鍵移動插入符號時,它都會保持穩定(不閃爍)。
如果控制元件失去焦點并重新獲得焦點,它將再次閃爍。
我注意到在另一個 3rd 方控制元件的源代碼中,作者使用了SetCaretBlinkTimeapi 呼叫,我想知道這是否是為了獲得所需的效果,但SetCaretBlinkTime's檔案鼓勵開發人員僅在實際想要設定類似于鍵盤控制面板的閃爍率時才使用它小程式可以。
我的自定義控制元件:
const
CCharWidth = 8;
CWidth = 200;
CInsideMargin = 2;
CCharsPerLine = (CWidth - (CInsideMargin * 2)) div CCharWidth;
type
TEditPane = class(TCustomControl)
private
FCaretPosX : Integer;
procedure SetCaretPosition(AXPos : Integer);
procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE;
procedure WMKeyDown(var Message: TWMKeyDown); message WM_KEYDOWN;
procedure WMKillFocus(var Message: TWMKillFocus); message WM_KILLFOCUS;
procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;
procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS;
protected
procedure Paint; override;
public
end;
implementation
procedure TEditPane.Paint;
begin
Canvas.Brush.Style := bsSolid;
Canvas.Brush.Color := clWindow;
Canvas.FillRect(Rect(0,0,Width,Height));
end;
procedure TEditPane.SetCaretPosition(AXPos : Integer);
begin
If AXPos < CInsideMargin then
AXPos := CInsideMargin;
If AXPos > CInsideMargin (CCharsPerLine * CCharWidth) then
AXPos := CInsideMargin (CCharsPerLine * CCharWidth);
FCaretPosX := AXPos;
SetCaretPos(FCaretPosX,CInsideMargin);
end;
procedure TEditPane.WMGetDlgCode(var Message: TWMGetDlgCode);
begin
inherited;
Message.Result := Message.Result or DLGC_WANTARROWS;
end;
procedure TEditPane.WMKeyDown(var Message: TWMKeyDown);
begin
inherited;
Case Message.CharCode of
VK_LEFT :
SetCaretPosition(FCaretPosX - CCharWidth);
VK_RIGHT :
SetCaretPosition(FCaretPosX CCharWidth);
end;
end;
procedure TEditPane.WMKillFocus(var Message: TWMKillFocus);
begin
inherited;
HideCaret(Handle);
DestroyCaret;
end;
procedure TEditPane.WMLButtonDown(var Message: TWMLButtonDown);
begin
inherited;
SetFocus;
end;
procedure TEditPane.WMSetFocus(var Message: TWMSetFocus);
begin
inherited;
CreateCaret(Handle,0,1,13);
SetCaretPosition(CInsideMargin);
ShowCaret(Handle);
end;
uj5u.com熱心網友回復:
顯示插入符號后,將恢復閃爍。這樣你就可以
HideCaret(Handle); { assuming that show counter is 1 }
ShowCaret(Handle);
或重復您的代碼表 WMSetFocus
CreateCaret(Handle,0,1,13);
SetCaretPosition(CInsideMargin);
ShowCaret(Handle);
閃爍也會在之后恢復BeginPaint,EndPaint因為它隱式隱藏并顯示插入符號(如果可見),但它是副作用,不應依賴。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/361594.html
下一篇:使用rvest抓取<li>專案
