如何从TListBox中删除虚线焦点矩形?

时间:2015-02-21 17:58:21

标签: delphi canvas listbox ownerdrawn

我正在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;

它应该给出一个空的空间来绘制我想要的东西,但事实并非如此。当项目被聚焦时,我仍然可以看到它周围的虚线矩形。

如何删除矩形?

1 个答案:

答案 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处理消息时没有为列表框调用默认窗口过程。