乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Richedit使用大全

       semo_zhang 2012-12-24
       

      Richedit使用大全

      一.常見問題
      a.可以編譯,不能執(zhí)行的
      AfxInitRichEdit();
      b.升級默認(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實際上也是調(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ù)據(jù)粘貼,可通過PasteSpecial選擇性粘貼
      pmyRichEditCtrl->;PasteSpecial(CF_TEXT);
      g.隨著輸入隨著自動滾動條滾動到最后一行
      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)不支持,必須升級)
      SendMessage(EM_SETTEXTMODE,TM_MULTILEVELUNDO,0);
      TM_MULTILEVELUNDO 支持多取消(默認(rèn)值).可通過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 );
      通過設(shè)置PROTECTED實現(xiàn)選中的文本只讀,參見
      http://www./Cpp/controls/richedit/article.php/c2401/
      二.函數(shù)應(yīng)用
      a.設(shè)置字體(主要是通過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 = RGB(255,0,0);//設(shè)置顏色
      cf.dwMask|=CFM_SIZE;
      cf.yHeight =200;//設(shè)置高度
      cf.dwMask|=CFM_FACE;
      strcpy(cf.szFaceName ,_T("隸書"));//設(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 才起作用,項目符號,默認(rèn)用PFN_BULLET
      2 使用阿拉伯?dāng)?shù)字 (1, 2, 3, ...).
      3 使用小寫字母 (a, b, c, ...).
      4 使用大寫字母 (A, B, C, ...).
      5 使用小寫羅馬數(shù)字 (i, ii, iii, ...).
      6 使用大寫羅馬數(shù)字 (I, II, III, ...).
      7 自定義,字符見成員 wNumberingStart.
      PFM_OFFSET 成員 dxOffset 才起作用,縮進,單位twips
      PFM_STARTINDENT 成員 dxStartIndent 才起作用,首行縮進
      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格式,再通過RTF-to-HTML Converter
      http://www./Cpp/controls/richedit/conversions/article.php/c5377/
      h.重載OnProtected函數(shù)得到對應(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.支持鏈接的點擊響應(yīng)
      m_cRichEdit.SetEventMask(ENM_LINK);
      5.響應(yīng)鏈接的點擊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);//這是鏈接文字
      //后面是你的處理過程
      ......
      }
      } b.插入位圖
      http://www./Cpp/controls/richedit/article.php/c2417/
      http://www./Cpp/controls/richedit/article.php/c5383/
      自定義在RichEdit中插入對象的圖標(biāo)
      http://www./user3/jiangsheng/blog/1319738.html
      方法基本同Knowledge Base文章Q220844 HOWTO: Insert a Bitmap Into an RTF Document Using the RichEdit Control
      只是在最后插入之前調(diào)用一下IOleCache::SetData,用一個HGLOBAL作為參數(shù),HGLOBAL里面的數(shù)據(jù)是一個 METAFILEPICT結(jié)構(gòu),包含自己提供的圖片使用CRichEditView::InsertFileAsObject就可以插入圖像。VC++帶有一個例子WordPad。
      另外可以參考“Insert any HBITMAP (Bitmap) in your RichEdit Control”(http://www./richedit/richeditrc.html)。
      c.顯示GIF動畫
      常用的是通過qq的imageole.dll(也有用Gif89.dll的)
      http://www./cooldog/blogview.asp?logID=82
      http://www./richedit/AnimatedEmoticon.asp
      在richedit控件中插入動態(tài)GIF (Native C++版)
      http://blog./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./document/viewdoc/?id=1087
      內(nèi)容包含:實現(xiàn)右鍵菜單,圖片插入,讀取/寫入RTF格式字符串 自定義 CRichEditCtrl 控件
      http://www./document/viewdoc/?id=328
      內(nèi)容包含:鼠標(biāo)右鍵消息,消息映射,字體變換 PS.richedit控件升級到2.0后,先把字體設(shè)為楷體,輸入漢字沒有問題,但輸入字母時,字母自動跳轉(zhuǎn)為Arial字體,而1.0卻沒有這個文題,仍然是用楷體顯示字母
      是一個專門的設(shè)計 Dual-font, Smart font apply, 參見 http://61.186.252.131/Expert/topic/913/913807.xml?temp=.3753778

      注:
      m_edit1代表ID為IDC_EDIT1的CEdit控件的control類型的變量
      m_richedit1代表ID為IDC_RICHEDIT1的CRichEditCtrl控件的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后,如果nStart和nEnd,表明光標(biāo)處于某個位置(直觀來看就是光標(biāo)在閃動);
      如果nStart和nEnd不相等,表明用戶在edit中選中了一段內(nèi)容。
      --------------------------------------------------------------------------------
      3.在edit最后添加字符串
      CString str;
      m_edit1.SetSel(-1, -1);
      m_edit1.ReplaceSel(str);
      --------------------------------------------------------------------------------
      4.隨輸入自動滾動到最后一行(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派生一個類,添加WM_CHAR消息映射。下面一個例子實現(xiàn)了限定輸入16進制字符的功能。
      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自動為寬字符(WideChar),所以它可以解決中文亂碼以及一些漢字問題
      方法一:(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.
      方法二:以對話框為例:
      (1) 增加一全局變量 HMODULE hMod;
      (2) 在CxxxApp::InitInstance()中添加一句hMod = LoadLibrary(_T("riched20.dll"));
      在CxxxApp::ExitInstance()中添加一句FreeLibrary(hMod);
      (3) 在對話框上放一個richedit,文本方式打開.rc文件修改該richedit控件的類名"RICHEDIT" to "RichEdit20a".
      (4) 在對話框頭文件添加 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 = RGB(200, 100, 255); //文字顏色
      strcpy(cf.szFaceName ,_T("隸書"));//設(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./Cpp/controls/richedit/article.php/c2417/
      http://www./Cpp/controls/richedit/article.php/c5383/
      --------------------------------------------------------------------------------
      11.richedit插入gif動畫
      http://www./richedit/AnimatedEmoticon.asp
      --------------------------------------------------------------------------------
      12.richedit嵌入ole對象
      http://support.microsoft.com/kb/141549/en-us
      --------------------------------------------------------------------------------
      13.使richedit選中內(nèi)容只讀
      http://www./cpp/controls/richedit/article.php/c2401/
      --------------------------------------------------------------------------------
      14.打印richedit
      http://www./MFC/RichEdit3.htm
      --------------------------------------------------------------------------------
      15.richeidt用于聊天消息窗口
      http://www./document/viewdoc/?id=1087
      http://www./richedit/chatrichedit.asp
      http://www./Cpp/controls/richedit/article.php/c2395/
      --------------------------------------------------------------------------------
      16.解決richedit的EN_SETFOCUS和EN_KILLFOCUS無響應(yīng)的問題
      http://support.microsoft.com/kb/181664/en-us
      --------------------------------------------------------------------------------
      17.richedit拼寫檢查
      http://www./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è)置焦點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中回車時,會退出對話框
      選中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. 動態(tài)創(chuàng)建的edit沒有邊框的問題
      m_edit.Create(....);
      m_edit.ModifyStyleEx(0, WS_EX_CLIENTEDGE, SWP_DRAWFRAME);
      --------------------------------------------------------------------------------
      22. 一個能顯示RTF,ole(包括gif, wmv,excel ,ppt)的例子
      http://www./richedit/COleRichEditCtrl.asp

      轉(zhuǎn)載:http://bbs./viewthread.php?tid=1806

      三、個人的一點東西(實例)

      初始化:AfxInitRichEdit2();

      窗口中兩個RichEditCtrl對應(yīng):

      CRichEditCtrl m_rtdRecv; //接收窗口
      CRichEditCtrl m_rtdSend; //發(fā)送窗口

      //設(shè)置richEdit窗口屬性
      void CDemoDlgMsg::SetRichEditStyle()
      {
      /*設(shè)置相關(guān)控件的一些屬性*/
      m_rtdRecv.SetAutoURLDetect(TRUE);
      m_rtdRecv.SetEventMask(ENM_CHANGE);
      USES_CONVERSION;
      /*設(shè)置聊天編輯框和信息顯示框的字體屬性*/
      //m_cfDefault.cbSize = sizeof(CHARFORMAT);
      //m_cfDefault.dwMask = CFM_BOLD|CFM_COLOR|CFM_FACE|CFM_ITALIC|CFM_UNDERLINE;
      //m_cfDefault.dwEffects = CFE_BOLD|CFE_ITALIC|CFE_UNDERLINE;
      //m_cfDefault.yHeight = 20*1440/96;
      //m_cfDefault.yOffset = 0;
      //m_cfDefault.crTextColor = RGB(255,0,0);
      //m_cfDefault.bCharSet = 0;
      //m_cfDefault.bPitchAndFamily = 0;
      //strcpy(W2A(m_cfDefault.szFaceName), "宋體");
      m_cfDefault.cbSize = sizeof(CHARFORMAT);
      m_rtdRecv.GetDefaultCharFormat(m_cfDefault);
      m_cfDefault.yHeight = 200;
      m_cfDefault.dwEffects = 0;
      m_cfDefault.crTextColor = RGB(0, 0, 255);
      m_rtdRecv.SetDefaultCharFormat(m_cfDefault);
      m_rtdRecv.LimitText(1024);
      m_rtdSend.SetDefaultCharFormat(m_cfDefault);
      m_rtdSend.LimitText(1024);
      }
      //顯示接收窗口消息
      void CDemoDlgMsg::ShowRecvText(CString str)
      {
      /*如果需要換行顯示*/
      m_rtdRecv.ReplaceSel(str);
      m_rtdRecv.SetSel(-1, -1);
      m_rtdRecv.ReplaceSel(L"\r\n");
      }

       

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多