如何限制CRichEditCtrl换行

如何限制CRichEditCtrl换行
飘飘白云 2008/03/19


用WTL在自制的窗口里加了个文本框,但要限制用户输入不能超过三行,即便是按enter或ctrl+enter换行也不能超过三行,浏览了下MSDN,实现这个功能,顺便mark一下。

首先创建CRichEditCtrl对象,创建文本框,并设置相关的属性(ES_MULTILINE必须要有),具体看代码:

WTL::CRichEditCtrl m_recText;

m_recText.Create(
* this , m_rcText, L "" , WS_CHILD  |  WS_VISIBLE  |  WS_TABSTOP  |  ES_MULTILINE,  0 );

......

m_recText.LimitText(
30 );
m_recText.SetEventMask(ENM_KEYEVENTS);        
// 在这里设置将文本框的按键消息发送给父窗口(MSG_WM_NOTIFY)

然后在父窗口的消息map中添加MSG_WM_NOTIFY的响应函数:

BEGIN_MSG_MAP_EX(ModifyPlayerExplImpl)
 ...
 MSG_WM_NOTIFY(OnNotify)
 ....
END_MSG_MAP()

然后在OnNotify()中实现相应的处理:

    LRESULT OnNotify( int  nID, LPNMHDR pnmh)
    
{
        
if (pnmh->hwndFrom == m_recText && pnmh->code == EN_MSGFILTER) {
            MSGFILTER
* msgFilter = (MSGFILTER *) (pnmh);
            
if (msgFilter->msg == WM_KEYDOWN && msgFilter->wParam == VK_RETURN) {
                
if (m_recText.GetLineCount() >= 3{
                    msgFilter
->wParam = 0;
                }

            }

        }


        
return 0;
    }

这里我们先来看看LPNMHDR这个东东(指向一个NMHDR结构体),NMHDR的声明如下:

typedef  struct  tagNMHDR
{
    HWND      hwndFrom;
    UINT_PTR  idFrom;
    UINT      code;         
// NM_ code
}
   NMHDR;
typedef NMHDR FAR 
*  LPNMHDR;

其中hwndFrom就是这个消息的来源控件窗口句柄,idFrom就是控件的id,code是消息的通知码。下面来看看具体怎么用,先判断hwndFrom是否就是我们想要监控的文本框控件,并且消息的通知码要是EN_MSGFILTER(MSDN如是说:
The EN_MSGFILTER message notifies a rich edit control's parent window of a keyboard or mouse event in the control. A rich edit control sends this notification message in the form of a WM_NOTIFY message.

文本框控件通过WM_NOTIFY发送EN_MSGFILTER通知码给父窗口,通知父窗口----文本框中有键盘或者鼠标事件发生)

这样我们就可以确定这个消息确是来自我们想要监控的文本框控件的按键消息,然后我们就可以把LPNMHDR转换成MSGFILTER指针,来处理响应或让文本框控件忽略按键消息(这是我们在这里想要的-如果行数大于指定数目,就忽略回车按键消息)。MSGFILTER结构体包含来自文本框控件的键盘或鼠标消息,定义如下:

typedef  struct  _msgfilter  {
    NMHDR nmhdr;
    UINT msg;
    WPARAM wParam;
    LPARAM lParam;
}
 MSGFILTER;


nmhdr就是前面的讲过的NMHDR结构体,msg是一般的window消息(在这里特指按键消息或鼠标消息),wParam和lParam就是消息的两个参数。

我们先判断是按键消息,并且按下的是enter键,这是判断当前文本框的行数是不是已经达到上限,如果是简单地将消息的wParam参数设置为0,这样就修改了文本控件回车按键的消息从而达到控制行数的目的。

if  (msgFilter -> msg  ==  WM_KEYDOWN  &&  msgFilter -> wParam  ==  VK_RETURN)  {
    
if (m_recText.GetLineCount() >= 3{
     msgFilter
->wParam = 0;
    }

   }

你可能感兴趣的:(Windows)