青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

CRichEditCtrl 超文本編輯 [轉]

一.常見問題
a.可以編譯,不能執行的
AfxInitRichEdit();

b.升級默認的Riched版本(默認的有一些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 );

顯示回車換行:

設屬性:"Multi lines"選為True。

設屬性:"want return "選為True。

d.字數限制
CRichEditCtrl::LimitText(long nChars)

e.換行切換
CRichEditView的OnInitialUpdate()函數中加入下面兩句:
m_nWordWrap = WrapNone;
WrapChanged();
WrapChanged實際上也是調用
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.有時候不希望帶格式的數據粘貼,可通過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.設置UNDO的次數(只能用在RICHED20以上,即默認不支持,必須升級)
SendMessage(EM_SETTEXTMODE,TM_MULTILEVELUNDO,0);
TM_MULTILEVELUNDO 支持多取消(默認值).可通過EM_SETUNDOLIMIT設置最大次數
SendMessage(EM_SETUNDOLIMIT,100,0);

i.響應OnChange
EM_SETEVENTMASK 設置 ENM_CHANGE
long lMask = GetEventMask();
lMask |= ENM_CHANGE;
lMask &= ~ENM_PROTECTED;
SetEventMask(lMask);

j.設置只讀
CRichEditCtrl::SetReadOnly( BOOL bReadOnly = TRUE );
通過設置PROTECTED實現選中的文本只讀,參見
http://www.codeguru.com/Cpp/controls/richedit/article.php/c2401/

 

二.函數應用
a.設置字體(主要是通過SetSelectionCharFormat)

CHARFORMAT cf;
ZeroMemory(&cf, sizeof(CHARFORMAT));
cf.cbSize = sizeof(CHARFORMAT);
cf.dwMask|=CFM_BOLD;
cf.dwEffects|=CFE_BOLD;//設置粗體,取消用cf.dwEffects&=~CFE_BOLD;
cf.dwMask|=CFM_ITALIC;
cf.dwEffects|=CFE_ITALIC;//設置斜體,取消用cf.dwEffects&=~CFE_ITALIC;
cf.dwMask|=CFM_UNDERLINE;
cf.dwEffects|=CFE_UNDERLINE;//設置斜體,取消用cf.dwEffects&=~CFE_UNDERLINE;
cf.dwMask|=CFM_COLOR;
cf.crTextColor = RGB(255,0,0);//設置顏色
cf.dwMask|=CFM_SIZE;
cf.yHeight =200;//設置高度
cf.dwMask|=CFM_FACE;
strcpy(cf.szFaceName ,_T("隸書"));//設置字體
rich.SetSelectionCharFormat(cf);

b.設置字體的行間距
要用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 才起作用,項目符號,默認用PFN_BULLET
2 使用阿拉伯數字 (1, 2, 3, ...). 
3 使用小寫字母 (a, b, c, ...). 
4 使用大寫字母 (A, B, C, ...). 
5 使用小寫羅馬數字 (i, ii, iii, ...). 
6 使用大寫羅馬數字 (I, II, III, ...). 
7 自定義,字符見成員 wNumberingStart. 
PFM_OFFSET 成員 dxOffset 才起作用,縮進,單位twips
PFM_STARTINDENT 成員 dxStartIndent 才起作用,首行縮進
PFM_SPACEAFTER 成員 dySpaceAfter 才起作用,段間距
PFM_LINESPACING 成員 dyLineSpacing 才起作用,行間距

c.設置CRichEditCtrl(2.0)背景透明
long style = ::GetWindowLong(GetSafeHwnd(), GWL_EXSTYLE);
style &= WS_EX_TRANSPARENT;
::SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE, style);
或 CreateEx,然后把WS_EX_TRANSPARENT樣式加上

e.得到內容有三種
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;//設置用例參數,以便回調函數調用
   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);

如果要繼續查找,修改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格式保存
目前做法可先轉為RTF格式,再通過RTF-to-HTML Converter
http://www.codeguru.com/Cpp/controls/richedit/conversions/article.php/c5377/

h.重載OnProtected函數得到對應的消息,如粘貼等
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. 創建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. 設定選中的文字為鏈接顯示
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.支持鏈接的點擊響應
m_cRichEdit.SetEventMask(ENM_LINK);


