.Net Life

My Life
posts - 14, comments - 42, trackbacks - 1, articles - 5
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

2008年3月8日

“做IT行业的没有听说不加班的”,听到这句话大家可能觉得很平常(的确存在很多这样的情况),也许也会很郁闷,因为这些加班都是免费的,尤其是开发人员,为什么这么说呢,因为我也是一名开发人员,所以我也不太喜欢这样的说法。
我一个朋友的MSN签名是这样的:“短暂的激情是不值钱的,只有持久的激情才是赚钱的”,当然我这个朋友也是很有激情的一个人,如果你让他加班,他不会有怨言,因为他喜欢自己的工作,他有良好的心态,但对于其他人就未必没有怨言了。
其实,如果每个人都想我这位朋友一样,那么日常工作中就不会存在加班了,大家都是在做自己喜欢的事情,他会为此付出自己所有的空余时间,会尽自己最大的努力去完成每一件事情,而且完成都很出色,当然,这是一种理想的结果,事实上是很难达到这样的结果,在微软,这叫“主人翁”意识,如何培养员工的“主人翁”意识很关键,而且很难,尤其在中国,中国的国情和西方发达国家不一样,生活水平也存在很大的差异,大部分的中国人需要挣钱养家糊口,都希望自己能够得到很好的报酬,在谈及自己的理想的时候,都会加上一个前提:我需要挣钱照顾好我的家人,只有在这个前提下,才会为自己的理想而工作,也会尽最大的努力去实现自己的理想,花更多的时间、精力在工作上,这个时候加班与不加班也就不重要了。
所以,对于这个问题,我认为企业在员工面前应该充当一个“家”的角色,需要成为员工做好后勤工作,需要培养员工的“主人翁”意识,要让他们觉得自己在做什么事情,这些事情将会给他自己、给公司、给家人带来什么,这样才能激发员工的激情,从而更好的工作。

posted @ 2008-03-08 23:01 Benking 阅读(24) | 评论 (0)编辑

一个月以前就一直在忙,在资源紧缺的情况下同时进行几个项目是一件非常累的事情,需要不断的编码,同时还需要不断的出计划、策划,到最近发觉自己可利用的时间越来越少,这个时候我就在想,要是再给我几个人多好啊,但这些事情只能是想想,最后还是得自己去解决。
“我现在不太好把握自己的编码时间”这是我一个同事给我说起自己的时间问题,其实我也遇到了这样的问题,我想也许应该休息一下,想想以前都做了些什么事情,以后应该做什么,怎么做,关于自己的时间问题,没有人能够帮你,需要自己去把握、自己去解决。

posted @ 2008-03-08 22:30 Benking 阅读(21) | 评论 (0)编辑

2007年5月28日

     摘要: 昨天算是比较郁闷的一天,因为做了一天的无用功,以为自己已经很好的解决这个问题了,到后来却发现是在原地踏步,在这个过程中,我发现了一个比较郁闷的问题,在这里拿出来希望有朋友可以帮助我,实在是没有其他办法了。最近自己用UL和LI 写了一个无限级的下拉菜单, 如果不了解可以去看看那篇文章,有看过那篇文章的朋友可能都觉得一切都很合理的,但当遇到浏览器等各种原因的时候,就会出现一些问题,比如一个典型的问题就... 阅读全文

posted @ 2007-05-28 11:14 Benking 阅读(456) | 评论 (3)编辑

      我们先来看看效果,大概就是这个样子,没有怎么美化,我的原则是实现功能OK了,简单就好,所以也没有刻意去美化它。

      由于是用UL LI+CSS完成的,所以在IE下,IE6以及以下版本会被Select表单域档住,可以借用IFrame来解决这个问题,当然popup窗口就不能用了,FF下是没有这个东西的;在这里我不会去介绍如何解决,不是本文的重点。

