• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            羅朝輝(飄飄白云)

            關(guān)注嵌入式操作系統(tǒng),移動(dòng)平臺(tái),圖形開(kāi)發(fā)。-->加微博 ^_^

              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              85 隨筆 :: 0 文章 :: 169 評(píng)論 :: 0 Trackbacks

            如何限制CRichEditCtrl換行
            飄飄白云 2008/03/19


            用WTL在自制的窗口里加了個(gè)文本框,但要限制用戶(hù)輸入不能超過(guò)三行,即便是按enter或alt+enter換行也不能超過(guò)三行,瀏覽了下MSDN,實(shí)現(xiàn)這個(gè)功能,順便mark一下。

            首先創(chuàng)建CRichEditCtrl對(duì)象,創(chuàng)建文本框,并設(shè)置相關(guān)的屬性(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);        
            //在這里設(shè)置將文本框的按鍵消息發(fā)送給父窗口(MSG_WM_NOTIFY)

            然后在父窗口的消息map中添加MSG_WM_NOTIFY的響應(yīng)函數(shù):

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

            然后在OnNotify()中實(shí)現(xiàn)相應(yīng)的處理:

                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;
                }

            這里我們先來(lái)看看LPNMHDR這個(gè)東東(指向一個(gè)NMHDR結(jié)構(gòu)體),NMHDR的聲明如下:

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

            其中hwndFrom就是這個(gè)消息的來(lái)源控件窗口句柄,idFrom就是控件的id,code是消息的通知碼。下面來(lái)看看具體怎么用,先判斷hwndFrom是否就是我們想要監(jiān)控的文本框控件,并且消息的通知碼要是EN_MSGFILTER(MSDN如是說(shuō):
            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.

            文本框控件通過(guò)WM_NOTIFY發(fā)送EN_MSGFILTER通知碼給父窗口,通知父窗口----文本框中有鍵盤(pán)或者鼠標(biāo)事件發(fā)生)

            這樣我們就可以確定這個(gè)消息確是來(lái)自我們想要監(jiān)控的文本框控件的按鍵消息,然后我們就可以把LPNMHDR轉(zhuǎn)換成MSGFILTER指針,來(lái)處理響應(yīng)或讓文本框控件忽略按鍵消息(這是我們?cè)谶@里想要的-如果行數(shù)大于指定數(shù)目,就忽略回車(chē)按鍵消息)。MSGFILTER結(jié)構(gòu)體包含來(lái)自文本框控件的鍵盤(pán)或鼠標(biāo)消息,定義如下:

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


            nmhdr就是前面的講過(guò)的NMHDR結(jié)構(gòu)體,msg是一般的window消息(在這里特指按鍵消息或鼠標(biāo)消息),wParam和lParam就是消息的兩個(gè)參數(shù)。

            我們先判斷是按鍵消息,并且按下的是enter鍵,這是判斷當(dāng)前文本框的行數(shù)是不是已經(jīng)達(dá)到上限,如果是簡(jiǎn)單地將消息的wParam參數(shù)設(shè)置為0,這樣就修改了文本控件回車(chē)按鍵的消息從而達(dá)到控制行數(shù)的目的。

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

               }
            posted on 2008-03-18 23:23 羅朝輝 閱讀(3518) 評(píng)論(2)  編輯 收藏 引用 所屬分類(lèi): Windows

            評(píng)論

            # re: 如何限制文本框換行 2008-05-30 23:04 hoodlum1980
            還有ctrl-v,粘貼,也是需要控制的。  回復(fù)  更多評(píng)論
              

            婷婷伊人久久大香线蕉AV| 青青青青久久精品国产h| 少妇内射兰兰久久| 久久93精品国产91久久综合| 亚洲国产小视频精品久久久三级 | 久久性精品| 国产午夜精品久久久久免费视| 亚洲国产成人久久综合一 | 国产福利电影一区二区三区久久老子无码午夜伦不 | 久久久久久a亚洲欧洲aⅴ| 亚洲国产精品综合久久网络| 精品久久久久久国产| 亚洲中文字幕无码久久2020 | 亚洲色大成网站WWW久久九九| 久久99精品国产麻豆宅宅| 久久99这里只有精品国产| 久久久精品无码专区不卡| 秋霞久久国产精品电影院| 久久精品中文无码资源站| 久久久国产一区二区三区| 99久久免费国产特黄| 日日躁夜夜躁狠狠久久AV| 亚洲日本va午夜中文字幕久久| 天天综合久久久网| 99久久无色码中文字幕| 99精品国产在热久久无毒不卡| 熟妇人妻久久中文字幕| 99久久夜色精品国产网站 | 精品久久人人妻人人做精品 | 伊人久久大香线蕉亚洲| 伊人久久亚洲综合影院| 四虎国产精品成人免费久久| 久久国产综合精品五月天| 国产精品免费久久久久影院| 日韩一区二区久久久久久 | 狠狠色丁香久久婷婷综合图片| 欧美日韩精品久久久免费观看| 人妻无码久久精品| 久久国内免费视频| 伊人色综合久久天天人手人婷| 亚洲国产另类久久久精品小说|