高亮显示的编辑器的复制粘贴问题【为什么呢?大侠们哦~~】

lingling1989r 2009-08-30 06:12:39
我很好奇个问题:
eclipse下的代码,我复制--》粘贴到word文档中,代码仍旧保持高亮。
mingw下的代码,我复制--》粘贴到word文档中,本来高亮的代码不能高亮了。

他们分别是怎么高亮的机制啊?为什么会是这样的?
知道的说一下,不知道的猜猜也行,合理就给分,详细实现多给分。
越具体越好~~
...全文
195 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
uwinb 2009-09-19
  • 打赏
  • 举报
回复
http://book.51cto.com/art/200906/130946.htm
uwinb 2009-09-18
  • 打赏
  • 举报
回复
复制到剪贴板时,mingw不会有意识地做什么清除格式信息的工作,因为她并不知道你将来,
是将剪贴板中的内容粘贴回mingw还是粘贴到网页,又或者是其它什么地方……
记和以前在Word文档中选择一段内容复制到剪贴板后,还可以粘贴到资源管理器中产生叫碎片的文件!
还有在Excel中选中一区域复制到剪贴板后,可以粘贴到记事本,也可以粘贴到画图板,很神奇吧?

据此我们大胆猜想,应用程序往系统剪贴板中送数据时,文字内容和格式是分开送的(如何关联很麻烦),
当然也可能是无格式的文本送一份,有格式的文本再送一份,像Excel至少还多送一份图像格式的数据……
从系统剪贴板接收数据的应用程序,只需要提取自己喜欢的格式数据就行了,像记事本只认识无格式文本,
像画图板更喜欢图像格式的数据,像Word可以更复杂点创建OLE对象,如此等等……
除了系统预定义的几个数据格式,你还可以自定义格式,当然也就只有你的程序才会认识啦。END
lingling1989r 2009-09-18
  • 打赏
  • 举报
回复
START:
"文字内容和格式是分开送的"----//我就是觉得这句不大可能。系统已知的格式是统一的,文本的格式应该也是像html那样修饰那句,就在那句标记[hl]no problem![/hl]这个样子。我想了想,也许是这个样子,每个连续的一样格式的文本,

class TEXTNODE
{
string content;
//下面这些信息是对这一段文字内容的格式描述,枚举类型的。
COLOR color;
SIZE size;
//下面就可能会有一堆get或是set方法,可能mingw就是复制到系统剪贴板的时候,没有用get方法去获取或是怎的??
....
}



然后,一整段的文本就是由这样的具有相同格式描述的文本节点TEXTNODE链起来的??我也不知道啦。只能自己在这里瞎猜了。

mingw可能没有把格式信息get到系统剪贴板吧,然后Eclipse将格式也都挨个get过去了,这样就不是mingw多做了什么工作让自己的信息挖掉,而是偷了什么懒以至于丢掉了这些格式信息。要是这样的话,于情于理就能讲得通了。

至于“elipse--系统剪贴板---html”这个样子的,系统剪贴板中含有文本的格式信息,贴到这里的形成代码的时候,就应该是从系统剪贴板中get那些信息后,再replace的吧........
END
lingling1989r 2009-09-17
  • 打赏
  • 举报
回复
真的是个耿耿于怀的帖子,很久没结贴。

如果我复制到系统剪贴板的信息是保留格式的,它向网页贴代码的时候,他应该用的replace all将格式变成html可以识别的吧。要那样的话,他的字体,颜色等这些信息就是夹杂在文本中的,那mingw的编辑器岂不是要在复制到系统剪贴板的时候一一去掉这些信息,我不能理解她为了要让字体更难看而去做这些我觉得很麻烦的工作。所以我很想问,她去掉这些信息需要做哪些工作?

lingling1989r 2009-09-01
  • 打赏
  • 举报
回复
to 7#:
十分感谢,我再酝酿酝酿...
  • 打赏
  • 举报
回复
MoXiaoRab 2009-08-31
  • 打赏
  • 举报
回复
GetClipboardData  获取剪贴板内容
  用OpenClipboard打开剪贴板
  EnumClipboardFormats加while来循环出一个可用的剪贴板格式
  使用GetClipboardData获得剪贴板的内存块首地址
  用GlobalLock锁定剪贴板那内存块
  GlobalSize可以用来获取该内存块的大小
  使用GlobalUnlock解除锁定
  CloseClipboard关闭剪贴板
  示例代码:
  