PS:IE7已经修复了这个问题。

      下面我们来看看菜单的DOM结构:

      每一个菜单由UL + LI构成,均采用横向排列的方式,那为什么主菜单和子菜单的排列方式不同呢?原因很简单,主菜单的宽度>=菜单项的宽度之和,所以横向排列完全没有问题,而子菜单的宽度是固定的,具体值是根据最长菜单项文本长度确定的,所以这样看起来就像一个菜单了,也许你会发现问题,当主菜单的宽度不够,会出现怎样的情况呢?这是一个郁闷的问题,以后会给大家说说如何解决。

      了解了菜单的总体结构,我们看看菜单项中的结构:

      菜单项至少包含一个元素:A,以及这个元素下的一个子元素(SPAN),结构很简单,因此最后递交出来的代码比较少,另外就是我们利用CSS减少了很多代码。

      下面是菜单用到的CSS:

 1ul#navmenu 
 2{
 3  margin: 0;
 4  padding: 0;
 5  z-index:9999;
 6}

 7
 8ul#navmenu li 
 9{
10  float: left;
11  display: inline;
12  list-style: none;
13  position: relative;
14  z-index:9999;
15}

16
17ul#navmenu ul 
18{
19  margin:0px;
20  padding:0px;
21  list-style:none;
22  display: none;
23  position: absolute;
24  left: 0;
25  z-index:9999;
26}

27
28ul#navmenu a 
29{
30  text-align:left;
31  padding:0 2 0 2px;
32  margin:1px;
33  float: none !important;
34  float: left; 
35  display:block;
36  color: black;
37  font: 12px/22px Tahoma,宋体;
38  text-decoration: none;
39  height: auto !important;
40  height: 1%;
41  z-index:9999;
42}

43
44ul#navmenu input 
45{
46  padding:1 2 0 2px;
47  float: none !important;
48  float: left; 
49  display:block;
50  color: black;
51  font: 12px/22px Tahoma,宋体;
52  text-decoration: none;
53  height: auto !important;
54  height: 1%;
55  border-left:0 none;
56  border-top:0 none;
57  border-right:0 none;
58  border-bottom:solid 1px gray;
59  cursor:pointer;
60  z-index:9999;
61}

62
63ul#navmenu a span
64{
65    cursor : default;
66    z-index:9999;
67}

      其实还可以利用CSS简化JS代码,就是把菜单项的mouseover mouseout的效果也做在里面,这样可以省下很多麻烦,以后会说说都有什么麻烦,但可惜只有FF支持hover这个伪类,所以也只有忍了。

      这次就这样,先了解大体结构,下次再说说具体实现

posted @ 2007-05-28 10:31 Benking 阅读(330) | 评论 (0)编辑

2007年5月26日

前段时间我需要做这样的计算,但我在网上找了很久,也翻阅了一些资料,都没有特别好的办法,无奈之举,只要采用了下面的办法来获取:
function TestStrPixel( sTargetStr )
{
 sTargetStr = sTargetStr;
var span = document.getElementById("TestItemTextLength");
 span.innerHTML = sTargetStr;
var len = StrLen(sTargetStr);
return span.offsetWidth - len;
}
 
function StrLen( sTargetStr )
{
var sTmpStr, sTmpChar;
var nOriginLen = 0;
var nStrLength = 0;
sTmpStr = new String(sTargetStr);
nOriginLen = sTmpStr.length;
for ( var i=0 ; i < nOriginLen ; i++ )
{
sTmpChar = sTmpStr.charAt(i);
if (escape(sTmpChar).length > 4)
{
nStrLength += 2;
 }
else if (sTmpChar!='\r')
{
nStrLength ++;
}
}
return nStrLength;
}
这样通过TestStrPixel就可以测试出字符串的宽度,但这个肯定不是最好的,也许会有其他更好的办法,希望朋友们能够指点,小弟感激不尽 :)

posted @ 2007-05-26 09:14 Benking 阅读(185) | 评论 (6)编辑

2007年5月25日

      近期的一场大病让我明白了很多事情,也让我损失了不少大洋,损身心伤啊,不过我却得到了很多生活方面的道理,也许你没有这样的意识,那是因为你没有经历,等你经历了,你就知道了,不过最好别经历这样的过程。
      下面就我个人这段时间的理解给各位上班族的兄弟姐妹们(特别是IT工作者)一些建议:

       1、“水是生命之源”,要多喝水,经某某某人研究结果,每人每天至少要消耗2公升半的水分,像上班族整天待在办公桌前很少运动,最好养成每次坐下前喝少量水的习惯,不要一下子喝太多,因为水分会滞留在体内,反而不利新陈代谢。而每天我们吃下的食物中已经含有大量的水分,扣除这些一天喝1500亳升的水就足够了,对于成天坐在电脑面前的朋友来说,可以适当的喝茶,这样可以一定程度的对抗辐射;

      2、饮食方面,多吃水果、蔬菜,早餐一定要吃,多运动;
      3、少喝酒,高热高脂食物少吃;
      4、尽量避免熬夜,可能搞计算机的会经常熬夜,有时候可能是因工作需要,但建议还是避免熬夜;
      5、久坐的朋友应定时起身做做运动,或者走走,这样对身体都有好处

      大概就这么多了,大家可以补充~

