我正在ListBox.Style := lbOwnerDrawFixed
使用OnDrawItem
:
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
ARect: TRect; State: TOwnerDrawState);
begin
with ListBox1.Canvas do begin
Brush.Color := clWhite;
Pen.Color := clWhite;
FillRect(ARect);
end;
end;
它应该给出一个空的空间来绘制我想要的东西,但事实并非如此。当项目被聚焦时,我仍然可以看到它周围的虚线矩形。
如何删除矩形?
答案 0 :(得分:8)
TCustomListBox.CNDrawItem
事件处理程序返回后,OnDrawItem
中的VCL (*)绘制了焦点矩形。
procedure TCustomListBox.CNDrawItem(var Message: TWMDrawItem);
...
..
if Integer(itemID) >= 0 then
DrawItem(itemID, rcItem, State) //-> calls message handler
else
FCanvas.FillRect(rcItem);
if (odFocused in State) and not TStyleManager.IsCustomStyleActive then
DrawFocusRect(hDC, rcItem); //-> draws focus rectangle
..
..
无论您在事件处理程序中绘制什么内容,都会在以后通过VCL进行集中。
但请注意VCL使用DrawFocusRect
绘制焦点矩形:
因为 DrawFocusRect 是一个XOR函数,所以第二次调用它 使用相同的矩形从屏幕中删除矩形。
所以,请自己致电DrawFocusRect
,让VCL的电话删除它:
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
ARect: TRect; State: TOwnerDrawState);
begin
with ListBox1.Canvas do begin
Brush.Color := clWhite;
Pen.Color := clWhite;
FillRect(ARect);
if odFocused in State then // also check for styles if there's a possibility of using ..
DrawFocusRect(ARect);
end;
end;
<小时/> (*)通常,默认窗口过程为所有者绘制的列表框项目绘制焦点矩形以响应
WM_DRAWITEM
消息。但是在VCL处理消息时没有为列表框调用默认窗口过程。