C# Graphics 问题

publicvoidunion_grid(DataGridViewgrid1,introw,intcol,intright,intdown,stringcontant){... public void union_grid(DataGridView grid1,int row,int col,int right,int down,string contant)
{

Brush gridBrush = new SolidBrush(grid1.GridColor),
backColorBrush = new SolidBrush(grid1.BackgroundColor);
// e.Graphics.FillRectangle(backColorBrush, e.CellBounds);
DataGridViewCellPaintingEventArgs e;

Rectangle rect = grid1.GetCellDisplayRectangle(col, row, false);
Rectangle rect_right = grid1.GetCellDisplayRectangle(col+right, row, false);//要合并的最右边单元格的坐标
Rectangle rect_down = grid1.GetCellDisplayRectangle(col, row+down, false);//要合并的最下方单元格的坐标

//----------------------------------------------------------------------------------------------------

// pictureBox10.Location = new Point(rect.Right - pictureBox10.Width - 1, rect.Y);
grid1.Graphics.FillRectangle(backColorBrush, rect.Top, rect.Left, rect_right.Right - rect.Left, rect_down.Bottom - rect.Top);

}
代码如上;
grid1.Graphics.FillRectangle//此句有问题该如何修改?
最终目的是自己写函数重绘datagridview.
展开
 我来答
ggyy0516
2009-08-19 · TA获得超过284个赞
知道小有建树答主
回答量:93
采纳率:0%
帮助的人:133万
展开全部
问题应该出在你的e上面,这个e里面有你datagridview的单元格信息,包括行索引,列索引等等,如果你想将重绘做成一个函数,那么这个DataGridViewCellPaintingEventArgs变量e应该是做为参数来自拟的重绘事件,比如datagridview_CellPainting等等,有了这个信息,你才能取得e.CellBounds等信息...
另外使用完画刷(brush),画笔后一定要释放回收,损耗太大了...
这一段是我的重绘,拆分单元格
/// ---------------------------------------------------------------------------------------
/// <summary>
/// 重绘dataGridView函数
/// </summary>
/// <param name="arrayList">
/// 重绘单元格内绘制的文字内容 :ArrayList[]
/// </param>
/// <param name="e">
/// 系统变量 :DataGridViewCellPaintingEventArgs
/// </param>
/// ---------------------------------------------------------------------------------------
private void ReDrawDatagridView(List<ArrayList> arrayList, DataGridViewCellPaintingEventArgs e)
{
//使用刷子
using (
Brush gridBrush = new SolidBrush(dgvOperation.GridColor),
backColorBrush = new SolidBrush(e.CellStyle.BackColor))
{
//使用画笔
using (Pen gridLinePen = new Pen(gridBrush))
{
// 擦除原单元格背景
e.Graphics.FillRectangle(backColorBrush, e.CellBounds);
//绘制线条,这些线条是单元格相互间隔的区分线条

for (int i = 0; i < this.dgvOperation.Rows.Count; i++)
{
if (e.RowIndex == i)
{
for (int j = 0; j < (int)accountCountArray[i]; j++)
{
//下边缘的线

e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left,
e.CellBounds.Bottom - ((e.CellBounds.Height / (int)accountCountArray[i]) * j),
e.CellBounds.Right - 1,
e.CellBounds.Bottom - ((e.CellBounds.Height / (int)accountCountArray[i]) * j));
//重绘金额栏的情况
if (e.ColumnIndex == 6 || e.ColumnIndex == 7)
{
float moneyWeight = 96 / (72 / e.CellStyle.Font.Size);
//画金额
e.Graphics.DrawString(arrayList[i][j].ToString(), e.CellStyle.Font, Brushes.Black,
e.CellBounds.Right - (arrayList[i][j].ToString().Length) * (int)(moneyWeight / 2)
- (int)(moneyWeight / 2), e.CellBounds.Y + 20 * j + 5, StringFormat.GenericDefault);
}
else
{
//画文字

e.Graphics.DrawString(arrayList[i][j].ToString(), e.CellStyle.Font, Brushes.Black,
e.CellBounds.X, e.CellBounds.Y + 20 * j + 5, StringFormat.GenericDefault);
}
}

//底

e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left, e.CellBounds.Bottom - 1,
e.CellBounds.Right, e.CellBounds.Bottom - 1);
}
}

//右侧的线
e.Graphics.DrawLine(gridLinePen, e.CellBounds.Right - 1, e.CellBounds.Top,
e.CellBounds.Right - 1, e.CellBounds.Bottom - 1);

e.Handled = true;
}
}
}
钊惠夹谷以晴
2020-02-02 · TA获得超过3792个赞
知道小有建树答主
回答量:3087
采纳率:25%
帮助的人:431万
展开全部
1
Graphics类
怎么让字
旋转?
设置Graphics的变换矩阵,具体如下:
在老式的Windows图形设备接口中制作旋转文字会是一件痛苦费力的工作,但在.NET中它会变得很简单。
by
Bill
Wagner
图1.在.NET中旋转文字
还记得在典型的Windows程序中用GDI(一种老式的图形设备API)来实现文字旋转是件多么麻烦的事吗?首先你得设置旋转字体

它只能在几种平台下实现。而当你想要将文字居中显示的时候会更麻烦,因为显示该段文字大小的函数对旋转字体不起作用。你必须将文字水平放置,再测量其大小,然后建一个新的旋转字体,最后把它画出来。
使用GDI+会大大地简化操作过程。Microsoft在新的图形设备接口实现中创建了一种一致的图形模型,它通过一套C++类来实现。
我写了一个简单的例子来说明用GDI+实现文字旋转是多么地容易。在例子中我把文字画在窗体的中间位置,它能够以任何角度进行旋转。GDI+中的两个特性使绘制过程变得简单:图形平移(graphics
translations)和图形旋转(graphics
rotations)。
要将文字居中显示,只需转换坐标系(coordinates)使原点(origin)置于窗体的中间位置:
Size
sz
=
MyWindow.Size;
Point
Middle
=
new
Point
(sz.Width
/
2,
sz.Height
/
2);
e.Graphics.TranslateTransform
(Middle.X,
Middle.Y);
通过继续变换来实现简单的旋转:
e.Graphics.RotateTransform
(_angle);
当位置调整好以后,你就可以绘制文字了:
StringFormat
format
=
new
StringFormat
(StringFormatFlags.NoClip);
format.Alignment
=
StringAlignment.Center;
format.LineAlignment
=
StringAlignment.Center;
e.Graphics.DrawString
("A
simple
TextString
",
f,
Brushes.Black,
0,
0,
format);
StringFormat对象控制着该字符串的对齐方式。这里,我选中了居中位置。
现在你能够以任何角度旋转字体了。在运行这段代码时,你会发现当它旋转到正45度角的时候,看起来却像是负45度角(见图1)。记住在GDI中标准的坐标系是y坐标向下的,在这种坐标系上,正角度的旋转是沿水平轴顺时针旋转的。
从这个例子可以看出,使用.NET的GDI+
API使得图形处理变得更简单更一致。点此下载源代码并修改转换角度。你会发现你能够以任何角度在任何平台绘制文字,这同样适用于以任何角度旋转任何其他形状的图形。
2
如何清除
FORM类上画的线?
没找到
-
-!
Graphics.Clear(...);
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式