• <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>
            面對(duì)現(xiàn)實(shí),超越自己
            逆水行舟,不進(jìn)則退
            posts - 269,comments - 32,trackbacks - 0

            .常見(jiàn)問(wèn)題

            a.
            可以編譯,不能執(zhí)行的
            AfxInitRichEdit();

            b.
            升級(jí)默認(rèn)的Riched版本(默認(rèn)的有一些bug),如
            可在InitInstance中添加
            LoadLibrary("RICHED20.DLL")
            最后注意 FreeLibrary 如果是CRichEditView基類的可用
            BOOL CXXXXXXView::PreCreateWindow(CREATESTRUCT& cs)
            {
            //
            裝入rich edit version 2.0
            if (LoadLibraryA("RICHED20.DLL") == NULL)
            {
            AfxMessageBox(_T("Fail to load \"riched20.dll\"."),MB_OK | MB_ICONERROR);
            PostMessage(WM_QUIT,0,0);
            return FALSE;
            } m_strClass = RICHEDIT_CLASSA;//for 2.0 class return CRichEditView::PreCreateWindow(cs);
            }

            c.
            最后追加行
            richeditctrl.SetSel(-1, -1);
            richeditctrl.ReplaceSel( (LPCTSTR)str );

            d.
            字?jǐn)?shù)限制
            CRichEditCtrl::LimitText(long nChars)

            e.
            換行切換
            CRichEditView
            OnInitialUpdate()函數(shù)中加入下面兩句:
            m_nWordWrap = WrapNone;
            WrapChanged();
            WrapChanged
            實(shí)際上也是調(diào)用
            ctrl.SetTargetDevice(NULL, 1); //m_nWordWrap == WrapNone
            ctrl.SetTargetDevice(NULL, 0); //m_nWordWrap == WrapToWindow

            還有不常用的 m_nWordWrap == WrapToTargetDevice
            ctrl.SetTargetDevice(m_dcTarget, GetPrintWidth());
            如果是在Dialog中,可使用SetTargetDevice,注意在屬性里面加上want return f.有時(shí)候不希望帶格式的數(shù)據(jù)粘貼,可通過(guò)PasteSpecial選擇性粘貼
            pmyRichEditCtrl->;PasteSpecial(CF_TEXT);

            g.
            隨著輸入隨著自動(dòng)滾動(dòng)條滾動(dòng)到最后一行
            int nFirstVisible = pmyRichEditCtrl->GetFirstVisibleLine();
            if (nFirstVisible > 0)
            {
            pmyRichEditCtrl->LineScroll(-nFirstVisible, 0);
            }

            m_cRichEdit.PostMessage(WM_VSCROLL, SB_BOTTOM,0);

            h.
            設(shè)置UNDO的次數(shù)(只能用在RICHED20以上,即默認(rèn)不支持,必須升級(jí))
            SendMessage(EM_SETTEXTMODE,TM_MULTILEVELUNDO,0);
            TM_MULTILEVELUNDO
            支持多取消(默認(rèn)值).可通過(guò)EM_SETUNDOLIMIT設(shè)置最大次數(shù)
            SendMessage(EM_SETUNDOLIMIT,100,0); i.
            響應(yīng)OnChange
            EM_SETEVENTMASK
            設(shè)置 ENM_CHANGE
            long lMask = GetEventMask();
            lMask |= ENM_CHANGE;
            lMask &= ~ENM_PROTECTED;
            SetEventMask(lMask); j.
            設(shè)置只讀
            CRichEditCtrl::SetReadOnly( BOOL bReadOnly = TRUE );
            通過(guò)設(shè)置PROTECTED實(shí)現(xiàn)選中的文本只讀,參見(jiàn)
            http://www.codeguru.com/Cpp/controls/richedit/article.php/c2401/

            .函數(shù)應(yīng)用

            a.
            設(shè)置字體(主要是通過(guò)SetSelectionCharFormat
            CHARFORMAT cf;
            ZeroMemory(&cf, sizeof(CHARFORMAT));
            cf.cbSize = sizeof(CHARFORMAT);
            cf.dwMask|=CFM_BOLD;
            cf.dwEffects|=CFE_BOLD;//
            設(shè)置粗體,取消用cf.dwEffects&=~CFE_BOLD;
            cf.dwMask|=CFM_ITALIC;
            cf.dwEffects|=CFE_ITALIC;//
            設(shè)置斜體,取消用cf.dwEffects&=~CFE_ITALIC;
            cf.dwMask|=CFM_UNDERLINE;
            cf.dwEffects|=CFE_UNDERLINE;//
            設(shè)置斜體,取消用cf.dwEffects&=~CFE_UNDERLINE;
            cf.dwMask|=CFM_COLOR;
            cf.crTextColor = #ff0000;//
            設(shè)置顏色
            cf.dwMask|=CFM_SIZE;
            cf.yHeight =200;//
            設(shè)置高度
            cf.dwMask|=CFM_FACE;
            strcpy(cf.szFaceName ,_T("
            隸書(shū)"));//設(shè)置字體
            rich.SetSelectionCharFormat(cf);

            b.
            設(shè)置字體的行間距
            要用richedit2.0以上
            試試
            PARAFORMAT2 pf;
            pf.cbSize = sizeof(PARAFORMAT2);
            pf.dwMask = PFM_NUMBERING | PFM_OFFSET;
            pf.wNumbering = PFN_BULLET;//
            注意PFM_NUMBERING
            pf.dxOffset = 10;
            VERIFY(SetParaFormat(pf));
            常用的dwMask
            PFM_NUMBERING
            成員 wNumbering 才起作用,項(xiàng)目符號(hào),默認(rèn)用PFN_BULLET
            2
            使用阿拉伯?dāng)?shù)字 (1, 2, 3, ...).
            3
            使用小寫(xiě)字母 (a, b, c, ...).
            4
            使用大寫(xiě)字母 (A, B, C, ...).
            5
            使用小寫(xiě)羅馬數(shù)字 (i, ii, iii, ...).
            6
            使用大寫(xiě)羅馬數(shù)字 (I, II, III, ...).
            7
            自定義,字符見(jiàn)成員 wNumberingStart.

            PFM_OFFSET
            成員 dxOffset 才起作用,縮進(jìn),單位twips
            PFM_STARTINDENT
            成員 dxStartIndent 才起作用,首行縮進(jìn)
            PFM_SPACEAFTER
            成員 dySpaceAfter 才起作用,段間距
            PFM_LINESPACING
            成員 dyLineSpacing 才起作用,行間距

            c.
            設(shè)置CRichEditCtrl(2.0)背景透明
            long style = ::GetWindowLong(GetSafeHwnd(), GWL_EXSTYLE);
            style &= WS_EX_TRANSPARENT;
            ::SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE, style);
            CreateEx,然后把WS_EX_TRANSPARENT樣式加上 e.得到內(nèi)容有三種

            1)GetWindowText

            2)
            使用EM_GETTEXTEX
            GETTEXTEX gt;
            gt.cb = 200;
            gt.flags = GT_DEFAULT;
            gt.codepage = CP_ACP ;
            gt.lpDefaultChar = NULL;
            gt.lpUsedDefChar = NULL;
            SendMessage(EM_GETTEXTEX,(WPARAM)>,(LPARAM)text);

            3)StreamOut(
            主要用于RTF等格式輸出)
            static DWORD CALLBACK
            MyStreamOutCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
            {
            CFile* pFile = (CFile*) dwCookie; pFile->Write(pbBuff, cb);
            *pcb = cb; return 0;
            }
            CFile cFile(TEXT("myfile.rtf"), CFile::modeCreate|CFile::modeWrite);
            EDITSTREAM es;
            es.dwCookie = (DWORD) &cFile;//
            設(shè)置用例參數(shù),以便回調(diào)函數(shù)調(diào)用
            es.pfnCallback = MyStreamOutCallback;
            pmyRichEditCtrl->StreamOut(SF_RTF, es);
            讀入可以此類推,SetWindowText,EM_SETTEXTEX,StreamIn f.查找字符串
            FINDTEXTEX ft;
            ft.chrg.cpMin = 0;
            ft.chrg.cpMax = -1;
            ft.lpstrText = "|";
            long lPos = FindText(0, &ft);
            如果要繼續(xù)查找,修改cpMin,
            int nCount = 0;
            do
            {
            long lPos = GetRichEditCtrl().FindText(0, &ft);
            if( -1 == lPos) break;
            ft.chrg.cpMin = lPos + strlen(ft.lpstrText);
            ++nCount;
            }while(TRUE); g.
            Html格式保存
            目前做法可先轉(zhuǎn)為RTF格式,再通過(guò)RTF-to-HTML Converter
            http://www.codeguru.com/Cpp/controls/richedit/conversions/article.php/c5377/

            h.
            重載OnProtected函數(shù)得到對(duì)應(yīng)的消息,如粘貼等
            void CMYichEditorView::OnProtected(NMHDR* pNMHDR, LRESULT* pResult)
            {
            ENPROTECTED* pEP = (ENPROTECTED*)pNMHDR;switch (pEP->msg) {
            case WM_KEYDOWN://
            按鍵,判斷pEP->wParam
            case WM_PASTE://
            粘貼
            case WM_CUT://
            剪切
            case EM_SETCHARFORMAT:
            default:
            break;
            };

            *pResult = FALSE;
            }

            .聊天常用
            a.LINK
            鏈接功能

            1.LoadLibrary(_T("Riched20.dll"));

            2.
            創(chuàng)建RichEdit2.0控件
            CreateEx(0, _T("RichEdit20A"), NULL, WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_TABSTOP
            |ES_READONLY|ES_WANTRETURN|ES_MULTILINE,
            rect.left, rect.top, cx, cy,
            pParentWnd->m_hWnd, (HMENU)nID, NULL);

            3.
            設(shè)定選中的文字為鏈接顯示
            CHARFORMAT2 cf2;
            ZeroMemory(&cf2, sizeof(CHARFORMAT2));//
            cf2.cbSize = sizeof(CHARFORMAT2);
            cf2.dwMask = CFM_LINK;
            cf2.dwEffects |= CFE_LINK;
            m_cRichEdit.SendMessage(EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf2);

            4.
            支持鏈接的點(diǎn)擊響應(yīng)
            m_cRichEdit.SetEventMask(ENM_LINK);

            5.
            響應(yīng)鏈接的點(diǎn)擊EN_LINK BEGIN_MESSAGE_MAP(CMyRichEdit, CRichEditCtrl)
            ON_NOTIFY_REFLECT(EN_LINK,OnURL)
            END_MESSAGE_MAP()
            ...... void CMyRichEdit::OnURLClick(NMHDR *pNmhdr, LRESULT *pResult)
            {
            TCHAR LinkChar[512];
            ENLINK *pLink = (ENLINK *)pNmhdr;
            if (pLink->msg == WM_LBUTTONUP)
            {
            SetSel(penLink->chrg);//
            這是鏈接的文字范圍
            long Res = GetSelText((char *)LinkChar);//
            這是鏈接文字
            //
            后面是你的處理過(guò)程
            ......
            }
            } b.
            插入位圖
            http://www.codeguru.com/Cpp/controls/richedit/article.php/c2417/
            http://www.codeguru.com/Cpp/controls/richedit/article.php/c5383/

            自定義在RichEdit中插入對(duì)象的圖標(biāo)
            http://www.blogcn.com/user3/jiangsheng/blog/1319738.html
            方法基本同Knowledge Base文章Q220844 HOWTO: Insert a Bitmap Into an RTF Document Using the RichEdit Control
            只是在最后插入之前調(diào)用一下IOleCache::SetData,用一個(gè)HGLOBAL作為參數(shù),HGLOBAL里面的數(shù)據(jù)是一個(gè)METAFILEPICT結(jié)構(gòu),包含自己提供的圖片 使用CRichEditView::InsertFileAsObject就可以插入圖像。VC++帶有一個(gè)例子WordPad
            另外可以參考“Insert any HBITMAP (Bitmap) in your RichEdit Control”(http://www.codeguru.com/richedit/richeditrc.html)

            c.
            顯示GIF動(dòng)畫(huà)
            常用的是通過(guò)qqimageole.dll(也有用Gif89.dll)
            http://www.xiaozhou.net/cooldog/blogview.asp?logID=82
            http://www.codeproject.com/richedit/AnimatedEmoticon.asp

            richedit控件中插入動(dòng)態(tài)GIF (Native C++)
            http://blog.joycode.com/jiangsheng/archive/2004/12/15/41209.aspx

            d.IRichEditOleCallback
            的使用
            http://61.186.252.131/Expert/topic/905/905844.xml?temp=.8379022

            類似 MSN 信息發(fā)送框的制作()
            http://www.vckbase.com/document/viewdoc/?id=1087
            內(nèi)容包含:實(shí)現(xiàn)右鍵菜單,圖片插入,讀取/寫(xiě)入RTF格式字符串 自定義 CRichEditCtrl 控件
            http://www.vckbase.com/document/viewdoc/?id=328
            內(nèi)容包含:鼠標(biāo)右鍵消息,消息映射,字體變換 PS.richedit控件升級(jí)到2.0后,先把字體設(shè)為楷體,輸入漢字沒(méi)有問(wèn)題,但輸入字母時(shí),字母自動(dòng)跳轉(zhuǎn)為Arial字體,而1.0卻沒(méi)有這個(gè)文題,仍然是用楷體顯示字母
            是一個(gè)專門(mén)的設(shè)計(jì) Dual-font, Smart font apply, 參見(jiàn)http://61.186.252.131/Expert/topic/913/913807.xml?temp=.3753778

            注:
            m_edit1
            代表IDIDC_EDIT1CEdit控件的control類型的變量
            m_richedit1
            代表IDIDC_RICHEDIT1CRichEditCtrl控件的control類型的變量


            --------------------------------------------------------------------------------
            1.
            設(shè)置edit只讀屬性

            方法一:
            m_edit1.SetReadOnly(TRUE);
            方法二:
            ::SendMessage(m_edit1.m_hWnd, EM_SETREADONLY, TRUE, 0);


            --------------------------------------------------------------------------------
            2.
            判斷edit中光標(biāo)狀態(tài)并得到選中內(nèi)容(richedit同樣適用)

            int nStart, nEnd;
            CString strTemp;

            m_edit1.GetSel(nStart, nEnd);
            if(nStart == nEnd)
            {
            strTemp.Format(_T("
            光標(biāo)在%d"), nStart);
            AfxMessageBox(strTemp);
            }
            else
            {
            //
            得到edit選中的內(nèi)容
            m_edit1.GetWindowText(strTemp);
            strTemp = strTemp.Mid(nStart) - strTemp.Mid(nEnd);
            AfxMessageBox(strTemp);
            }
            注:GetSel后,如果nStartnEnd,表明光標(biāo)處于某個(gè)位置(直觀來(lái)看就是光標(biāo)在閃動(dòng));
            如果nStartnEnd不相等,表明用戶在edit中選中了一段內(nèi)容。


            --------------------------------------------------------------------------------
            3.
            edit最后添加字符串

            CString str;
            m_edit1.SetSel(-1, -1);
            m_edit1.ReplaceSel(str);


            --------------------------------------------------------------------------------
            4.
            隨輸入自動(dòng)滾動(dòng)到最后一行(richedit同樣適用)

            方法一:(摘自msdn
            // The pointer to my edit.
            extern CEdit* pmyEdit;
            int nFirstVisible = pmyEdit->GetFirstVisibleLine();

            // Scroll the edit control so that the first visible line
            // is the first line of text.
            if (nFirstVisible > 0)
            {
            pmyEdit->LineScroll(-nFirstVisible, 0);
            }
            方法二:
            m_richedit.PostMessage(WM_VSCROLL, SB_BOTTOM, 0);


            --------------------------------------------------------------------------------
            5.
            如何限制edit輸入指定字符

            可以從CEdit派生一個(gè)類,添加WM_CHAR消息映射。下面一個(gè)例子實(shí)現(xiàn)了限定輸入16進(jìn)制字符的功能。

            void CMyHexEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
            {
            if ( (nChar >= '0' && nChar <= '9') ||
            (nChar >= 'a' && nChar <= 'f') ||
            (nChar >= 'A' && nChar <= 'F') ||
            nChar == VK_BACK ||
            nChar == VK_DELETE) //msdn
            virtual key
            {
            CEdit::OnChar(nChar, nRepCnt, nFlags);
            }
            }


            --------------------------------------------------------------------------------
            6.
            如何使用richedit

            添加AfxInitRichEdit();
            CxxxApp::InitInstance()
            {
            AfxInitRichEdit();
            .............
            }

            AfxInitRichEdit()
            功能:裝載 RichEdit 1.0 Control (RICHED32.DLL).


            --------------------------------------------------------------------------------
            7.
            如何使用richedit2.0 or richedit3.0

            使用原因:由于RichEdit2.0A自動(dòng)為寬字符(WideChar),所以它可以解決中文亂碼以及一些漢字問(wèn)題

            方法一:(msdn上的做法,適用于用VC.NET及以后版本創(chuàng)建的工程)
            To update rich edit controls in existing Visual C++ applications to version 2.0,
            open the .RC file as text, change the class name of each rich edit control from "RICHEDIT" to"RichEdit20a".
            Then replace the call to AfxInitRichEdit with AfxInitRichEdit2.
            方法二:以對(duì)話框?yàn)槔?/span>
            (1)
            增加一全局變量 HMODULE hMod;
            (2)
            CxxxApp::InitInstance()中添加一句hMod = LoadLibrary(_T("riched20.dll"));
            CxxxApp::ExitInstance()中添加一句FreeLibrary(hMod);
            (3)
            在對(duì)話框上放一個(gè)richedit,文本方式打開(kāi).rc文件修改該richedit控件的類名"RICHEDIT" to"RichEdit20a".
            (4)
            在對(duì)話框頭文件添加 CRichEditCtrl m_richedit;
            OnInitDialog中添加 m_richedit.SubclassDlgItem(IDC_RICHEDIT1, this);


            --------------------------------------------------------------------------------
            8.
            改變richedit指定區(qū)域的顏色及字體
            CHARFORMAT cf;
            ZeroMemory(&cf, sizeof(CHARFORMAT));
            cf.cbSize = sizeof(CHARFORMAT);
            cf.dwMask = CFM_BOLD | CFM_COLOR | CFM_FACE |
            CFM_ITALIC | CFM_SIZE | CFM_UNDERLINE;
            cf.dwEffects = 0;
            cf.yHeight = 12*12;//
            文字高度
            cf.crTextColor = #c864ff; //
            文字顏色
            strcpy(cf.szFaceName ,_T("
            隸書(shū)"));//設(shè)置字體

            m_richedit1.SetSel(1, 5); //
            設(shè)置處理區(qū)域
            m_richedit1.SetSelectionCharFormat(cf);


            --------------------------------------------------------------------------------
            9.
            設(shè)置行間距(只適用于richedit2.0

            PARAFORMAT2 pf;
            pf2.cbSize = sizeof(PARAFORMAT2);
            pf2.dwMask = PFM_LINESPACING | PFM_SPACEAFTER;
            pf2.dyLineSpacing = 200;
            pf2.bLineSpacingRule= 4;
            m_richedit.SetParaFormat(pf2);


            --------------------------------------------------------------------------------
            10.richedit
            插入位圖

            Q220844
            How to insert a bitmap into an RTF document using the RichEdit control in Visual C++ 6.0
            http://support.microsoft.com/default.aspx?scid=kb;en-us;220844
            http://www.codeguru.com/Cpp/controls/richedit/article.php/c2417/
            http://www.codeguru.com/Cpp/controls/richedit/article.php/c5383/


            --------------------------------------------------------------------------------
            11.richedit
            插入gif動(dòng)畫(huà)

            http://www.codeproject.com/richedit/AnimatedEmoticon.asp


            --------------------------------------------------------------------------------
            12.richedit
            嵌入ole對(duì)象

            http://support.microsoft.com/kb/141549/en-us


            --------------------------------------------------------------------------------
            13.
            使richedit選中內(nèi)容只讀

            http://www.codeguru.com/cpp/controls/richedit/article.php/c2401/


            --------------------------------------------------------------------------------
            14.
            打印richedit

            http://www.protext.com/MFC/RichEdit3.htm


            --------------------------------------------------------------------------------
            15.richeidt
            用于聊天消息窗口

            http://www.vckbase.com/document/viewdoc/?id=1087
            http://www.codeproject.com/richedit/chatrichedit.asp
            http://www.codeguru.com/Cpp/controls/richedit/article.php/c2395/


            --------------------------------------------------------------------------------
            16.
            解決richeditEN_SETFOCUSEN_KILLFOCUS無(wú)響應(yīng)的問(wèn)題

            http://support.microsoft.com/kb/181664/en-us


            --------------------------------------------------------------------------------
            17.richedit
            拼寫(xiě)檢查

            http://www.codeproject.com/com/AutoSpellCheck.asp


            --------------------------------------------------------------------------------
            18.
            改變edit背景色

            Q117778
            How to change the background color of an MFC edit control
            http://support.microsoft.com/kb/117778/en-us


            --------------------------------------------------------------------------------
            19.
            當(dāng)edit控件的父窗口屬性是帶標(biāo)題欄WS_CAPTION和子窗口WS_CHILD時(shí),不能設(shè)置焦點(diǎn)SetFocus

            Q230587
            PRB: Can't Set Focus to an Edit Control When its Parent Is an Inactive Captioned Child Window

            http://support.microsoft.com/kb/230587/en-us



            --------------------------------------------------------------------------------
            20.
            Edit中回車(chē)時(shí),會(huì)退出對(duì)話框

            選中Edit的風(fēng)格Want Return

            MSDN
            的解釋如下:
            ES_WANTRETURN Specifies that a carriage return be inserted when the user presses the ENTER key while entering text into a multiple-line edit control in a dialog box. Without this style, pressing the ENTER key has the same effect as pressing the dialog box's default pushbutton. This style has no effect on a single-line edit control.


            --------------------------------------------------------------------------------
            21.
            動(dòng)態(tài)創(chuàng)建的edit沒(méi)有邊框的問(wèn)題

            m_edit.Create(....);
            m_edit.ModifyStyleEx(0, WS_EX_CLIENTEDGE, SWP_DRAWFRAME);

            --------------------------------------------------------------------------------
            22.
            一個(gè)能顯示RTFole(包括gif wmvexcel ppt)的例子

            http://www.codeproject.com/richedit/COleRichEditCtrl.asp

            本文
            轉(zhuǎn)自:http://blog.sina.com.cn/s/blog_6285b6f60100l409.html

            posted on 2013-08-21 08:42 王海光 閱讀(14584) 評(píng)論(0)  編輯 收藏 引用 所屬分類: MFC
            99久久婷婷国产一区二区 | 久久亚洲精品视频| 青青国产成人久久91网| 久久精品国产精品青草| 国产高潮国产高潮久久久91 | 性做久久久久久久久久久| 国产精品久久久久久久久久影院| 久久综合给合久久国产免费| 久久美女人爽女人爽| 亚洲国产日韩欧美综合久久| 日日噜噜夜夜狠狠久久丁香五月| 日本精品久久久中文字幕| 亚洲国产日韩欧美综合久久| 国产精品女同久久久久电影院| 国内精品久久久久影院网站| 亚洲午夜久久久久久久久久| 国产高潮国产高潮久久久| 久久久久国色AV免费观看| 久久精品aⅴ无码中文字字幕重口| 国内精品久久久久久久久 | 嫩草影院久久99| 亚洲日本久久久午夜精品| 99久久婷婷免费国产综合精品| 久久国产精品免费一区二区三区| 一本一本久久aa综合精品| 国产精品久久久久乳精品爆 | 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 国产美女亚洲精品久久久综合| 四虎国产永久免费久久| 中文字幕久久精品无码| 国产精品成人99久久久久| 老色鬼久久亚洲AV综合| 久久亚洲欧洲国产综合| 久久电影网一区| 亚洲国产精品无码久久| 综合久久一区二区三区 | 亚洲综合伊人久久大杳蕉| 久久国产精品免费一区二区三区| 久久香综合精品久久伊人| 欧美久久久久久| 亚洲另类欧美综合久久图片区|