这与问题如何在 TListView 标题列中显示复选框有关?.
我想使用这个答案中的代码@Sertac Akyuz
。(我也需要这个在 WinXP 中工作)
但我想让标题 CheckBox 不会从 ListView 或其他活动控件中窃取焦点。
一个快速的解决方法是将焦点始终设置到 ListView 中ListHeaderWndProc
:
...
FListHeaderChk.Checked := not FListHeaderChk.Checked;
ListView1.SetFocus;
// code that checks/clears all items
但这有点丑。因为CheckBox首先聚焦,然后焦点又回到ListView。另外,如果我单击 CheckBox 并将鼠标拖到 CheckBox 外,则无法接收到BN_CLICKED
消息。
我也试过:
TCheckBox = class(StdCtrls.TCheckBox)
private
procedure WMMouseActivate(var Message: TWMMouseActivate); message WM_MOUSEACTIVATE;
protected
procedure CreateParams(var Params: TCreateParams); override;
public
procedure DefaultHandler(var Message); override;
end;
procedure TCheckBox.WMMouseActivate(var Message: TWMMouseActivate);
begin
Message.Result := MA_NOACTIVATE; // no effect!
end;
procedure TCheckBox.CreateParams(var Params: TCreateParams);
const
WS_EX_NOACTIVATE = $08000000;
begin
inherited;
Params.ExStyle := Params.ExStyle or WS_EX_NOACTIVATE; // no effect!
end;
procedure TCheckBox.DefaultHandler(var Message);
begin
case TMessage(Message).Msg of
WM_SETFOCUS:
begin
if IsWindow(TWMSetFocus(Message).FocusedWnd) then
begin
TMessage(Message).Result := 1; // ???
// inherited // ???
Windows.SetFocus(TWMSetFocus(Message).FocusedWnd);
Exit;
// Checkbox fails to receive `BN_CLICKED` message
end;
end;
end;
inherited;
end;
没有任何效果。我错过了什么?