修改FastColoredTextBox控件完成选择
//判断是否是中文
public bool IsChina(char c)
{
bool BoolValue = false;
if (Convert.ToInt32(c) < Convert.ToInt32(Convert.ToChar(128)))
{
BoolValue = false;
}
else
{
return BoolValue = true;
}
return BoolValue;
}
//获取字符串中文数量
public int GetLineIsChinese(Line list)
{
int isChinese = 0;
for (int num = 0; num < list.Count;num++ )
{
if (IsChina(list[num].c))
{
isChinese++;
}
}
return isChinese;
}
//获取中文和英文差异宽度
public int GetCharDiffWidth()
{
SizeF sizef = GetCharSize(this.Font, '中');//new Font("宋体", 10)
int len = (int)sizef.Width - CharWidth;
return len;
}
//draw selection
if (!Selection.IsEmpty && lastChar >= firstChar)
{
e.Graphics.SmoothingMode = SmoothingMode.None;
var textRange = new Range(this, from + firstChar, iLine, from + lastChar + 1, iLine);
textRange = Selection.GetIntersectionWith(textRange);
if (textRange != null && SelectionStyle != null)
{
int chineseCount= GetLineIsChinese(line);
int diffWidths = GetCharDiffWidth()*chineseCount;
diffWidth = diffWidths;
SelectionStyle.Draw(e.Graphics, new Point(startX + (textRange.Start.iChar - from) * CharWidth, y),
textRange);
diffWidth = 0;
}
}
public override void Draw(Graphics gr, Point position, Range range)
{
//draw background
if (BackgroundBrush != null)
{
Rectangle rect = new Rectangle(position.X, position.Y, (range.End.iChar - range.Start.iChar) * range.tb.CharWidth+FastColoredTextBox.diffWidth, range.tb.CharHeight);
if (rect.Width == 0)
return;
gr.FillRectangle(BackgroundBrush, rect);
}
}
diffWidth 这是公共变量,放在FastColoredTextBox类的公共变量声明里面
public static int diffWidth = 0;
/*****************************/
/* 该代码用于准确定位字,主要是因为中文不能准确定位 */
/*****************************/
/// <summary>
/// Gets nearest line and char position from coordinates
/// </summary>
/// <param name="point">Point</param>
/// <returns>Line and char position</returns>
public Place PointToPlace(Point point)
{
#if debug
var sw = Stopwatch.StartNew();
#endif
point.Offset(HorizontalScroll.Value, VerticalScroll.Value);
point.Offset(-LeftIndent - Paddings.Left, 0);
int iLine = YtoLineIndex(point.Y);
int y = 0;
for (; iLine < lines.Count; iLine++)
{
y = LineInfos[iLine].startY + LineInfos[iLine].WordWrapStringsCount * CharHeight;
if (y > point.Y && LineInfos[iLine].VisibleState == VisibleState.Visible)
break;
}
if (iLine >= lines.Count)
iLine = lines.Count - 1;
if (LineInfos[iLine].VisibleState != VisibleState.Visible)
iLine = FindPrevVisibleLine(iLine);
//
int iWordWrapLine = LineInfos[iLine].WordWrapStringsCount;
do
{
iWordWrapLine--;
y -= CharHeight;
} while (y > point.Y);
if (iWordWrapLine < 0) iWordWrapLine = 0;
//
int start = LineInfos[iLine].GetWordWrapStringStartPosition(iWordWrapLine);
int finish = LineInfos[iLine].GetWordWrapStringFinishPosition(iWordWrapLine, lines[iLine]);
var x = (int)Math.Round((float)point.X / CharWidth);
x = x < 0 ? start : start + x;
if (x > finish)
x = finish + 1;
if (x > lines[iLine].Count)
x = lines[iLine].Count;
if (lines[iLine].Count > 0)
{
x = GetXWidth(lines[iLine], point.X);
}
#if debug
Console.WriteLine("PointToPlace: " + sw.ElapsedMilliseconds);
#endif
return new Place(x, iLine);
}
private Place PointToPlaceSimple(Point point)
{
point.Offset(HorizontalScroll.Value, VerticalScroll.Value);
point.Offset(-LeftIndent - Paddings.Left, 0);
int iLine = YtoLineIndex(point.Y);
var x = (int)Math.Round((float)point.X / CharWidth);
Line line = lines[iLine];
if (x < 0) x = 0;
if (line.Count > 0)
{
x = GetXWidth(lines[iLine], point.X);
}
return new Place(x, iLine);
}
//计算x轴应该显示第几个字的宽度
public int GetXWidth(Line line,int x)
{
int iChar = 0;
int len = 0;
for (int num = 0; num < line.Count; num++)
{
if (len >= x)
{
break;
}
if (IsChina(line[num].c))
{
iChar += 2;
len += (GetCharDiffWidth() + CharWidth);
}
else
{
iChar++;
len += CharWidth;
}
}
return iChar;
}
http://files.cnblogs.com/MyNameIsMT/FastColoredTextBox20140116.zip
修改FastColoredTextBox控件完成选择的更多相关文章
- Dbgrid控件多重选择的怪问题。BookMarkList,BookMark,使用书签,用的ADOQuery控件。100分送上,急阿!!!请高手帮忙!
Dbgrid控件多重选择的怪问题.BookMarkList,BookMark,使用书签,用的ADOQuery控件.100分送上,急阿!!!请高手帮忙! ( 积分: 100 )<br />p ...
- QTableView表格控件区域选择-自绘选择区域
目录 一.开心一刻 二.概述 三.效果展示 四.实现思路 1.绘制区域 2.绘制边框 3.绘制 五.相关文章 原文链接:QTableView表格控件区域选择-自绘选择区域 一.开心一刻 陪完客户回到家 ...
- 背水一战 Windows 10 (33) - 控件(选择类): ListBox, RadioButton, CheckBox, ToggleSwitch
[源码下载] 背水一战 Windows 10 (33) - 控件(选择类): ListBox, RadioButton, CheckBox, ToggleSwitch 作者:webabcd 介绍背水一 ...
- 背水一战 Windows 10 (32) - 控件(选择类): Selector, ComboBox
[源码下载] 背水一战 Windows 10 (32) - 控件(选择类): Selector, ComboBox 作者:webabcd 介绍背水一战 Windows 10 之 控件(选择类) Sel ...
- Winform中修改WebBrowser控件User-Agent的方法(已经测试成功)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...
- C# WPF 使用委托修改UI控件
近段时间在自学WPF,是一个完全不懂WPF的菜鸟,对于在线程中修改UI控件使用委托做一个记录,给自已以后查询也给需要的参考: 界面只放一个RichTextBox,在窗体启动时开起两个线程,调用两个函数 ...
- 在.net中修改Webbrowser控件的IE版本
根据32位.64位系统来分别修改对应的注册表路径的键值对,不需要重启程序. /// <summary> /// 修改Webbrowser控件模拟的IE版本 /// </summary ...
- android中动态修改ImageView控件的宽高度
本例实现了动态修改ImageView控件的宽高度,有两个按钮,一个按钮实现放大image,一个按钮实现缩小image activity_main.xml <?xml version=" ...
- 修改static控件背景颜色和文字颜色
当 static 控件或具有 ES_READONLY 风格的 edit 控件被绘制时,会向父窗口发送 WM_CTLCOLORSTATIC 消息.如果我们在窗口过程中处理该消息,就必须返回一个画刷句柄, ...
随机推荐
- python协程与异步I/O
协程 首先要明确,线程和进程都是系统帮咱们开辟的,不管是thread还是process他内部都是调用的系统的API,而对于协程来说它和系统毫无关系; 协程不同于线程的是,线程是抢占式的调度,而协程是协 ...
- 第三章 对象(JavaScript:语言精粹)
对象是属性的容器,其中每个属性都有名字和值. 3.0. 概览:对象字面量 | 检索 | 更新 | 引用 | 原型 | 反射 | 枚举 | 删除 | 减少全局变量污染 3.1. 对象字面量 ...
- [问题2015S10] 复旦高等代数 II(14级)每周一题(第十一教学周)
[问题2015S10] 设 \(A\) 为 \(n\) 阶实方阵, 证明: 存在 \(n\) 阶非异实对称阵 \(R\), 使得 \(A'=R^{-1}AR\), 即 \(A\) 可通过非异实对称阵 ...
- C++实现树的基本操作,界面友好,操作方便,运行流畅,运用模板
Ⅰ.说明: .采用左孩子右兄弟的方式,转化为二叉树来实现. .树的后根遍历与二叉树的中根遍历即有联系又有区别,请读者注意分析体会. Ⅱ.功能: .创建树并写入数据 .先根遍历树 .计算树高 .后根遍历 ...
- Arduino学习笔记二:修改LED点灯程序
看了开源社区的LED控制程序,开始上手代码编写,修改,下载以及调试,原文地址:http://www.arduino.cn/thread-1072-1-1.html,这个帖子写的比较通俗易懂. 自己移植 ...
- 读《编写可维护的JavaScript》第一章总结
第一章 基本的格式化 1.4 ① 换行 当一行长度到达了单行最大的字符限制时,就需要手动将一行拆成俩行.通常我们会在运算符后换行,下一行会增加俩个层级的缩进. // 好的做法: 在运算符后换行,第二行 ...
- [Mysql] 一些记录
1> 修改表的字段 alter table trade_market change reqype reqtype int(10) unsigned not null;alter table tr ...
- vim 简单配置
在启动vim时,当前用户根目录下的.vimrc 文件会被自动读取,该文件可以包含一些设置甚至脚本,所以,一般情况下把.vimrc 文件创建在当前用户的根目录下比较方便,即:$vi ~/.vimrc,然 ...
- js 监听窗口变化
window.onresize = function () {.....}jquery $(window).resize(function)
- 解决maven的报错
昨晚用Mars版本建maven工程,测试springboot,一路很顺畅,没有啥阻碍. 今天换了台机器,结果就不好用了,建完maven工程后,pom文件报错,该生成的代码结构也没有,更别提jar包了. ...