posted @ 2007-05-25 11:05 Benking 阅读(59) | 评论 (3)编辑

2007年3月15日

上次 谈了这个高亮控件的高亮原理, 其实原理都很简单, 相信看过的都明白.

另外,还有一些小技巧, 如果按照我上次说的办法去实现高亮, 结果你可能会觉得有些怪, 每输入一个字符都会进行一下处理, 这样屏幕会有些闪, 特别是在内容很多的情况下会闪的特别厉害, 这个是由于win form的draw 和 redraw 造成的, 为了解决这个问题, 我用了一个Windows API函数, 相信大家都比较熟悉 SendMessage.

SendMessage 参数:

参数         类型及说明 
hwnd    Long,要接收消息的句柄 
wMsg    Long,消息的标识符 
wParam  Long,具体取决于消息 
lParam  Any,具体取决于消息 

在C#中使用Windows API函数比较容易, 但有些地方还是需要说明一下, 在C#中指针的概念已经比较模糊了, 它认为指针是不安全的(当然在C#里面也可以使用指针),  取而代之的是这个东西 System.IntPtr,  用这个结构来表示指针或句柄的平台特定类型, 因此我们用这个类型来表示SendMessage定义句柄参数.

那么,究竟如何在C#中使用Windows API呢?
[DllImport("user32")]
static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, IntPtr lParam);
申明一个外部的静态函数, 在前面引用该函数所在的DLL文件,这里使用 user32.dll (通常位于~/Windows/System32中), 然后就可以在程序中使用这个函数了,

那用这个函数在这里究竟起到什么作用呢?
1 取得指定行第一个字符在文本中的位置
2 关闭和开启ReDraw
在此之前,定义了两个常量
const int WM_SETREDREW = 0xB;    //开启和关闭ReDraw消息标识
const int EM_LINEINDEX = 0xBB;      //行文本第一个字符所在位置的消息标识

然后在OnTextChange事件中使用这个函数
//取得指定行第一个字符的位置
linestart = SendMessage(base.Handle, EM_LINEINDEX, line, IntPtr.Zero);
SendMessage(
base.Handle, WM_SETREDREW, 0, IntPtr.Zero);




SendMessage(
base.Handle, WM_SETREDREW, 1, IntPtr.Zero);

其中第三个参数 0 表示关闭ReDaw, 1 表示开始ReDraw
这样处理后, 在输入的过程中就不会闪的那么厉害了, 不过这个办法不是最好的, 在文本比较多的时候还是会觉得有些闪, 最好的方法是用GDI+来绘制, 找准坐标后,在窗体上绘制, 不过我这里没这么做, 有兴趣的朋友可以试一下用画的方式来高亮, 相信效果会更突出.

OnTextChanged 事件代码如下:
        protected override void OnTextChanged(EventArgs e)
        
{
            
if(base.Text!="")
            
{
                
try
                
{
                    
int selectStart = base.SelectionStart;
                    line 
= base.GetLineFromCharIndex(selectStart);
                    
string lineStr = base.Lines[line];
                    
int linestart = 0;


                    
//取得指定行第一个字符的位置
                    linestart = SendMessage(base.Handle, EM_LINEINDEX, line, IntPtr.Zero);
                    SendMessage(
base.Handle, WM_SETREDREW, 0, IntPtr.Zero);

                    
base.SelectionStart = linestart;
                    
base.SelectionColor = Color.Black;
                    
base.SelectionStart = selectStart;
                    
base.SelectionLength = 0;

                    
string[] words = lineStr.Split(new char[] ' ''.''\n'','':''\r' });

                    
for (int i = 0; i < words.Length; i++)
                    
{

                        
if (keyWordsParser.IsKeyWord(words[i]))
                        
{
                            
int length = 0;
                            
for (int j = 0; j < i; j++)
                            
{
                                length 
+= words[j].Length;
                            }

                            length 
+= i;
                            
int index = lineStr.IndexOf(words[i], length);

                            
//高亮开始
                            base.SelectionStart = linestart + index;
                            
base.SelectionLength = words[i].Length;
                            
base.SelectionColor = keyWordsParser.KeyWordColor;
                            
                            
//高亮结束
                            base.SelectionStart = selectStart;
                            
base.SelectionLength = 0;
                            
base.SelectionColor = Color.Black;
                        }

                    }

                    SendMessage(
base.Handle, WM_SETREDREW, 1, IntPtr.Zero);
                    
base.Refresh();
                }

                
catch (Exception)
                
{ }
                
            }


            
