我想删除CheckBoxes,其中Node.Type是5或6.我使用此代码:
private void TvOne_DrawNode(object sender, DrawTreeNodeEventArgs e)
{
int type = (e.Node as Node).typ;
if (type == 5 || type == 6)
{
Color backColor, foreColor;
if ((e.State & TreeNodeStates.Selected) == TreeNodeStates.Selected)
{
backColor = SystemColors.Highlight;
foreColor = SystemColors.HighlightText;
}
else if ((e.State & TreeNodeStates.Hot) == TreeNodeStates.Hot)
{
backColor = SystemColors.HotTrack;
foreColor = SystemColors.HighlightText;
}
else
{
backColor = e.Node.BackColor;
foreColor = e.Node.ForeColor;
}
using (SolidBrush brush = new SolidBrush(backColor))
{
e.Graphics.FillRectangle(brush, e.Node.Bounds);
}
TextRenderer.DrawText(e.Graphics, e.Node.Text, this.TvOne.Font,
e.Node.Bounds, foreColor, backColor); …
Run Code Online (Sandbox Code Playgroud) 是否可以更改TListBox中的项目选择焦点颜色和文本颜色?
如果项目中未启用主题,或者列表框样式设置为owner-draw,则项目周围的选项将显示为蓝色,我认为这是由系统的外观设置全局定义的.
我想将所选项目的颜色更改为自定义颜色.
举个例子,结果会是这样的:
请注意,在Paint中修改了最后一个列表框以说明示例.
这个问题可能被视为使用ownerdraw和virtualmode在listview中闪烁的后续行动.
我有一个ListView
控件Virtual mode
,我尝试执行自定义绘图.项目渲染通过以下方法覆盖完成:
protected override void OnDrawItem(DrawListViewItemEventArgs eventArgs)
Run Code Online (Sandbox Code Playgroud)
如引用的问题所述,自定义绘图会在鼠标悬停事件上引入闪烁.调试器告诉我这是由于过多的自定义绘制事件被触发而发生的.
现在 - 引用问题的接受答案告诉我们:
这是.NET的ListView中的一个错误,你不能通过双缓冲解决它.
那么,这些信息有多可靠?这真的是个错误吗?或者我们可能只是试图切断部分消息并希望它不会改变可见行为?
这是真的,如果我有我的所有者绘制例程ListView
in in Virtual Mode,
我可以抑制这些Custom Draw
事件并且只执行我的绘图WM_PAINT
或者,也许,这在某些情况下是不正确的?
System.Windows.Forms
控制能够在WM_PAINT
不改变其初始行为的情况下完成所有绘画的前提条件是什么?
我使用Delphi 2007.我有一个TListView
with OwnerData
并OwnerDraw
设置为True.ViewStyle
设置为vsReport
.
我有一个record
.
type TAList=record
Item:Integer;
SubItem1:String;
SubItem2:String;
end;
var
ModuleData: array of TAList;
procedure TForm1.ListView3Data(Sender: TObject; Item: TListItem);
begin
Item.Caption := IntToStr(ModuleData[Item.Index].Item);
Item.SubItems.Add(ModuleData[Item.Index].SubItem1);
Item.SubItems.Add(ModuleData[Item.Index].SubItem2);
end;
procedure TForm1.ListView3DrawItem(Sender: TCustomListView; Item: TListItem; Rect: TRect; State: TOwnerDrawState);
var
LIndex : integer;
LRect: TRect;
LText: string;
TTListView: TListView;
begin
TTListView := TListView(Sender);
if (Item.SubItems[0] = '...') then
begin
TTListView.Canvas.Brush.Color := clHighlight;
TTListView.Canvas.Font.Color := clHighlightText;
end else
begin
TTListView.Canvas.Brush.Color := TTListView.Color;
TTListView.Canvas.Font.Color …
Run Code Online (Sandbox Code Playgroud) 我在C#中使用ListView来制作网格.我想找到一种能够以编程方式突出显示特定单元格的方法.我只需要突出显示一个单元格.
我已尝试使用所有者绘制的子项目,但使用下面的代码,我得到突出显示的单元格,但没有文字!有关于如何使其工作的任何想法?谢谢你的帮助.
//m_PC.Location is the X,Y coordinates of the highlighted cell.
void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e)
{
if ((e.ItemIndex == m_PC.Location.Y) && (e.Item.SubItems.IndexOf(e.SubItem) == m_PC.Location.X))
e.SubItem.BackColor = Color.Blue;
else
e.SubItem.BackColor = Color.White;
e.DrawBackground();
e.DrawText();
}
Run Code Online (Sandbox Code Playgroud) 我的DrawMode设置为OwnerDrawText并上涨到DrawNode事件,加入我的代码绘制文本的方式我想和所有的作品以及保存的一些奇怪的黑色选择当选择一个节点突出.
没问题,我添加了逻辑来检查节点的状态是否突出显示并绘制了我自己的突出显示,除了在单击节点时添加黑色突出显示,而不仅仅是选中...一旦鼠标按钮突出显示我的矩形突出显示被释放但确实被吸引并眨眼......这很烦人.:/
显然我忘了真的问我的问题......如果没有完全处理绘图,怎么会去除选择?
我有一个连接到远程服务器的应用程序,并在需要时轮询数据.它有一个TreeView,其中节点表示可用的对象,文本的颜色表示数据是否已加载; 灰色斜体表示未加载,黑色,常规文本被加载.
目前我已将TreeView设置为OwnderDrawText并使TreeView.DrawNode函数简单地绘制文本,如下所示:
private void TreeViewDrawNode(object sender, DrawTreeNodeEventArgs e)
{
if (!e.Node.IsVisible)
{
return;
}
bool bLoaded = false;
if (e.Bounds.Location.X >= 0 && e.Bounds.Location.Y >= 0)
{
if(e.Node.Tag != null)
{
//...
// code determining whether data has been loaded is done here
// setting bLoaded true or false
//...
}
else
{
e.DrawDefault = true;
return;
}
Font useFont = null;
Brush useBrush = null;
if (bLoaded)
{
useFont = e.Node.TreeView.Font;
useBrush = SystemBrushes.WindowText;
}
else
{
useFont …
Run Code Online (Sandbox Code Playgroud) 我正在使用该GraphicsPath.AddString()
函数,但它在文本周围绘制了一些空格.任何想法如何绘制没有填充的字符串,只有文本的路径?
我的代码是这样的:
GraphicsPath gp = new GraphicsPath();
gp.AddString(text, font.FontFamily, (int)font.Style, font.Size,
boundsRectangle, format);
g.DrawPath(pen, gp);
Run Code Online (Sandbox Code Playgroud) 如何使用C#(Windows窗体)启用控件的双缓冲?
我有一个面板控件,我正在绘制内容,也是一个所有者绘制的选项卡控件.两者都有闪烁,所以如何启用双缓冲?
我正在TTreeView
使用OnAdvancedCustomDrawItem
事件从头开始自定义绘图,我想知道如何在我的所有者绘制项目的背景中正确渲染这些选择和热矩形?它们是Vista/7风格,所以我不能简单地用一些纯色填充背景.
我试图在cdPostPaint
舞台上绘制我的项目,但是如果我DefaultDraw := True
在cdPrePaint
舞台上离开以绘制选择背景,则会发生完整的默认绘图,包括项目文本.
procedure TForm1.TreeView1AdvancedCustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; Stage: TCustomDrawStage; var PaintImages,
DefaultDraw: Boolean);
begin
case Stage of
cdPreErase:
begin
DefaultDraw := True;
end;
cdPostErase:
begin
DefaultDraw := True;
end;
cdPrePaint:
begin
// I thought this will paint only the selected/hot backgrounds,
// however this will paint whole item, including text.
DefaultDraw := True;
end;
cdPostPaint:
begin
DefaultDraw := False;
// painting my owner-draw text
// ......... …
Run Code Online (Sandbox Code Playgroud)