第5课 文本编辑(1)创建光标

一、创建光标(插入符)

问题1:什么时候创建光标?

   在窗口创建之后再创建光标(插入符)

问题2:在什么地方创建光标?

   明白框架类和视图类的关系:视类始终是覆盖在框架类窗口之上的

   SO 要在视图类的OnCreate函数中创建光标

创建光标的函数:void CreateSolidCaret( int nWidth, int 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.

问题3:如何获取系统定义的窗口边界的宽度、高度?

   使用API函数GetSystemMetrics

如得到窗口边界的宽度,程序代码如下:

void CTest05View::OnDraw(CDC* pDC)

{

      CTest05Doc* pDoc = GetDocument();

      ASSERT_VALID(pDoc);

      // TODO: add draw code for native data here

      int cx=GetSystemMetrics(SM_CXBORDER);

      CString str;

      str.Format("%d",cx);

      pDC->TextOut(100,100,str);

}

这样就可以知道窗口边界的宽度了。

问题4:在视图类中添加WM_CREATE消息响应后,使用CreateSolidCaret()创建了光标,运行之后,光标并没有显示出来。为什么?

The CreateSolidCaret member function automatically destroys the previous caret shape, if any, regardless of which window owns the caret. Once created, the caret is initially hidden. To show the caret, theShowCaret member function must be called.

使用CreateSolidCaret成员函数创建光标,会自动销毁先前的光标。如果有,无论是哪个窗口拥有的光标都会销毁。一旦创建了,光标的初始化是被隐藏的。为了显示光标,要调用ShowCaret成员函数。

解决以上问题后,我们可以写出一个程序,显示出光标了。

int CTest05View::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

       if (CView::OnCreate(lpCreateStruct) == -1)

              return -1;

       // TODO: Add your specialized creation code here

       CreateSolidCaret(10,10);

       ShowCaret();

       return 0;

}

问题5:以上程序中的插入符大小是我们自己设置的。那如何设置插入符的大小,使它能够根据当前到设备描述表中的字体的字号而变化,就像在WORD里一样。怎么做?

1.     首先获取当前设备描述表中字体的信息

使用函数CDC::GetTextMetrics 

BOOL GetTextMetrics( LPTEXTMETRIC lpMetrics ) const;

lpMetrics:是指向TEXTMETRIC 结构体的指针。所以只要定义一个TEXTMETRIC 结构体,然后把地址传给它就好。PS:LP = long pointer 

即使用这个函数之后,把当前设备描述表中的字体等信息都存放在了TEXTMETRIC的一个结构体中。

★    注意:两个高度,升序高度和降序高度,例如g这个字母,圆圈的下边缘是base line,这个base line之上是升序高度,之下是降序高度;字体的高度(tmHeight)是两个高度之和,这样,文本在输入时,上下行才不至于覆盖。

★    注意:由于每个字符的宽度是不一样的,所以结构体中没有一个参数是来表示具体字符宽度的,而是用了一个平均字符宽度(tmAveCharWidth)来表示。

2.     根据所获的当前设备描述表中字体的信息来设置插入符

CClientDC dc(this);

      TEXTMETRIC tm;

      dc.GetTextMetrics(&tm);

      CreateSolidCaret(tm.tmAveCharWidth/5,tm.tmHeight);

这样就可以输出符合当前设备描述表的插入符了。

完整程序代码如下:

int CTest05View::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

      if (CView::OnCreate(lpCreateStruct) == -1)

           return -1;

      // TODO: Add your specialized creation code here

      CClientDC dc(this);

      TEXTMETRIC tm;

      dc.GetTextMetrics(&tm);

      CreateSolidCaret(tm.tmAveCharWidth/5,tm.tmHeight);

      ShowCaret();

      return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值