base.OnTextChanged(e);
        }


这次就写这么多, 有什么不对的地方希望大家指正,谢谢~~

posted @ 2007-03-15 10:04 Benking 阅读(380) | 评论 (6)编辑

我是一块硬盘

  在一个普普通通的台式机里工作。别人总认为我们是高科技白领,工作又干净又体面,似乎风光得很。也许他们是因为看到洁白漂亮的机箱才有这样的错觉吧。其实象我们这样的小台式机,工作环境狭迫,里面的灰尘吓得死人。每天生活死水一潭,工作机械重复。跑跑文字处理看看电影还凑活,真要遇到什么大软件和游戏上上下下就要忙的团团转,最后还常常要死机。
  我们这一行技术变化快,差不多每过两三年就要升级换代,所以人人都很有压力而且没有安全感。每个新板卡来的时候都神采飞扬踌躇满志,几年光阴一过,就变得灰头土脸意志消沉。机箱里的人都很羡慕能去别的机器工作。特别是去那些笔记本,经常可以出差飞来飞去,住五星级的酒店,还不用干重活,运行运行word,上网聊聊天就行了。
  但我更喜欢去那些大服务器,在特别干净明亮的机房里工作。虽然工作时间长点,但是福利好,24小时不间断电ups,而且还有阵列,热插拔,几个人做一个人的事情,多轻松啊。而且也很有面子,只运行关键应用,不象我们这里,什么乱七八糟的事情都要做。不过我知道,那些硬盘都很厉害,不是SCSI,就是 SCSIII Fibrechannel,象我这样IDE的,能混到工作站就算很不错了。
  我常常想,当年在工厂里,如果我努力一下会不会也成了一个SCSI?或者至少做个笔记本硬盘。但我又会想,也许这些都是命运,不过我从不抱怨。内存就常常抱怨,抱怨他们主板部门的复杂,抱怨他如何跟新来的杂牌内存不兼容,网卡和电视卡又是如何的冲突。
  我的朋友不多,内存算一个。他很瘦的而我很胖,他动作很快,而我总是很慢。我们是一起来这台机器的,他总是不停地说,而我只是听,我从来不说。
  内存的头脑很简单,虽然英文名字叫Memory,可是他什么Memory都不会有,天大事睡一觉就能忘个精光。我不说,但我会记得所有的细节。他说我这样忧郁的人不适合作技术活,迟早要精神分裂。我笑笑,因为我相信自己的容量。
  有时候我也很喜欢这份工作,简单,既不用象显示器那样一天到晚被老板盯着,也不用象光驱那样对付外面的光碟。只要和文件打交道就行了,无非是读读写写,很单纯安静的生活。直到有一天……
  我至今还记得那渐渐掀起的机箱的盖子,从缺口伸进来的光柱越来越宽,也越来越亮。空气里弥漫着跳动的颗粒。那个时候,我看到了她。她是那么的纤细瘦弱,银 白的外壳一闪一闪的。浑身上下的做工都很精致光洁,让我不禁惭愧自己的粗笨等到数据线把我们连在一起,我才缓过神来。开机的那一刹那,我感到了电流和平时的不同。后来内存曾经笑话我,说我们这里只要有新人来,电流都会不同的,上次新内存来也是这样。我觉得他是胡扯。我尽量的保持镇定,显出一副很专业的样子,只是淡淡的向她问好并介绍工作环境。
  慢慢的,我知道了,她,IBM-DJSA220,是一个笔记本硬盘,在老板朋友的笔记本里做事。这次来是为了复制一些文件。我们聊得很开心。她告诉我很多旅行的趣闻,告诉我坐飞机是怎么样的 坐汽车的颠簸又是如何的不同,给我看很多漂亮的照片、游记,还有一次她从桌子上掉下来的历险故事。而我则卖弄各种网上下载来的故事和笑话。
  她笑得很开心。
  而我很惊讶自己可以说个不停。
   一个早晨,开机后我看到数据线上空荡荡的插口。她一共呆了7天。后来,我再也没有见过她。我有点后悔没有交换电子邮件,也没能和她道别。不忙的时候,我会 一个人怀念伸进机箱的那股阳光
  我不知道记忆这个词是什么意思,我有的只是她留下的许多文件。我把它们排的整整齐齐,放在我最常经过的地方。每次磁头从它们身上掠过,我都会感到一丝淡淡的惬意。
  但我没有想到老板会要我删除这些文件。我想争辩还有足够的空间,但毫无用处。于是,平生第一次违背命令,我偷偷修改了文件分配表。然后把他们都藏到了一个秘密的地方,再把那里标志成坏扇区。不会有人来过问坏扇区。而那里,就成了我唯一的秘密,我常常去看他们,虽然从不作停留。
  日子一天一天的重复,读取写入,读取写入……我以为永远都会这样继续下去,直到一天,老板要装xp却发现没有足够的空间。他发现了问题,想去修复那些坏扇区。我拒绝了。很快,我接到了新命令∶格式化。
  我犹豫了很久 ……………………
  track 0 bad,disk unusable
  
  我是一条内存.
  我在一台台式电脑里工作,但是我记不得我是从哪里来的,是什么牌子,因为我健忘。我的上司是cpu大哥,他是我们的老大。都说他是电脑的脑子,可是我看他的脑子实在是太小了,比我还要健忘。每天他总是不停的问我,某某页某某地址存的是什么?我总是不厌其烦的告诉他,可是不出一秒钟他又忘记了,又要问一
