作成日: 2014/09/26 最終更新日: 2014/09/26
文書種別
使用方法
詳細
CellStyleクラスへの機能追加(StringFormatプロパティ、およびGetTextRectangleメソッド、GetImageRectangleメソッド)により、セル内のテキストやイメージといったコンテンツ自体の表示領域を計測し、コンテンツの周囲に線を描画するなど、装飾を施すことも可能です。
以下は、セルの値に含まれる"ああ"および"あああ"という文字のすぐ下に、波線を描画する例です。
◎サンプルコード(VB)
◎サンプルコード(C#)
以下は、セルの値に含まれる"ああ"および"あああ"という文字のすぐ下に、波線を描画する例です。
◎サンプルコード(VB)
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
''グリッドを設定します
_flex.Rows.DefaultSize = 25
_flex.Rows.Count = 4
_flex.Cols(1).Width = 150
''データを設定します
Dim img As Image = Image.FromFile("C:¥arrow.gif")
_flex.SetCellImage(1, 1, img)
_flex.SetData(1, 1, "AAAああAAAあああ")
_flex.SetData(2, 1, "AAAああAAAあああ")
_flex.SetData(3, 1, "AAABBBBAAABBBBBB")
''オーナー描画を指定します
_flex.DrawMode = DrawModeEnum.OwnerDraw
''カスタムスタイルを追加します
Dim cs As CellStyle = _flex.Styles.Add("errStyle")
cs.ForeColor = Color.LightGray
End Sub
Private Sub _flex_OwnerDrawCell(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.OwnerDrawCellEventArgs) Handles _flex.OwnerDrawCell
'' 2行1列目のセルが計測中でない場合に処理を実行します
If (Not (e.Measuring) AndAlso e.Col = 1) Then
Dim Text As String = _flex.GetDataDisplay(e.Row, e.Col)
'' "あ"が含まれているセルの値にカスタムスタイルを適用し、
'' 波線を描画します
If Text.Contains("あ") Then
'' セルを通常通り描画します
e.Style = _flex.Styles("errStyle")
e.DrawCell()
''計測する文字列を指定します
Dim ranges() As CharacterRange = {New CharacterRange(3, 2), New CharacterRange(8, 3)}
'' StringFormatを作成します
Dim sf As StringFormat = New StringFormat(e.Style.StringFormat)
''計測する文字の範囲を指定します
sf.SetMeasurableCharacterRanges(ranges)
'' セル内のテキスト部分の矩形を取得します
Dim rc As Rectangle = e.Style.GetTextRectangle(e.Bounds, _flex.GetCellImage(e.Row, e.Col))
'' 各文字範囲を計測します
Dim rgns() As Region = e.Graphics.MeasureCharacterRanges( _
Text, e.Style.Font, rc, sf)
'' 各文字列の下に赤い波線を描画します
For Each rgn As Region In rgns
rc = Rectangle.Truncate(rgn.GetBounds(e.Graphics))
Dim pt As Point = New Point(rc.X, rc.Bottom)
While (pt.X + 2 < rc.Right)
e.Graphics.DrawLines(Pens.Red, New Point() { _
New Point(pt.X, pt.Y), _
New Point(pt.X + 2, pt.Y - 2), _
New Point(pt.X + 4, pt.Y)})
pt.X += 4
End While
Next
End If
End If
End Sub
''グリッドを設定します
_flex.Rows.DefaultSize = 25
_flex.Rows.Count = 4
_flex.Cols(1).Width = 150
''データを設定します
Dim img As Image = Image.FromFile("C:¥arrow.gif")
_flex.SetCellImage(1, 1, img)
_flex.SetData(1, 1, "AAAああAAAあああ")
_flex.SetData(2, 1, "AAAああAAAあああ")
_flex.SetData(3, 1, "AAABBBBAAABBBBBB")
''オーナー描画を指定します
_flex.DrawMode = DrawModeEnum.OwnerDraw
''カスタムスタイルを追加します
Dim cs As CellStyle = _flex.Styles.Add("errStyle")
cs.ForeColor = Color.LightGray
End Sub
Private Sub _flex_OwnerDrawCell(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.OwnerDrawCellEventArgs) Handles _flex.OwnerDrawCell
'' 2行1列目のセルが計測中でない場合に処理を実行します
If (Not (e.Measuring) AndAlso e.Col = 1) Then
Dim Text As String = _flex.GetDataDisplay(e.Row, e.Col)
'' "あ"が含まれているセルの値にカスタムスタイルを適用し、
'' 波線を描画します
If Text.Contains("あ") Then
'' セルを通常通り描画します
e.Style = _flex.Styles("errStyle")
e.DrawCell()
''計測する文字列を指定します
Dim ranges() As CharacterRange = {New CharacterRange(3, 2), New CharacterRange(8, 3)}
'' StringFormatを作成します
Dim sf As StringFormat = New StringFormat(e.Style.StringFormat)
''計測する文字の範囲を指定します
sf.SetMeasurableCharacterRanges(ranges)
'' セル内のテキスト部分の矩形を取得します
Dim rc As Rectangle = e.Style.GetTextRectangle(e.Bounds, _flex.GetCellImage(e.Row, e.Col))
'' 各文字範囲を計測します
Dim rgns() As Region = e.Graphics.MeasureCharacterRanges( _
Text, e.Style.Font, rc, sf)
'' 各文字列の下に赤い波線を描画します
For Each rgn As Region In rgns
rc = Rectangle.Truncate(rgn.GetBounds(e.Graphics))
Dim pt As Point = New Point(rc.X, rc.Bottom)
While (pt.X + 2 < rc.Right)
e.Graphics.DrawLines(Pens.Red, New Point() { _
New Point(pt.X, pt.Y), _
New Point(pt.X + 2, pt.Y - 2), _
New Point(pt.X + 4, pt.Y)})
pt.X += 4
End While
Next
End If
End If
End Sub
◎サンプルコード(C#)
private void Form1_Load(object sender, EventArgs e)
{
//グリッドを設定します
_flex.Rows.DefaultSize = 25;
_flex.Rows.Count = 4;
_flex.Cols[1].Width = 150;
//データを設定します
Image img = Image.FromFile(@"C:¥arrow.gif");
_flex.SetCellImage(1, 1, img);
_flex.SetData(1, 1, "AAAああAAAあああ");
_flex.SetData(2, 1, "AAAああAAAあああ");
_flex.SetData(3, 1, "AAABBBBAAABBBBBB");
//オーナー描画を指定します
_flex.DrawMode = DrawModeEnum.OwnerDraw;
//カスタムスタイルを追加します
CellStyle cs = _flex.Styles.Add("errStyle");
cs.ForeColor= Color.LightGray;
}
private void _flex_OwnerDrawCell(object sender, OwnerDrawCellEventArgs e)
{
// 2行1列目のセルが計測中でない場合に処理を実行します
if (!e.Measuring && e.Col == 1)
{
var text = _flex.GetDataDisplay(e.Row, e.Col);
// "あ"が含まれているセルの値にカスタムスタイルを適用し、
// 波線を描画します
if (text.Contains("あ"))
{
// セルを通常通り描画します
e.Style = _flex.Styles["errStyle"];
e.DrawCell();
//計測する文字列を指定します
CharacterRange[] ranges = { new CharacterRange(3, 2), new CharacterRange(8, 3) };
// StringFormatを作成します
StringFormat sf = new StringFormat(e.Style.StringFormat);
//計測する文字の範囲を指定します
sf.SetMeasurableCharacterRanges(ranges);
// セル内のテキスト部分の矩形を取得します
var rc = e.Style.GetTextRectangle(e.Bounds, _flex.GetCellImage(e.Row, e.Col));
// 各文字範囲を計測します
var rgns = e.Graphics.MeasureCharacterRanges(
text, e.Style.Font, rc, sf);
// 各文字列の下に赤い波線を描画します
foreach (var rgn in rgns)
{
rc = Rectangle.Truncate(rgn.GetBounds(e.Graphics));
for (Point pt = new Point(rc.X, rc.Bottom);
pt.X + 2 < rc.Right;
pt.X += 4)
{
e.Graphics.DrawLines(Pens.Red, new Point[]
{
new Point(pt.X, pt.Y),
new Point(pt.X + 2, pt.Y - 2),
new Point(pt.X + 4, pt.Y)
});
}
}
}
}
}
{
//グリッドを設定します
_flex.Rows.DefaultSize = 25;
_flex.Rows.Count = 4;
_flex.Cols[1].Width = 150;
//データを設定します
Image img = Image.FromFile(@"C:¥arrow.gif");
_flex.SetCellImage(1, 1, img);
_flex.SetData(1, 1, "AAAああAAAあああ");
_flex.SetData(2, 1, "AAAああAAAあああ");
_flex.SetData(3, 1, "AAABBBBAAABBBBBB");
//オーナー描画を指定します
_flex.DrawMode = DrawModeEnum.OwnerDraw;
//カスタムスタイルを追加します
CellStyle cs = _flex.Styles.Add("errStyle");
cs.ForeColor= Color.LightGray;
}
private void _flex_OwnerDrawCell(object sender, OwnerDrawCellEventArgs e)
{
// 2行1列目のセルが計測中でない場合に処理を実行します
if (!e.Measuring && e.Col == 1)
{
var text = _flex.GetDataDisplay(e.Row, e.Col);
// "あ"が含まれているセルの値にカスタムスタイルを適用し、
// 波線を描画します
if (text.Contains("あ"))
{
// セルを通常通り描画します
e.Style = _flex.Styles["errStyle"];
e.DrawCell();
//計測する文字列を指定します
CharacterRange[] ranges = { new CharacterRange(3, 2), new CharacterRange(8, 3) };
// StringFormatを作成します
StringFormat sf = new StringFormat(e.Style.StringFormat);
//計測する文字の範囲を指定します
sf.SetMeasurableCharacterRanges(ranges);
// セル内のテキスト部分の矩形を取得します
var rc = e.Style.GetTextRectangle(e.Bounds, _flex.GetCellImage(e.Row, e.Col));
// 各文字範囲を計測します
var rgns = e.Graphics.MeasureCharacterRanges(
text, e.Style.Font, rc, sf);
// 各文字列の下に赤い波線を描画します
foreach (var rgn in rgns)
{
rc = Rectangle.Truncate(rgn.GetBounds(e.Graphics));
for (Point pt = new Point(rc.X, rc.Bottom);
pt.X + 2 < rc.Right;
pt.X += 4)
{
e.Graphics.DrawLines(Pens.Red, new Point[]
{
new Point(pt.X, pt.Y),
new Point(pt.X + 2, pt.Y - 2),
new Point(pt.X + 4, pt.Y)
});
}
}
}
}
}
旧文書番号
69996