首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

類 MSN 訊息輸入框實作(上):多功能 RichEdit 控件

     編輯:關於VC++

架構設計

輸入框包含兩部分:圖案選擇器(下篇實作)與多功能文字框。文字框繼承 CRichEditCtrl 擴充為 CRichEditCtrlEx,解決三大缺口:

  • 無右鍵選單
  • 無法插入圖片(表情符號關鍵)
  • RTF 串流讀寫不便

右鍵選單實作

void CRichEditCtrlEx::OnRButtonUp(UINT nFlags, CPoint point) {
    SetFocus();
    CMenu menu; menu.CreatePopupMenu();
    menu.AppendMenu(0, ID_RICH_UNDO, _T("&Undo"));
    menu.AppendMenu(0, MF_SEPARATOR);
    menu.AppendMenu(0, ID_RICH_CUT, _T("Cu&t"));
    menu.AppendMenu(0, ID_RICH_COPY, _T("C&opy"));
    menu.AppendMenu(0, ID_RICH_PASTE, _T("&Paste"));
    menu.AppendMenu(0, ID_RICH_CLEAR, _T("C&lear"));
    menu.AppendMenu(0, MF_SEPARATOR);
    menu.AppendMenu(0, ID_RICH_SELECTALL, _T("Select &All"));
    menu.AppendMenu(0, MF_SEPARATOR);
    menu.AppendMenu(0, ID_RICH_SETFONT, _T("Select &Font"));
    // 啟用/停用項目...
    CPoint pt; GetCursorPos(&pt);
    menu.TrackPopupMenu(TPM_RIGHTBUTTON, pt.x, pt.y, this);
    menu.DestroyMenu();
    CRichEditCtrl::OnRButtonDown(nFlags, point);
    CRichEditCtrl::OnRButtonUp(nFlags, point);
}

插入圖片:OLE 物件兩種方式

  1. 從檔案建立:OleCreateFromFile → 建立儲存體、客戶端網站 → IRichEditOle::InsertObject。
  2. 從位圖控制碼建立:OleCreateStaticFromData → 以 CF_BITMAP 格式封裝 HBITMAP → 插入 OLE 物件。適合資源內嵌圖片。
void CRichEditCtrlEx::InsertBitmap(HBITMAP hBitmap) {
    STGMEDIUM stgm = {TYMED_GDI, .hBitmap = hBitmap};
    FORMATETC fm = {CF_BITMAP, NULL, DVASPECT_CONTENT, -1, TYMED_GDI};
    // 建立儲存體、資料物件、OLE 物件...
    REOBJECT reo = {0}; reo.cbStruct = sizeof(REOBJECT);
    reo.clsid = clsid; reo.cp = REO_CP_SELECTION;
    reo.poleobj = pOleObject; reo.polesite = lpClientSite;
    reo.pstg = pStorage; reo.dvaspect = DVASPECT_CONTENT;
    reo.dwFlags = REO_RESIZABLE;
    GetIRichEditOle()->InsertObject(&reo);
}

RTF 串流封裝

將 StreamIn/StreamOut 封裝為 GetRTF() 回傳 CString、SetRTF(CString) 設定內容,簡化呼叫。

下篇預告

實作表情符號選擇器(CIconPicker),自動偵測轉義字串(如 :))並以圖片取代。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved