玩转C科技.NET

从学会做人开始认识这个世界!http://tinyurl.com/volnet http://bit.ly/KMzi2

导航

<2009年7月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

统计

公告

Microsoft MVP!
follow me!!!
    follow me on Twitter
    Subscribe to this feed
    Contact volnet online!

    MSN群MyMSDN技术讨论群
    群号:www.msdn@hotmail.com
    Windows Live Alerts
    LiveMessenger:
    <My Library>

    很久没闪了,闪一下睡觉

    与我联系

    搜索

     

    常用链接

    留言簿

    我参与的团队

    我的标签

    随笔分类(145)

    随笔档案(128)

    文章分类(15)

    文章档案(15)

    相册

    家园建设

    最新随笔

    积分与排名

    • 积分 - 210526
    • 排名 - 217

    最新评论

    阅读排行榜

    评论排行榜

    60天内阅读排行

    Text文本类的部分操作

    基本是基于WND::CDC的一些显示类的调用

    本文的工程主要是描述一个文本编辑器的开发过程。

    一、             文本编辑器的基本特征

    l         需要一个光标用来指示当前输入字符

    l         能处理文字输入(包括删除等基本字处理能力)

    二、             设计光标

    光标一开始就会存在,因此在初始化View类的时候就要将光标添加进去。

    首先要创建一个光标对象,可以使用函数:CreateSolidCaret

    Creates a solid rectangle for the system caret and claims ownership of the caret.

    void CreateSolidCaret(

       int nWidth,

       int nHeight

    );

             而该函数需要2个参数nWidth,nHeight

    nWidth

    Specifies the width of the caret (in logical units). If this parameter is 0, the width is set to the system-defined window-border width.

    nHeight

    Specifies the height of the caret (in logical units). If this parameter is 0, the height is set to the system-defined window-border height.

         而我们知道,我们所需要的光标最好能和当前要输入的字符的尺寸的高度是一致的,且成条形的(假设现在模仿WORD等经典字处理模式的特征)。

    因此我们需要获取当前文字的一些属性才可以判断光标的宽高。

    可以使用CDC::GetTextMetrics 用来获取一个当前字体的度量值。

    Retrieves the metrics for the current font using the attribute device context.

    BOOL GetTextMetrics(

       LPTEXTMETRIC lpMetrics

    ) const;

    lpMetrics

    Points to the TEXTMETRIC structure that receives the metrics.

    因此需要先定义一个TEXTMETRIC的变量,然后利用它来传递字体的参数。

         CClientDC dc(this);

         TEXTMETRIC tm;

         dc.GetTextMetrics(&tm);

    在获取了参数之后就要把拥有当前参数传进光标对象并将其显示出来。

    CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight); // tm.tmAveCharWidth/8除以8的目的在于能够以一个竖线的形状显示。这个8可以通过反复测试选择合适的值。

         ShowCaret();  //有了对象还要调用其下这个方法才可以显示出来。

     

    补充:bitmap.LoadBitmap(IDB_BITMAP1);

         CreateCaret(&bitmap);

    如果要使用位图来作为光标,那么需要换一下光标的内容,在ShowCaret()函数前输入以上两句。IDB_BITMAP1可以在添加资源中添加。

    三、             处理文字输入

    文字输入需要捕获键盘的输入信息,也就是识别每个不同的按键的值,应交由WM_CHAR(WM_KEYDOWN,WM_KEYUP两个消息在  TranslateMessage(&msg);

    DispatchMessage(&msg);的共同作用下产生的)。因此应该在WM_CHAR消息下完成输入代码的处理。

    添加文字现在采用一个字符串CString对象来保存所有光标前的值,然后将之前的值在窗体重绘后再次输出。

    Error! Error! Error! Error! Error! Error! Error! Error! Error! Error! Error! Error!

    操作环境:VS.NET2003 VC++7.0

    WM_CHAR中捕获键盘按下字符。

    UINT nChar;

     

    CString m_strLine+=nChar;     //+=操作符重载出错!

    Error! Error! Error! Error! Error! Error! Error! Error! Error! Error! Error! Error!


    代码下载:code_Text

    posted on 2008-07-18 20:30 volnet(可以叫我大V) 阅读(249) 评论(1)  编辑 收藏 所属分类: VC++/C++

    评论

    #1楼 2008-12-31 15:23 gz81gz81gz81[未注册用户]

    你好,这一节是没有完成吗?   回复  引用    

    发表评论

    昵称: [登录] [注册]

    主页:

    邮箱:(仅博主可见)

    评论内容:

      登录  注册

    [使用Ctrl+Enter键快速提交评论]

    0 472796




    相关文章:

    相关链接:
    使用Live Messenger联系我
    关闭