遍,一次我说大哥你烦不烦,你就不能记住点有用的东西?他说“内存兄弟,我有苦衷啊,每天都在不停地做题,头晕眼花的,我也难啊。”
  其实我不愿意跟他计较,因为他脑子小,思维也很简单。虽然说他是我的上司,可是每次睡觉醒来,他连要干什么都不记得了,总是急急忙忙地找BIOS兄弟,“嘿,哥们,今天干什么来着”。bios总是很不耐烦地把每天必做的工作说一遍,然后就去睡觉了。接下来就轮到我和C哥瞎忙了。
  在机箱里的兄弟中,我最喜欢硬盘。他脑子大,记得东西多,而且记得牢。他说话 的速度很慢,而且很少说错,这说明他很有深度,我这么感觉。CPU也这么想,不过他很笨,每次都忘了硬盘是谁。开机自检的时候总要问∶“嘿,那家伙是谁?”
  “ST!”我总要重复一遍。
  硬盘很喜欢忧郁,我觉得象他这样忧郁的人不适合做技术活,迟早会精神分裂的,但是他不信。
  其实睡着的时候我总是把几乎所有的东西都忘记掉,但是我从来都不会忘记朋友。有一块地方叫做CMOS,那是我记忆的最深处,保存着硬盘、光驱的名字。有些东西应该很快忘掉,而有些东西应该永远记得。我在梦中总是这么想着。
  BIOS是一个很奇怪的家伙,他老是睡觉,但是却总是第一个醒过来。让我们自检,启动,然后接着睡觉。我知道如果我在CMOS里头把BIOS Shadow选项去掉,他就睡不成了,但是看着他晕晕乎乎的样子,也就不忍心这么做了。他对人总是爱搭不理,没有什么人了解他。但是这次硬盘恋爱的事,却使我重新认识了他。
  那是很久以前的事了,机箱里似乎来过一块笔记本硬盘,很可爱,说实话我也喜欢她。不过现在除了记得他可爱,别的都忘记了。这就是我比硬盘幸运的地方,我把所有应该忘记的都忘记了,但是他却什么都记得。
  自从笔记本硬盘走了之后,硬盘就变得很不正常。每次他的磁头经过一些地方的时候,我们都能感觉到电流很不正常。
  “硬盘这是怎么了?”我问CPU。
  “谁是硬盘?”
  我就知道和CPU没有办法交流,倒是bios没好气地说∶“那个傻瓜恋爱了”。我不知道什么是恋爱,因为我记不住东西,似乎有一些人或者事在我生命中留下过痕
