是否有可能用标准的TListBox来改变多重选择行为?
我希望项目只能通过按住Ctrl键而不是Shift键进行多选择。
我有TActions,它根据选定的项目更新,例如:
TAction(Sender).Enabled := ListBox1.ItemIndex <> -1;当选择一个列表框项时,分配给动作的控件会闪烁,当持有shift到multiselect时,这不是仅通过按住ctrl键而发生的。
因此,我只想使用Ctrl键进行多重选择。
简单地说,我怎样才能:
multiselect
没有影响
谢谢:)
发布于 2011-12-26 21:49:59
项选择由基础列表框api控件的默认窗口过程处理。正因为如此,没有任何VCL属性可以做到这一点。尽管如此,用户可能不喜欢这样,但是您可以通过处理WM_LBUTTONDOWN消息来更改行为,即发布触发项选择的控件。以任何您喜欢的方式对控件进行子类。或者,由于发布了WM_LBUTTONDOWN,您可以使用ApplicationEvents组件的OnMessage事件。或者,就像下面的一个例子一样,如果控件立即由窗体父级生成,则可以使用发送给父控件的通知:
type
TForm1 = class(TForm)
..
private
procedure WMParentNotify(var Msg: TWMParentNotify); message WM_PARENTNOTIFY;
..
procedure TForm1.WMParentNotify(var Msg: TWMParentNotify);
var
Pt: TPoint;
State: TKeyboardState;
begin
if (Msg.Event = WM_LBUTTONDOWN) then begin
Pt := SmallPointToPoint(SmallPoint(Msg.XPos, Msg.YPos));
MapWindowPoints(Handle, ListBox1.Handle, Pt, 1);
if PtInRect(ListBox1.ClientRect, Pt) then begin
GetKeyboardState(State);
State[VK_SHIFT] := 0;
SetKeyboardState(State);
end;
end;
inherited;
end;https://stackoverflow.com/questions/8638781
复制相似问题