これは、TListView ヘッダー列にチェック ボックスを表示するにはどうすればよいですか?という質問に関連しています。.
によるこの回答のコードを使用したいと思います@Sertac Akyuz
。(WinXPでも動作するためにこれが必要です)
しかし、ListView またはその他のアクティブなコントロールからフォーカスを盗まないように、ヘッダーの CheckBox を作成したいと考えています。
迅速な回避策は、フォーカスを常に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;
何も機能しません。私は何が欠けていますか?