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

鐵觀音

C++編程寶典

   ::  ::  ::  ::  :: 管理 ::
  1 隨筆 :: 19 文章 :: 0 評論 :: 0 Trackbacks

CRichEditCtrl 超文本編輯(MSN/QQ常用控件)

owg 轉自-vcmute (2005-9-9 13:48:00)

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

一.常見問題

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

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;

rich.GetSelectionCharFormat(cf);

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有

1 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)&gt,(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 2006-08-20 11:20 鐵觀音 閱讀(348) 評論(0)  編輯 收藏 引用 所屬分類: VC界面控件類
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美成人福利视频| 国产精品青草综合久久久久99| 国产一区久久久| 久久久久一本一区二区青青蜜月| 亚洲免费在线观看| 国产亚洲精品久| 欧美插天视频在线播放| 欧美不卡一卡二卡免费版| 99综合电影在线视频| 亚洲综合欧美日韩| 在线观看av一区| aa级大片欧美| 国模大胆一区二区三区| 亚洲福利久久| 欧美午夜免费| 久久国产直播| 欧美破处大片在线视频| 午夜一级在线看亚洲| 久久美女艺术照精彩视频福利播放| 黄色工厂这里只有精品| 国产三区精品| 亚洲直播在线一区| 久久精品视频播放| 99精品国产在热久久下载| 亚洲一区二区精品| 在线看欧美视频| 在线综合+亚洲+欧美中文字幕| 黄色一区二区三区| 日韩一级裸体免费视频| 激情自拍一区| 亚洲视频香蕉人妖| 亚洲第一级黄色片| 亚洲免费视频在线观看| 最新国产成人在线观看| 午夜精品一区二区三区在线| 亚洲片在线资源| 欧美在线视频观看免费网站| 宅男精品视频| 欧美国产免费| 狂野欧美激情性xxxx欧美| 国产精品a久久久久久| 欧美电影电视剧在线观看| 国产乱肥老妇国产一区二| 亚洲日本成人| 亚洲人成欧美中文字幕| 久久精品123| 久久精选视频| 国产乱码精品一区二区三区av| 亚洲精品视频在线播放| 亚洲国产成人久久综合| 久久久天天操| 久久久亚洲影院你懂的| 国产免费亚洲高清| 亚洲私拍自拍| 亚洲男女自偷自拍图片另类| 欧美激情第3页| 亚洲国产精品v| 亚洲成人在线免费| 久久亚洲图片| 欧美激情中文不卡| 亚洲日本久久| 欧美黄色精品| 亚洲精品在线二区| 一区二区三区高清| 欧美日韩国产高清| 亚洲美洲欧洲综合国产一区| 一区二区三区.www| 欧美香蕉视频| 亚洲一区观看| 久久国产精品99久久久久久老狼| 国产精品麻豆va在线播放| 亚洲调教视频在线观看| 午夜在线精品偷拍| 国产中文一区二区| 久久久久久**毛片大全| 欧美高清视频www夜色资源网| 亚洲国产精品悠悠久久琪琪| 久久字幕精品一区| 亚洲国产婷婷香蕉久久久久久| 亚洲激情成人在线| 欧美日韩一区在线播放| 亚洲宅男天堂在线观看无病毒| 欧美亚洲在线视频| 伊人精品成人久久综合软件| 免费人成精品欧美精品| 亚洲麻豆视频| 午夜久久久久久| 在线观看亚洲精品| 欧美精品久久99| 亚洲欧美在线看| 久久尤物电影视频在线观看| 亚洲激情电影在线| 国产精品www| 久久久久久网站| 亚洲精品免费一区二区三区| 午夜精品一区二区在线观看| 激情欧美国产欧美| 欧美日韩一本到| 久久精品成人| 亚洲毛片av在线| 久久婷婷国产综合尤物精品| 一本久久综合亚洲鲁鲁| 国产农村妇女精品一二区| 久久综合久久综合这里只有精品| 99精品国产99久久久久久福利| 久久久久久久久久久一区| 日韩一区二区精品视频| 国产精品视频福利| 鲁大师成人一区二区三区| 9色精品在线| 欧美激情视频给我| 久久福利毛片| 99亚洲视频| 亚洲高清免费| 国产精品综合| 欧美色另类天堂2015| 另类激情亚洲| 欧美呦呦网站| 亚洲一区二区不卡免费| 亚洲茄子视频| 亚洲大胆av| 久久久久久一区二区三区| 亚洲视频一区| 亚洲精品一品区二品区三品区| 国产主播一区二区| 国产欧美日本一区视频| 欧美香蕉视频| 欧美日本在线视频| 欧美大片一区| 蜜乳av另类精品一区二区| 欧美在线观看天堂一区二区三区| 一区二区日韩伦理片| 日韩网站免费观看| 亚洲人成网站777色婷婷| 久久另类ts人妖一区二区| 欧美在线一二三区| 西西人体一区二区| 午夜亚洲影视| 欧美呦呦网站| 久久久精品性| 玖玖综合伊人| 另类天堂av| 你懂的成人av| 欧美黄色免费网站| 最新国产の精品合集bt伙计| 亚洲国产精品999| 最新亚洲一区| 一区二区不卡在线视频 午夜欧美不卡'| 亚洲黄网站黄| 99国内精品| 亚洲一区在线观看视频 | 日韩视频一区二区三区| 亚洲国产一区视频| 亚洲人成艺术| 亚洲一区二区免费视频| 亚洲免费在线观看视频| 欧美中文字幕视频在线观看| 久久精品99国产精品| 久久九九精品| 欧美国产激情| 一本到12不卡视频在线dvd| 亚洲一区二区精品视频| 欧美一级二级三级蜜桃| 久久久综合免费视频| 欧美77777| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ入口 | 一区二区三区四区国产| 亚洲图片欧洲图片av| 午夜视频在线观看一区| 久色婷婷小香蕉久久| 欧美激情综合色| 国产伦精品一区二区三区视频孕妇 | 伊人色综合久久天天五月婷| 亚洲国产综合91精品麻豆| 妖精成人www高清在线观看| 欧美在线精品一区| 亚洲国产精品久久久久婷婷884| 日韩午夜在线视频| 欧美在现视频| 欧美三级网页| 在线欧美视频| 亚洲女人av| 欧美激情在线观看| 午夜一区二区三区在线观看| 欧美成人官网二区| 国产亚洲免费的视频看| 日韩视频在线一区二区| 久久久亚洲精品一区二区三区| 亚洲精品视频一区| 久久久久免费视频| 国产精品一级二级三级| 亚洲国产精品黑人久久久| 欧美一区影院| 日韩亚洲欧美成人| 玖玖综合伊人| 国产亚洲精品久久久久久| 亚洲中字在线| 亚洲精品综合精品自拍| 美日韩精品视频| 激情偷拍久久|