5.響應鏈接的點擊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.codeguru.com/Cpp/controls/richedit/article.php/c2417/
http://www.codeguru.com/Cpp/controls/richedit/article.php/c5383/

自定義在RichEdit中插入對象的圖標
http://www.blogcn.com/user3/jiangsheng/blog/1319738.html
方法基本同Knowledge Base文章Q220844 HOWTO: Insert a Bitmap Into an RTF Document Using the RichEdit Control
只是在最后插入之前調用一下IOleCache::SetData,用一個HGLOBAL作為參數,HGLOBAL里面的數據是一個METAFILEPICT結構,包含自己提供的圖片

使用CRichEditView::InsertFileAsObject就可以插入圖像。VC++帶有一個例子WordPad。
另外可以參考“Insert any HBITMAP (Bitmap) in your RichEdit Control”(http://www.codeguru.com/richedit/richeditrc.html)。

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

在richedit控件中插入動態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 信息發送框的制作(上)
http://www.vckbase.com/document/viewdoc/?id=1087
內容包含:實現右鍵菜單,圖片插入,讀取/寫入RTF格式字符串

自定義 CRichEditCtrl 控件
http://www.vckbase.com/document/viewdoc/?id=328
內容包含:鼠標右鍵消息,消息映射,字體變換

PS.richedit控件升級到2.0后,先把字體設為楷體,輸入漢字沒有問題,但輸入字母時,字母自動跳轉為Arial字體,而1.0卻沒有這個文題,仍然是用楷體顯示字母
是一個專門的設計 Dual-font, Smart font apply, 參見 http://61.186.252.131/Expert/topic/913/913807.xml?temp=.3753778

posted on 2010-08-01 21:06 wrh 閱讀(581) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


導航

<2010年7月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

統計

常用鏈接

留言簿(19)

隨筆檔案

文章檔案

收藏夾

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产啪精品视频| 老司机午夜精品视频| 欧美成人午夜激情视频| 免费永久网站黄欧美| 久久手机精品视频| 欧美激情视频给我| 日韩视频国产视频| 亚洲欧美国产毛片在线| 午夜欧美精品| 久久亚洲综合色| 欧美日韩国产成人在线91| 欧美色视频在线| 国产在线观看精品一区二区三区 | 性欧美激情精品| 亚洲毛片视频| 亚洲欧美另类中文字幕| 久久精品国产一区二区三区免费看| 一区二区三区四区五区视频 | 欧美日韩一区在线| 欧美午夜在线观看| 一区二区三区中文在线观看 | 亚洲精品日韩在线| 亚洲午夜小视频| 久久久噜噜噜| 夜色激情一区二区| 久久青草久久| 国产精品亚洲第一区在线暖暖韩国| 久久精品九九| 欧美午夜精品久久久久久人妖| 久久久久久日产精品| 欧美精品一区二区在线观看 | 亚洲卡通欧美制服中文| 亚洲午夜电影| 免费视频亚洲| 国产亚洲成人一区| 亚洲综合导航| 亚洲韩国青草视频| 欧美一站二站| 国产精品美女主播| 亚洲天堂免费在线观看视频| 蜜臀va亚洲va欧美va天堂| 亚洲网站在线看| 欧美男人的天堂| 亚洲国产另类 国产精品国产免费| 国产有码在线一区二区视频| 亚洲欧洲另类| 欧美成人精品一区二区| 久久精品国产成人| 国产亚洲精品久久久久婷婷瑜伽| 国产精品久久一区二区三区| 日韩午夜精品| 亚洲国产经典视频| 美腿丝袜亚洲色图| 亚洲电影在线免费观看| 久久资源在线| 久久久久久香蕉网| 在线观看一区欧美| 久久综合九色综合网站| 校园春色综合网| 国产亚洲精品aa| 久久国产欧美精品| 久久精品免费| 精品69视频一区二区三区| 香港久久久电影| 一区二区欧美在线观看| 欧美激情亚洲精品| 亚洲欧洲精品一区二区三区波多野1战4 | 欧美一级视频免费在线观看| 国产精品都在这里| 亚洲一区亚洲二区| 亚洲影音一区| 狠狠色丁香婷婷综合| 欧美成人免费观看| 久久夜色精品国产噜噜av| 原创国产精品91| 亚洲国产欧美日韩| 国产精品v欧美精品v日韩精品| 久久亚洲一区二区三区四区| 好看的亚洲午夜视频在线| 久久综合狠狠| 欧美不卡视频| 亚洲免费网址| 久久精品欧美| 亚洲精品在线观看免费| 日韩一级免费观看| 国模私拍视频一区| 亚洲欧洲日韩在线| 欧美亚州在线观看| 久久久蜜桃一区二区人| 麻豆精品一区二区综合av| 9久草视频在线视频精品| 一区二区三区日韩精品| 国产午夜亚洲精品不卡| 欧美国产激情| 国产日韩亚洲欧美| 亚洲国产欧洲综合997久久| 欧美日韩高清一区| 久久久国际精品| 欧美日韩精品久久| 蜜臀久久99精品久久久久久9| 一本色道久久综合狠狠躁篇怎么玩| 久久成人免费网| 激情综合自拍| 亚洲视频精品在线| 亚洲激情亚洲| 欧美一级二区| 亚洲视频精品在线| 久久在线视频| 欧美在线视频免费观看| 久久这里有精品15一区二区三区| 亚洲视频欧美视频| 韩国一区电影| 一本色道久久综合| 在线观看成人av| 亚洲一区二区视频在线| 亚洲巨乳在线| 久久婷婷国产麻豆91天堂| 欧美一级专区| 国产精品女人网站| 99精品欧美一区| 亚洲精品乱码久久久久久蜜桃91| 国产精品久久久久久久久久久久| 亚洲狠狠丁香婷婷综合久久久| 欧美一区二区三区久久精品| 免费在线观看精品| 欧美超级免费视 在线| 欧美日韩综合另类| 亚洲专区在线| 国产精品99久久不卡二区| 久久久噜噜噜久久人人看| 亚洲欧美激情视频| 欧美激情精品| 亚洲国产成人91精品| 亚洲激情啪啪| 免费欧美电影| 欧美激情一区二区三级高清视频| 欧美一级淫片播放口| 亚洲在线黄色| 国产精品久久午夜夜伦鲁鲁| 亚洲日本中文字幕| 91久久视频| 欧美大片免费久久精品三p| 欧美顶级大胆免费视频| 亚洲三级视频| 欧美伦理a级免费电影| 91久久香蕉国产日韩欧美9色 | 久久国产精品久久久久久电车| 亚洲精品一区二区在线观看| 亚洲欧洲精品一区| 美女国产一区| 亚洲人www| 亚洲色在线视频| 欧美日韩免费精品| 亚洲视频你懂的| 久久精品久久99精品久久| 在线看一区二区| 欧美喷水视频| 亚洲欧美电影在线观看| 免费亚洲视频| 亚洲免费av片| 国产精品久久福利| 亚洲欧洲99久久| 久久综合中文| 99视频+国产日韩欧美| 国产精品女人久久久久久| 久久精品网址| 亚洲日本视频| 久久久免费精品视频| 日韩视频一区二区| 国产日韩欧美夫妻视频在线观看| 欧美岛国在线观看| 一本久道久久综合中文字幕 | 欧美日韩网址| 午夜精品久久久久久久久久久久久 | 欧美在线视频观看免费网站| 韩国精品一区二区三区| 欧美精品乱码久久久久久按摩 | 午夜久久久久| 亚洲高清在线观看| 欧美成人精品高清在线播放| 亚洲精品久久久蜜桃| 久久精品在线视频| 一区二区三区视频免费在线观看| 欧美中文字幕在线观看| 欧美高清在线精品一区| 欧美激情综合在线| 欧美在线观看你懂的| 韩国女主播一区| 欧美日韩国产精品| 久久精品论坛| 亚洲一区二区高清| 欧美freesex交免费视频| 亚洲桃色在线一区| 日韩亚洲欧美一区| 亚洲国产高清aⅴ视频| 国产麻豆精品theporn| 欧美日韩一区二区欧美激情| 狂野欧美激情性xxxx欧美| 亚洲无限av看| 亚洲激情六月丁香|