如下所描述的,怎么解决呢?

时间:2022-09-16 18:10:43
在浏览器控件里面比如说下面的文字,我用鼠标选中了部分文字,怎么将选取扩大到本段段
eg.例如我选中大师,则鼠标范围自动扩大到   “按时大法师分进合击就”
选取下一段的字符,则自动扩大到整段。

按时大 法师分进合击就
按时大法师法师的发生的发发按时打算发发发按时大法师法师的发生的发发按时打算发发发按时大法师法师的发生的发发按时打算发发发按时大法师法师的发生的发发按时打算发发发按时大法师法师的发生的发发按时打算发发发按时大法师法师的发生的发发按时打算发发发按时大法师法师的发生的发发按时打算发发发按时大法师法师的发生的发发按时打算发发发

10 个解决方案

#1


假如,你是鼠标,你会怎样做?
你是不是根据程序的指令,把选择范围向左扩大到上一段的结束,向右扩大到本段的结束?
有了思路就成功一了半,写程序,就是把你的动作“翻译”成计算语言。

#2


up..........................

#3


引用 1 楼 yhp1888 的回复:
假如,你是鼠标,你会怎样做?
你是不是根据程序的指令,把选择范围向左扩大到上一段的结束,向右扩大到本段的结束?
有了思路就成功一了半,写程序,就是把你的动作“翻译”成计算语言。


呵呵,看来你的建议我豁然开朗,但是按照你的想法去了做了,我不知道怎么将选取扩大到上一段的结束和本段的结束,有没有什么标记表示扩大到上一段的结束。还是我没有找到。现在我贴上我的实现代码。
如果我用的函数不对还是就是错的,麻烦朋友给指正。

    VARIANT_BOOL rt;
             long longCountRight = 0;
             while(1)
             {
                 //pRange->expand(L"sentence",&rt);
                 pRange->moveStart(L"character",-1,&longCountRight);
                 if(longCountRight==0)  break;
             }
            
            long longCountLeft = 0;
             while(1)
             {
                 pRange->moveEnd(L"sentence",1,&longCountLeft);
                 if(longCountLeft==0)  break;
             }
             
            

好了,我这么一扩大的话不仅把整段的,还有全部问题都选取了,并不是本段,很郁闷,用那个函数还是有什么特别的办法如上所说的意思呢

#4


 pRange->moveEnd(L"character",1,&longCountLeft);
也不行,还是一样的效果。更本就不知道上段的结束标记

#5


“段”的结束标记,是“回车+转行”--C语言描述是“\r\n”,但是要注意你的“段”也有可能是只有“转行””--C语言描述是“\n”。

你要按每个字节来查找、判断。
计算机运行速度很快的,你查找、判断1万个字节,也用不了0.00000000001秒。

#6


要干活了,如果还没解决。我中午来看。

#7


引用 6 楼 yhp1888 的回复:
要干活了,如果还没解决。我中午来看。


恩,好的,谢谢你啦!我先试试去,呵呵

#8


呵呵,不错,mark一下

#9


我按照你的意思做了,但是老是在moveStart,moveEnd报异常,选区都还没有到一段的开始和结束,提示导致非法访问。
 
  while(1)
             {

                 pRange->moveStart(L"character",-1,&nCount);
              
                 //获得'\r\n'字符的位置
                 if(!nCount){ break; }
                 else
                 {
                  pRange->get_text(&pwChar);
                   zice1++;
                   if ( '\r'==pwChar[0] )
                     {  /* pRange->moveStart(L"character",1,NULL); */ break; }//找到'\r'结束,向后跳过\r
                 }
                   memset(pwChar,0,1024*2);
             }

             memset(pwChar,0,1024*2);
             nCount = 0;
             int nStep = 0;
             while(1)
             {
                 pRange->moveEnd(L"character",1,&nCount);


                 //获得'\n'字符的位置
                 if(!nCount){ break; }
                 else
                 {
                   zice2++;
                   pRange->get_text(&pwChar);
                   nStep = sizeof(pwChar);
                   if ( '\n'==pwChar[nStep-1] )  //找到 \n
                     {   break; }

                 }
                  memset(pwChar,0,1024*2);
             }

