必须用微软的编辑控件做编辑器?我不服!散分100求前辈高人指点 小弟初学VC,正在写一个文本编辑器,但现在书上和网上的例子全部都是用MFC的editview或edit控件实现的。我想用纯粹的API来实现,但无奈才疏学浅写了半月却一无所获,求前辈高人指点迷津。怎样不使用控件和MFC来做出类似Windows记事本的程序,能否给出源程序代码?或者有edit控件的源代码实现也行。谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 恐怕初学者要做这种东东不是很容易哦,不过可以建议你看一下DELPHI里的MEMO的源码,不知道你PASCAL怎样? 我相信delphi里的memo也只是edit的包装而已. 问得好,这是每个初学者应该面对的,老用封装好的提高不了,但我也确实不清楚微软的EDIT是如何做出的。 其实很简单,关键是分段,MSDN里有的。 这里有一个写的不错的。http://www.codeproject.com/editctrl/crysedit.asp 恩 其实比如edit, button都属于windows common controls 是windows的常用控件 在windows中本身已经是实现了的 一个edit 从消息的响应 到字符的绘制 到各种情况的考虑 确实是一件很繁琐的事情 微软已经替我们都做好了 我觉得是没有必要自己从0开始再去写一个(你从什么开始写呢? SetPixel()? ..) 学习是必要的 但是真正做起东西来 既然已经有做好了的 而且健壮性和效率等等都没有问题的代码 就没必要自己去写了 引用bjarne stroustrup在tc++pl里的一个忠告 "不要像重新发明车轮那样企图做每件事;去使用库" 我想这是同一个道理不好意思 我的回答可能不是楼主所希望的 我只是表达一下自己的看法 ^^(windows edit的源代码可能只有去管微软要了..) API方法:RECT rect;GetClientRect(hWnd,&rect);hEditWnd = CreateWindowEx(WS_EX_LEFT|WS_EX_LTRREADING|WS_EX_RIGHTSCROLLBAR|WS_EX_NOPARENTNOTIFY|WS_EX_CLIENTEDGE, _T("Edit"),_T(""),WS_CHILDWINDOW|WS_VISIBLE|WS_TABSTOP|ES_LEFT|ES_WANTRETURN|ES_MULTILINE|WS_HSCROLL|WS_VSCROLL, 0,0,rect.right - rect.left ,rect.bottom - rect.top,hWnd,NULL,NULL,0);hEditWnd是一个HWND类型的Edit句柄。 不使用Edit控件当然可以,我就写了一个不基于Edit的编辑类控件,不过确实麻烦,但是并不难,定义一个链表存放每一个字符元素,自己画光标,所谓删除、插入、分段、等其实都是对于表的操作,在响应各种键盘消息,我花了大概一周的时间。除非特殊应用,否则用Edit到是省事的多。 到http://www.codeproject.com上去找一下 r3000()兄,每一个字符的大小都是不同的,你如何计算光标的移动距离,望赐教。http://www.codeproject.com上我查了,都是用MFC的CEidt实现的。 to楼上还有很多麻烦事, 例如Ctrl+Shift+箭头 选择一个单词Shift + Home 选择一行, 要作得和Windows的Edit一样, 确实难度极大. 你有什么特殊用途吗?为什么不用现有的控件,干吗还要自己做!你做的一定比现有的强吗?如果什么都要自己做,那你就应该先做个操作系统,Windows也是微软的! 不是要比现有的强,而是我把它看作是学习API编程的极好的Sample,自己动手做才发现用惯了别人的自己做起来好难。 我又试了一下,我快被半个中文字和变宽字体折磨得崩溃了,各位谁有以前写的代码能发给小弟参考一下么? Email: [email protected] 个儿看法:关于不等宽字体, 很多windows的字体都是不等宽的, 这个对于光标的影响,我感觉是巨麻烦.最好, 当用户设置字体时, 调用windows函数,例如GetTextExtent,得到ascii 1-127的所有字符的宽度, 保存下来, 以后只有用户更改字体的时候刷新.至于中文, 中文的宽度都是一致的, 随便得到任何一个中文字符宽度就可以了.以后,计算光标位置的时候, 根据字符的内容, 就可以得到每个字符的宽度了. "r3000()兄,每一个字符的大小都是不同的,你如何计算光标的移动距离,望赐教。"赐教谈不上,共同探讨。我是这样处理的: 根本不用计算光标的移动距离。 每个字符当然大小不同,我是用面对对象的方法处理的,每个字符是一个类,都有RECT数据成员说明自己的大小,就像在字符外画个框,当然框不显示。 字符对象存在链表里,当鼠标点中屏幕的某个点,或者键盘移动到某个点时,查表中字符元素的RECT,包含这个点就是找到了,然后在这个RECT中画光标+字符. 速度没有问题,实际感觉和Edit没有差别。 补充:得到字符的实际宽度,有Win API GDI函数. 如果要编辑大文档的话,每个字符带个RECT是不行的,内存消耗太大。变宽字符也不难处理,关键是看你的数据结构定的好不好了。 有理想,不过很烦的呀。主要处理一个OnChar消息,但细节要考虑很多 http://www.scintilla.org/Scintilla is a free source code editing component. It comes with complete source code and a license that permits use in any free project or commercial product. 我这有一个两年多前写的,居然被我找出来了,应该能给你一点帮助,你拿去看一看。我发到你邮箱里了,是这个邮箱么 : [email protected]受到如果觉得还可以的话就请给分吧 ^-^ 系统线程数目狂多啊。。。。你们的呢? 图形处理问题 windows API 语音播放问题 高分请教简单的问题 操作word的奇怪 VC中报这个错是什么回事?? 一个类里有一个指针类型的成员变量,问要不要在析勾函数里进行delete操作。 GetProcAddress函数使用问题 请问:char * pStr; BSTR m_bstrA; pStr=(char *)_bstr_t(m_bstrA)如何解释,_bstr_t是类与(char *)强制转换??? 在用vc的wizard时 AfxBeginThread()这句话报错,请各位帮忙看一下? 问两个小问题(关于单文档与非模态显示窗体)
http://www.codeproject.com/editctrl/crysedit.asp
不好意思 我的回答可能不是楼主所希望的 我只是表达一下自己的看法 ^^
(windows edit的源代码可能只有去管微软要了..)
RECT rect;
GetClientRect(hWnd,&rect);
hEditWnd = CreateWindowEx(WS_EX_LEFT|WS_EX_LTRREADING|WS_EX_RIGHTSCROLLBAR|WS_EX_NOPARENTNOTIFY|WS_EX_CLIENTEDGE,
_T("Edit"),_T(""),WS_CHILDWINDOW|WS_VISIBLE|WS_TABSTOP|ES_LEFT|ES_WANTRETURN|ES_MULTILINE|WS_HSCROLL|WS_VSCROLL,
0,0,rect.right - rect.left ,rect.bottom - rect.top,hWnd,NULL,NULL,0);
hEditWnd是一个HWND类型的Edit句柄。
不过确实麻烦,但是并不难,
定义一个链表存放每一个字符元素,自己画光标,所谓删除、插入、分段、
等其实都是对于表的操作,
在响应各种键盘消息,
我花了大概一周的时间。除非特殊应用,否则用Edit到是省事的多。
http://www.codeproject.com上我查了,都是用MFC的CEidt实现的。
还有很多麻烦事, 例如Ctrl+Shift+箭头 选择一个单词
Shift + Home 选择一行, 要作得和Windows的Edit一样, 确实难度
极大.
关于不等宽字体, 很多windows的字体都是不等宽的, 这个对于光标的影响,
我感觉是巨麻烦.
最好, 当用户设置字体时, 调用windows函数,例如GetTextExtent,得到ascii
1-127的所有字符的宽度, 保存下来, 以后只有用户更改字体的时候刷新.至于中文, 中文的宽度都是一致的, 随便得到任何一个中文字符宽度就可以了.以后,计算光标位置的时候, 根据字符的内容, 就可以得到每个字符的宽度了.
根本不用计算光标的移动距离。 每个字符当然大小不同,我是用面对对象的方法处理的,每个字符是一个类,
都有RECT数据成员说明自己的大小,就像在字符外画个框,当然框不显示。
字符对象存在链表里,当鼠标点中屏幕的某个点,或者键盘移动到某个点时,查表
中字符元素的RECT,包含这个点就是找到了,然后在这个RECT中画光标+字符.
速度没有问题,实际感觉和Edit没有差别。
Scintilla is a free source code editing component. It comes with complete source code and a license that permits use in any free project or commercial product.
受到如果觉得还可以的话就请给分吧 ^-^