这与问题“如何在TListView标题列中显示复选框?”有关。
我想使用
但是我希望使标题CheckBox不会从ListView或其他活动控件窃取焦点。
一种快速解决方法是在
我想使用
@Sertac Akyuz
的这个答案中的代码。(我需要在WinXP中运行)但是我希望使标题CheckBox不会从ListView或其他活动控件窃取焦点。
一种快速解决方法是在
ListHeaderWndProc
中始终将焦点设置为ListView。...
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;
什么都不起作用。我错过了什么吗?
TabStop := False
。这很明显。使用自绘制的标题是一个不错的替代方案,但这并不能回答问题,而且这有什么乐趣呢?;) - kobik