#10


楼主还缺少“基础功”

1、回车转行符“\r\n”,我只是举例,是在文本文件中的。
   就算楼主是文本文件,你查找向左是“\r”?向右是“\n”
   应该向左向右都是相同的,找“\n”就可以。

2、浏览器控件里面?是IE吗?网页的分段转行不同,它是HTML超文本标志语言,并不是“\r\n”。

3、你要做这样的功能,首先是用你自己定义一段文字,这样,你查找的结果就知道正不正确了,出错了也容易知道错了哪。

4、我不明白moveStart、moveEnd的上下文关系,没有办法为你查错。

5、看你用的:
  while(1)
             {

                 pRange->moveStart(L"character",-1,&nCount); // 你用了L,说明你可能是UNICODE编码 // 我也不明白这个函数参数的作用
              
                 //获得'\r\n'字符的位置
                 if(!nCount){ break; }
                 else
                 {
                  pRange->get_text(&pwChar); // 变量名有个w,说明你可能是UNICODE编码。
                   zice1++; // 只加不用? -- 后面没有用上
                   if ( '\r'==pwChar[0] ) // UNICODE编码不能这样用,要用_L'\r' // '\r'是什么?ANSI,八位单字节!
                     {  /* pRange->moveStart(L"character",1,NULL); */ break; }//找到'\r'结束,向后跳过\r
                 }
                   memset(pwChar,0,1024*2); // 你循环语句中,每次循环都会执行这行!是不是应该放在这里?
             }

             memset(pwChar,0,1024*2);
             nCount = 0;
             int nStep = 0;
             while(1)
             {
                 pRange->moveEnd(L"character",1,&nCount);


                 //获得'\n'字符的位置
                 if(!nCount){ break; }
                 else
                 {
                   zice2++; // 只加不用? -- 后面没有用上
                   pRange->get_text(&pwChar);
                   nStep = sizeof(pwChar);
                   if ( '\n'==pwChar[nStep-1] )  //找到 \n
                     {   break; }

                 }
                  memset(pwChar,0,1024*2);
             }

#1


假如,你是鼠标,你会怎样做?
你是不是根据程序的指令,把选择范围向左扩大到上一段的结束,向右扩大到本段的结束?
有了思路就成功一了半,写程序,就是把你的动作“翻译”成计算语言。

#2


up..........................

#3


引用 1 楼 yhp1888 的回复:
假如,你是鼠标,你会怎样做?
你是不是根据程序的指令,把选择范围向左扩大到上一段的结束,向右扩大到本段的结束?
有了思路就成功一了半,写程序,就是把你的动作“翻译”成计算语言。


呵呵,看来你的建议我豁然开朗,但是按照你的想法去了做了,我不知道怎么将选取扩大到上一段的结束和本段的结束,有没有什么标记表示扩大到上一段的结束。还是我没有找到。现在我贴上我的实现代码。
如果我用的函数不对还是就是错的,麻烦朋友给指正。

    VARIANT_BOOL rt;
             long longCountRight = 0;
             while(1)
             {
                 //pRange->expand(L"sentence",&rt);
                 pRange->moveStart(L"character",-1,&longCountRight);
                 if(longCountRight==0)  break;
             }
            
            long longCountLeft = 0;
             while(1)
             {
                 pRange->moveEnd(L"sentence",1,&longCountLeft);
                 if(longCountLeft==0)  break;
             }
             
            

好了,我这么一扩大的话不仅把整段的,还有全部问题都选取了,并不是本段,很郁闷,用那个函数还是有什么特别的办法如上所说的意思呢

#4


 pRange->moveEnd(L"character",1,&longCountLeft);