#include <windows.h>
  #include <stdio.h>
  int main(int argc, char *argv[])
  {
  if (!OpenClipboard(NULL))
  {
  return 0;
  }
  HGLOBAL hMem = NULL;
  LPCTSTR lpStr = NULL;
  UINT uFormat = NULL;
  while (TRUE)
  {
  uFormat = EnumClipboardFormats(uFormat);//看到格式了吧?
  if (uFormat > 0)
  {
  hMem = GetClipboardData(uFormat);
  lpStr = (LPCTSTR)::GlobalLock(hMem);
  if (lpStr != NULL)
  {
  printf("The address is 0x%0x\n", hMem);
  break;
  }
  }
  else
  {
  return 0;
  }
  }
  DWORD dwSize = GlobalSize(hMem);
  printf("The size of clipboard : %ld",dwSize);
  for (DWORD dw = 0 ;dw<dwSize;dw++)
  {
  if (dw%21 == 0)
  {
  printf("\n");
  }
  printf("%02x ",(UCHAR)lpStr[dw]);
  }
  printf("\n");
  GlobalUnlock(hMem);
  CloseClipboard();
  return 0;
  }
uwinb 2009-08-31
  • 打赏
  • 举报
回复
问题核心在于系统剪贴板,参见以下描述
http://forum.byr.edu.cn/pc/pccon.php?id=503&nid=31502
lingling1989r 2009-08-30
  • 打赏
  • 举报
回复
那就是 复制 的问题喽。


我去找了段代码帮助自己理解。可是....


//打开剪贴板
if ( OpenClipboard() )
{
//清空剪贴板
EmptyClipboard();

//建立Window共享文件
CSharedFile shareFile( GMEM_MOVEABLE|GMEM_DDESHARE|GMEM_ZEROINIT);
//将共享文件与ar关联,以便进行序列化操作
CArchive ar(&shareFile, CArchive::store);

//保存图形个数
int iSelCount = this->GetSelCount();
int iAllCount = pDoc->m_objItems.GetCount();
ar<<iSelCount;

//把选中的图形存入内存文件
CItem *pItem;
for (int i=iAllCount-1; i>=0; i--)
{
pItem = (CItem*)pDoc->m_objItems[i];
if ( pItem->m_bSelected )
{
ar<<pItem;
}
}

ar.Close();//关闭序列化

HGLOBAL hMem = shareFile.Detach(); //获得共享文件的句柄

if (!hMem)
{
return;
}
SetClipboardData(m_uClipBoardItem, hMem);

//关闭剪贴板
CloseClipboard();
}



这是我抄来的一段关于Citem复制的代码,CItem就是他自定义的一个新类型。
对于文字这样windows本身就已经能够识别的类型,是不是也有一个数据结构来存储的啊?那在这个数据结构中存储的应该有他的字体还有颜色什么的,像HtmL代码中保存大小字体之类的不是都直接在里面?像[b]。。。[//b]之类的,既然是windows已经注册过能够识别的类型,那这种数据结构应该是一致的吧,所以我有点疑惑。
(1)我这么想的:如果我上面说的没错的话,他系统给的数据结构一致,那不同的编辑器针对文本复制传递的信息,传递给windows剪贴板的应该都是这个数据结构,否则他再去剔除这些信息岂不是更麻烦。应该不会这么弄。
所以,我应该想错了。

(2)你们的意思好像是说,这个格式信息,不是存储在文本这个数据结构内的,而是另外加的,可是我又疑惑了。我觉得,如果你这个格式若只是针对文本,不能针对其他的类型的话,那他不通用放到外面干嘛?不为了方便大家,自己用着又麻烦。




给点代码什么的,让我更明白些那就更好了。
或者讲讲windows的复制,粘贴也好~~呵呵~
oyljerry 2009-08-30
  • 打赏
  • 举报
回复
主要就是一个信息格式问题,拷贝的时候是否带有格式信息
光宇广贞 2009-08-30
  • 打赏
  • 举报
回复
只在于MINGW对文本的复制是纯文本处理的,不带格式信息。
cut9 2009-08-30
  • 打赏
  • 举报
回复
Windows的剪贴板,可以设置剪贴内容的格式。
以eclipse为源,word为目标,以下说明:

eclipse 把数据拷贝到剪贴板,并且设定格式为 "richtext_style" (打个比方啊!)

word检测到这个格式,可以自己处理。

如果贴到ultredit,那么ultredit会把这个richtext_sytle转换为普通文本格式再贴。


如果贴到Painter,那么painter检测到自己不识别这个格式,剪贴失败。


换句话说,你也可以个做自己的剪贴源程序(比如eclipse)来提供剪贴数据的格式
也可以做自己的剪贴目标程序(比如word)来识别剪贴板数据
whg01 2009-08-30
  • 打赏
  • 举报
回复
在eclipse下复制的内容是带格式信息的,而mingw则不带。mingw没有做这个处理。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