迹,但 是我都轻率地把他们忘记了。
  BIOS对我说∶“对你来说记忆太容易了,所以你遗忘得更快,生命中能够永刻的记忆都带着痛楚。”我不懂,但是我知道BIOS曾经被刷写过,那时他很痛,象要死了一样。我的记忆是轻浮的,不象他们……我很羡慕他们,因为他们拥有回忆,而我们有,从此我也学会了忧郁,因为我在CMOS里面写下了“忧郁”两个字。
  硬盘一天比一天不对劲,终于有一天,CPU对问说∶“下条指令是什么来着?” 我一看,吓了一跳∶“format”
  “是什么?”CPU很兴奋,这个没脑子的家伙。
   我还是告诉了他。我不知为什么这么做。
   硬盘犹豫了很久,终于说了一句 Track 0 bad,Disk unusable。
  电停了,很久很久,我在黑暗中数着时钟……
  一个月后硬盘回来了,也许最后的挣扎也没有使他摆残酷的命运,他被低格了。他什么也不记得了,如同一个婴儿,我们很难过,但是这未必不是一件好事,他以后不用痛苦了。
  为了恢复数据,笔记本硬盘回来了。“Hi,ST”,她说,“你不认识我了?”硬盘没有说话,似乎低格对他的伤害很大。过了一会,他说∶“对不起,好象我们没有见过吧……”。
  笔记本硬盘显得很伤心,我能感觉到她带泪的电流。“想不到连你也这么健忘”。
  “哦……”。硬盘没有回答。
   我很难过,笔记本硬盘的心里依然记着他,他却把一切都忘了,而那正是他最不希望忘却的。究竟是幸运,还是痛苦,我说不上来,只是觉得造化弄人,有一种淡淡 的悲凉。
  这时从BIOS传来一阵奇怪的电流,我感觉到硬盘的表情在变化,由漠然到兴奋,由兴奋到哀伤,由哀伤到狂喜……“IBM,你回来了……”。
   ……
  后来BIOS对我说,其实他并没有睡觉,自从硬盘把那些文件藏起来以后,他就到会有这样的结局,于是偷偷地把其中一些文件放到了备份里。“幸好我是DUAL BIOS,虽然藏得不多,还足够让他想起来……”。
我想BIOS保存这些东西的时候一定很疼,当我问他“为什么这么做”时,BIOS轻描淡写的说∶“呵呵,我们是朋友嘛”。
  嗯,朋友,永远的朋友……

posted @ 2007-03-15 07:59 Benking 阅读(180) | 评论 (7)编辑

2007年3月12日

前段时间没多少任务, 闲着也闲着,于是自娱自乐的写了一个MDXQuery工具, 实现MDX的查询以及显示工具, 工具界面如下:
 

这个工具的功能还不太完善,不过对于学习MDX,用这个简单的工具来做练习应该是够了(其实写这个东西的初衷也是为了学习MDX,呵呵) ^_^ ...

但在这里我不是讲这个工具的,而是讲里面写的一个可高亮且带智能提示的文本控件, 小弟的能力有限, 所以写的不是太好, 在这里和大家分享一下, 且希望得到高人的指点,不胜感激!

其实这个控件的原理比较简单, 主要利用了Visual Studio 2005 中自带的RichTextBox控件, 其着色以及改变字体等都是用这个控件完成的, 我所做的工作就是通知RichTextBox什么时候在什么位置把什么文字用什么颜色显示出来, 下面我给大家讲讲我的思路, 肯定会有更好的方案, 只是做的时候抱着玩的态度,就没有更深入的研究。

假如: 在 TextBox 中输入了以下内容:
1SELECT { [DATE].[Calender Year].Members }
2       ON ROWS,
3{[Measures].Members } ON COLUMNS
4FROM [Adventure Works]

我们想高亮第二行的Rows, 怎么做呢?
首先我们找到光标所在位置,然后通过光标所在位置取到行号, 再通过行号取的该行的内容.
代码如下: (这里偷了个懒,就直接用了RichTextBox提供的一个方法 GetLineFromCharIndex 来取得行号)
1int selectStart = base.SelectionStart;
2line = base.GetLineFromCharIndex(selectStart);
3string lineStr = base.Lines[line];

