小弟初学VC,正在写一个文本编辑器,但现在书上和网上的例子全部都是用MFC的editview或edit控件实现的。我想用纯粹的API来实现,但无奈才疏学浅写了半月却一无所获,求前辈高人指点迷津。怎样不使用控件和MFC来做出类似Windows记事本的程序,能否给出源程序代码?或者有edit控件的源代码实现也行。谢谢!

解决方案 »

  1.   

    恐怕初学者要做这种东东不是很容易哦,不过可以建议你看一下DELPHI里的MEMO的源码,不知道你PASCAL怎样?
      

  2.   

    我相信delphi里的memo也只是edit的包装而已.
      

  3.   

    问得好,这是每个初学者应该面对的,老用封装好的提高不了,但我也确实不清楚微软的EDIT是如何做出的。
      

  4.   

    其实很简单,关键是分段,MSDN里有的。
      

  5.   

    这里有一个写的不错的。
    http://www.codeproject.com/editctrl/crysedit.asp
      

  6.   

    恩 其实比如edit, button都属于windows common controls 是windows的常用控件 在windows中本身已经是实现了的 一个edit 从消息的响应 到字符的绘制 到各种情况的考虑 确实是一件很繁琐的事情 微软已经替我们都做好了 我觉得是没有必要自己从0开始再去写一个(你从什么开始写呢? SetPixel()? ..) 学习是必要的 但是真正做起东西来 既然已经有做好了的 而且健壮性和效率等等都没有问题的代码 就没必要自己去写了 引用bjarne stroustrup在tc++pl里的一个忠告 "不要像重新发明车轮那样企图做每件事;去使用库" 我想这是同一个道理
    不好意思 我的回答可能不是楼主所希望的 我只是表达一下自己的看法 ^^
    (windows edit的源代码可能只有去管微软要了..)
      

  7.   

    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句柄。
      

  8.   

    不使用Edit控件当然可以,我就写了一个不基于Edit的编辑类控件,
    不过确实麻烦,但是并不难,
    定义一个链表存放每一个字符元素,自己画光标,所谓删除、插入、分段、
    等其实都是对于表的操作,
    在响应各种键盘消息,
    我花了大概一周的时间。除非特殊应用,否则用Edit到是省事的多。
      

  9.   

    到http://www.codeproject.com上去找一下
      

  10.   

    r3000()兄,每一个字符的大小都是不同的,你如何计算光标的移动距离,望赐教。
    http://www.codeproject.com上我查了,都是用MFC的CEidt实现的。
      

  11.   

    to楼上
    还有很多麻烦事, 例如Ctrl+Shift+箭头 选择一个单词
    Shift + Home 选择一行, 要作得和Windows的Edit一样, 确实难度
    极大.
      

  12.   

    你有什么特殊用途吗?为什么不用现有的控件,干吗还要自己做!你做的一定比现有的强吗?如果什么都要自己做,那你就应该先做个操作系统,Windows也是微软的!
      

  13.   

    不是要比现有的强,而是我把它看作是学习API编程的极好的Sample,自己动手做才发现用惯了别人的自己做起来好难。
      

  14.   

    我又试了一下,我快被半个中文字和变宽字体折磨得崩溃了,各位谁有以前写的代码能发给小弟参考一下么? Email: [email protected]
      

  15.   

    个儿看法:
    关于不等宽字体, 很多windows的字体都是不等宽的, 这个对于光标的影响,
    我感觉是巨麻烦.
    最好, 当用户设置字体时, 调用windows函数,例如GetTextExtent,得到ascii 
    1-127的所有字符的宽度, 保存下来, 以后只有用户更改字体的时候刷新.至于中文, 中文的宽度都是一致的, 随便得到任何一个中文字符宽度就可以了.以后,计算光标位置的时候, 根据字符的内容, 就可以得到每个字符的宽度了.
      

  16.   

    "r3000()兄,每一个字符的大小都是不同的,你如何计算光标的移动距离,望赐教。"赐教谈不上,共同探讨。我是这样处理的:
       
       根本不用计算光标的移动距离。   每个字符当然大小不同,我是用面对对象的方法处理的,每个字符是一个类,
    都有RECT数据成员说明自己的大小,就像在字符外画个框,当然框不显示。
       字符对象存在链表里,当鼠标点中屏幕的某个点,或者键盘移动到某个点时,查表
    中字符元素的RECT,包含这个点就是找到了,然后在这个RECT中画光标+字符.
       速度没有问题,实际感觉和Edit没有差别。
      

  17.   

    补充:得到字符的实际宽度,有Win API GDI函数.
      

  18.   

    如果要编辑大文档的话,每个字符带个RECT是不行的,内存消耗太大。变宽字符也不难处理,关键是看你的数据结构定的好不好了。
      

  19.   

    有理想,不过很烦的呀。主要处理一个OnChar消息,但细节要考虑很多
      

  20.   

    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.
      

  21.   

    我这有一个两年多前写的,居然被我找出来了,应该能给你一点帮助,你拿去看一看。我发到你邮箱里了,是这个邮箱么 : [email protected]
    受到如果觉得还可以的话就请给分吧 ^-^