也不行,还是一样的效果。更本就不知道上段的结束标记

#5


“段”的结束标记,是“回车+转行”--C语言描述是“\r\n”,但是要注意你的“段”也有可能是只有“转行””--C语言描述是“\n”。

你要按每个字节来查找、判断。
计算机运行速度很快的,你查找、判断1万个字节,也用不了0.00000000001秒。

#6


要干活了,如果还没解决。我中午来看。

#7


引用 6 楼 yhp1888 的回复:
要干活了,如果还没解决。我中午来看。


恩,好的,谢谢你啦!我先试试去,呵呵

#8


呵呵,不错,mark一下

#9


我按照你的意思做了,但是老是在moveStart,moveEnd报异常,选区都还没有到一段的开始和结束,提示导致非法访问。
 
  while(1)
             {

                 pRange->moveStart(L"character",-1,&nCount);
              
                 //获得'\r\n'字符的位置
                 if(!nCount){ break; }
                 else
                 {
                  pRange->get_text(&pwChar);
                   zice1++;
                   if ( '\r'==pwChar[0] )
                     {  /* pRange->moveStart(L"character",1,NULL); */ break; }//找到'\r'结束,向后跳过\r
                 }
                   memset(pwChar,0,1024*2);
             }

             memset(pwChar,0,1024*2);
             nCount = 0;
             int nStep = 0;
             while(1)
             {
                 pRange->moveEnd(L"character",1,&nCount);


                 //获得'\n'字符的位置
                 if(!nCount){ break; }
                 else
                 {
                   zice2++;
                   pRange->get_text(&pwChar);
                   nStep = sizeof(pwChar);
                   if ( '\n'==pwChar[nStep-1] )  //找到 \n
                     {   break; }

                 }
                  memset(pwChar,0,1024*2);
             }

#10


楼主还缺少“基础功”

1、回车转行符“\r\n”,我只是举例,是在文本文件中的。
   就算楼主是文本文件,你查找向左是“\r”?向右是“\n”
   应该向左向右都是相同的,找“\n”就可以。

2、浏览器控件里面?是IE吗?网页的分段转行不同,它是HTML超文本标志语言,并不是“\r\n”。

3、你要做这样的功能,首先是用你自己定义一段文字,这样,你查找的结果就知道正不正确了,出错了也容易知道错了哪。

4、我不明白moveStart、moveEnd的上下文关系,没有办法为你查错。

5、看你用的:
  while(1)
             {

                 pRange->moveStart(L"character",-1,&nCount); // 你用了L,说明你可能是UNICODE编码 // 我也不明白这个函数参数的作用
              
                 //获得'\r\n'字符的位置
                 if(!nCount){ break; }
                 else
                 {
                  pRange->get_text(&pwChar); // 变量名有个w,说明你可能是UNICODE编码。
                   zice1++; // 只加不用? -- 后面没有用上
                   if ( '\r'==pwChar[0] ) // UNICODE编码不能这样用,要用_L'\r' // '\r'是什么?ANSI,八位单字节!
                     {  /* pRange->moveStart(L"character",1,NULL); */ break; }//找到'\r'结束,向后跳过\r
                 }
                   memset(pwChar,0,1024*2); // 你循环语句中,每次循环都会执行这行!是不是应该放在这里?
             }

             memset(pwChar,0,1024*2);
             nCount = 0;
             int nStep = 0;
             while(1)
             {
                 pRange->moveEnd(L"character",1,&nCount);


                 //获得'\n'字符的位置
                 if(!nCount){ break; }
                 else
                 {
                   zice2++; // 只加不用? -- 后面没有用上
                   pRange->get_text(&pwChar);
                   nStep = sizeof(pwChar);
                   if ( '\n'==pwChar[nStep-1] )  //找到 \n
                     {   break; }

                 }
                  memset(pwChar,0,1024*2);
             }

相关文章