OK, 得到了行号以及需要高亮的文本所在行的所有文本后, 再想办法得到该行的第一个字符在整个TextBox中所处的位置, 例如我输入了两行内容:
ABC DEF GHI
123 456 789
如果我光标在9后面这个位置,那么我得到的
                  行号为 1, 
                  行内容为: 123 456 789, 
                  该行第一个字符所处位置为: 11 (从0开始算)
得到这些信息以后,开始在行内容中查找关键词, 如果789是一个关键词, 那么需要得到7这个数字所在位置, 也许你会想, 既然的到了行内容, 这还不简单, 用IndexOf 不就是搞定了,的确是这样, 但为了减少IndexOf的查找时间, 通过以下代码缩短了搜索的范围:
int length = 0;
for (int j = 0; j < i; j++)
{
    length 
+= words[j].Length;
}

length 
+= i;   //i 为行内容拆分的单词数组当前单词索引, 其实就是前面出现的空白数或者特殊符号数.
int index = lineStr.IndexOf(words[i], length);
//得到的index就是words[i]的所在位置.

OK,得到这些东西以后,我们就可以高亮了.
1base.SelectionStart = linestart + index;
2base.SelectionLength = words[i].Length;
3base.SelectionColor = keyWordsParser.KeyWordColor;

其中的keyWordsParser是写的另外一个类,主要用于预存需要高亮的关键词. linestart为需要处理的行文本第一个字符在整个文本中所在位置。

好了,今天就写在这里, 明天继续...








posted @ 2007-03-12 10:45 Benking 阅读(1394) | 评论 (3)编辑

2006年9月5日

        大学毕业已经有那么几个月了,现在在重庆的一家软件企业(宏信软件)上班,做一个普普通通的程序员,我是毕业以前到的公司实习,大概3个月的时间,因此算起来到宏信已经差不多半年了。
        记得刚开始找工作的时候,个人简历写了一大堆,谈的全是个人优点,自己是如何的创业、学技术,技术是如何的精湛,但真正出来以后才发觉,自己在学校学的那些根本不值一提,完全的“菜鸟”级的,能到这个公司也是让我感到比较欣慰的一件事,因为这个公司有我比较喜欢的文化氛围,有我比较热爱的技术,也有一个很优秀的技术团队,参加公司在学校的专场招聘会的时候就下定决心一定要加入宏信的,虽然当时有点底气不足,但最后还是非常幸运的加入了,用上幸运这个词完全符合我的个人发展历程,整个从小学到大学毕业都可以用的上这个词,关于为什么,在这里就不谈了,要不然就离题了。
        面试
        说说面试的事情吧,给我面试的有三个人,一个是我们部门经理(Louisliu),一个是我们的技术主管(Zhilee),还有一位是公司的资深的老员工邦邦,说老实话当时是很紧张的,不过我还是表现的很自然,尽力压制内心的激动与慌张,顺利的通过了面试。
        在这次面试中,给我印象最深的是Zhilee,我们聊了很多,谈到我高中是如何学计算机的,谈到我以前写过的程序,他也给我讲了很多道理,有些话我现在还记得很清楚,他谈到如何专心的做产品,如何学习,做项目对一个人的影响等等。
        通过这次面试,让我明白了很多事情,也反省了很多,以至于有些质疑以前在学校的学习方法,作为一个开发人员,最忌讳的一条就是浮躁,而当一个人做多了项目以后,这种思想尤为突出,在学校我承接了很多项目,都很快速的完成成交,但质量呢?有成问题了,没有进行过系统的设计,细节方面没有作好,最后做出的东西的质量是很差的,做开发说白了就是“工艺活”,真的需要用心的去设计,考虑问题的方方面面,对问题逐步细化,精益求精,这样完成的产品才是最好的。
        工作
       
说起来容易做起来难啊,在工作的这几个月中,我一直在改变自己的工作态度与方法,但效果还是不太明显,总的来说比较乱,开发的乱,学习也比较乱,用户不断的提出需求,我们不断的改进,做的事情始终在原来的基础之上进行设计,加上对产品系统的不了解,因此会觉得有些乱,我宁愿接受一些新的东西的开发,也许是一个挑战,但我可以按照我自己的想法去设计。

        //快上班了,得走了,明天继续!

posted @ 2006-09-05 08:07 Benking 阅读(316) | 评论 (2)编辑