BOOL UIIMEdit::GetPicPosAndPathbyOrder(IN UInt32 nOrder, OUT UInt32& nPos, OUT CString& path) { IRichEditOle* pRichEditOle = m_pRichEditOle; PTR_FALSE(pRichEditOle); REOBJECT reobj = { 0 }; reobj.cbStruct = sizeof(REOBJECT); HRESULT hr = pRichEditOle->GetObject(nOrder, &reobj, REO_GETOBJ_POLEOBJ); if (SUCCEEDED(hr) && reobj.poleobj) { GifSmiley::IGifSmileyCtrl* lpAnimator = 0; hr = reobj.poleobj->QueryInterface(GifSmiley::IID_IGifSmileyCtrl, (void**)&lpAnimator); if (SUCCEEDED(hr) && lpAnimator) { CComBSTR fileName; hr = lpAnimator->FileName(&fileName); if (SUCCEEDED(hr) && 0 != fileName.Length()) { nPos = reobj.cp; path = CString(fileName.m_str); } lpAnimator->FreeImage(); lpAnimator->Release(); } reobj.poleobj->Release(); return TRUE; } return FALSE; }
bool SetRichCallback(HWND hwnd, MCONTACT hContact, bool subany, bool subnew) { RichEditData* rdt = g_RichEditList.find((RichEditData*)&hwnd); if (rdt == NULL) { IRichEditOle* RichEditOle; if (SendMessage(hwnd, EM_GETOLEINTERFACE, 0, (LPARAM)&RichEditOle) == 0) return false; RichEditOle->Release(); rdt = new RichEditData; rdt->hwnd = hwnd; rdt->hContact = hContact; rdt->inputarea = (GetWindowLongPtr(hwnd, GWL_STYLE) & ES_READONLY) == 0; rdt->dontReplace = false; rdt->tipActive = -1; rdt->hToolTip = NULL; g_RichEditList.insert(rdt); if (subnew) mir_subclassWindow(hwnd, RichEditSubclass); } else { if (hContact && !rdt->hContact) rdt->hContact = hContact; if (subany) mir_subclassWindow(hwnd, RichEditSubclass); } return true; }
static bool bbCodeImageFunc(IFormattedTextDraw *ftd, CHARRANGE range, TCHAR *txt, DWORD cookie) { ITextServices *ts = ftd->getTextService(); ITextDocument *td = ftd->getTextDocument(); long cnt; LRESULT lResult; /* TEXTRANGE trg; trg.chrg = range; trg.lpstrText = new TCHAR[trg.chrg.cpMax - trg.chrg.cpMin + 1]; ts->TxSendMessage(EM_GETTEXTRANGE, 0, (LPARAM)&trg, &lResult); MessageBox(0, txt, trg.lpstrText, MB_OK); */ ts->TxSendMessage(EM_SETSEL, range.cpMin, range.cpMax, &lResult); IRichEditOle* RichEditOle; ts->TxSendMessage(EM_GETOLEINTERFACE, 0, (LPARAM)&RichEditOle, &lResult); td->Freeze(&cnt); // HDC emfdc = CreateEnhMetaFile(NULL, NULL, NULL, _T("icon")); // DrawIconEx(emfdc, 0, 0, (HICON)_ttol(txt), 16, 16, 0, NULL, DI_NORMAL); // InsertBitmap(RichEditOle, CloseEnhMetaFile(emfdc)); #ifdef _WIN64 bool res = InsertBitmap(RichEditOle, CacheIconToEmf((HICON)_tstoi64(txt))); #else bool res = InsertBitmap(RichEditOle, CacheIconToEmf((HICON)_ttoi(txt))); #endif td->Unfreeze(&cnt); RichEditOle->Release(); return res; }
BOOL RichEdit_GetImageOle(HWND hWnd, POINT pt, IImageOle** pImageOle) { IRichEditOle * pRichEditOle; REOBJECT reobject; HRESULT hr; BOOL bRet = FALSE; if (NULL == pImageOle) return FALSE; *pImageOle = NULL; pRichEditOle = RichEdit_GetOleInterface(hWnd); if (NULL == pRichEditOle) return FALSE; int nCount = pRichEditOle->GetObjectCount(); for (int i = 0; i < nCount; i++) { memset(&reobject, 0, sizeof(REOBJECT)); reobject.cbStruct = sizeof(REOBJECT); hr = pRichEditOle->GetObject(i, &reobject, REO_GETOBJ_POLEOBJ); if (S_OK == hr) { if (reobject.poleobj != NULL) { if (CLSID_ImageOle == reobject.clsid) { IImageOle * pImageOle2 = NULL; hr = reobject.poleobj->QueryInterface(__uuidof(IImageOle), (void**)&pImageOle2); reobject.poleobj->Release(); if (SUCCEEDED(hr)) { RECT rcObject = {0}; hr = pImageOle2->GetObjectRect(&rcObject); if (SUCCEEDED(hr)) { if (::PtInRect(&rcObject, pt)) { *pImageOle = pImageOle2; bRet = TRUE; break; } } pImageOle2->Release(); } } else { reobject.poleobj->Release(); } } } } pRichEditOle->Release(); return bRet; }
int RichEdit_GetCustomPicCount(HWND hWnd) { IRichEditOle * pRichEditOle; REOBJECT reobject; HRESULT hr; pRichEditOle = RichEdit_GetOleInterface(hWnd); if (NULL == pRichEditOle) return 0; int nCustomPicCnt = 0; for (int i = 0; i < pRichEditOle->GetObjectCount(); i++) { memset(&reobject, 0, sizeof(REOBJECT)); reobject.cbStruct = sizeof(REOBJECT); hr = pRichEditOle->GetObject(i, &reobject, REO_GETOBJ_POLEOBJ); if (S_OK == hr) { if (reobject.poleobj != NULL) { if (CLSID_ImageOle == reobject.clsid) { IImageOle * pImageOle2 = NULL; hr = reobject.poleobj->QueryInterface(__uuidof(IImageOle), (void**)&pImageOle2); reobject.poleobj->Release(); if (SUCCEEDED(hr)) { LONG lFaceId = -1, lFaceIndex = -1; pImageOle2->GetFaceId(&lFaceId); pImageOle2->GetFaceIndex(&lFaceIndex); if (-1 == lFaceId && -1 == lFaceIndex) nCustomPicCnt++; pImageOle2->Release(); } } else { reobject.poleobj->Release(); } } } } pRichEditOle->Release(); return nCustomPicCnt; }
int UIIMEdit::GetObjectPos() { bool findObject = false; IRichEditOle *pRichEditOle = m_pRichEditOle; if (NULL == pRichEditOle) { return 0; } int nCount = pRichEditOle->GetObjectCount(); for (int i = nCount - 1; i >= 0; i--) { REOBJECT reobj = { 0 }; reobj.cbStruct = sizeof(REOBJECT); pRichEditOle->GetObject(i, &reobj, REO_GETOBJ_POLEOBJ); reobj.poleobj->Release(); } return 0; }
void UIIMEdit::ReleaseAllGif() { SetText(_T("")); IRichEditOle *pRichEditOle = m_pRichEditOle; PTR_VOID(pRichEditOle); for (int i = 0; i < pRichEditOle->GetObjectCount(); i++) { REOBJECT reobj = { 0 }; reobj.cbStruct = sizeof(REOBJECT); pRichEditOle->GetObject(i, &reobj, REO_GETOBJ_POLEOBJ); GifSmiley::IGifSmileyCtrl* lpAnimator = 0; HRESULT hr = reobj.poleobj->QueryInterface(GifSmiley::IID_IGifSmileyCtrl, (void**)&lpAnimator); if (SUCCEEDED(hr) && lpAnimator) { lpAnimator->FreeImage(); lpAnimator->Release(); } reobj.poleobj->Release(); } }
static bool bbCodeImageFunc(IFormattedTextDraw *ftd, CHARRANGE range, TCHAR *txt, DWORD) { ITextServices *ts = ftd->getTextService(); ITextDocument *td = ftd->getTextDocument(); long cnt; LRESULT lResult; ts->TxSendMessage(EM_SETSEL, range.cpMin, range.cpMax, &lResult); IRichEditOle* RichEditOle; ts->TxSendMessage(EM_GETOLEINTERFACE, 0, (LPARAM)&RichEditOle, &lResult); td->Freeze(&cnt); #ifdef _WIN64 bool res = InsertBitmap(RichEditOle, CacheIconToEmf((HICON)_tstoi64(txt))); #else bool res = InsertBitmap(RichEditOle, CacheIconToEmf((HICON)_ttoi(txt))); #endif td->Unfreeze(&cnt); RichEditOle->Release(); return res; }
void GetDrawingProp(void) { if (m_hwnd == NULL) return; IRichEditOle* RichEditOle; if (SendMessage(m_hwnd, EM_GETOLEINTERFACE, 0, (LPARAM)&RichEditOle) == 0) return; REOBJECT reObj = {0}; reObj.cbStruct = sizeof(REOBJECT); HRESULT hr = RichEditOle->GetObject(m_lastObjNum, &reObj, REO_GETOBJ_NO_INTERFACES); if (hr == S_OK && reObj.dwUser == (DWORD)(ISmileyBase*)this && reObj.clsid == CLSID_NULL) m_richFlags = reObj.dwFlags; else { long objectCount = RichEditOle->GetObjectCount(); for (long i = objectCount; i--; ) { HRESULT hr = RichEditOle->GetObject(i, &reObj, REO_GETOBJ_NO_INTERFACES); if (FAILED(hr)) continue; if (reObj.dwUser == (DWORD)(ISmileyBase*)this && reObj.clsid == CLSID_NULL) { m_lastObjNum = i; m_richFlags = reObj.dwFlags; break; } } } RichEditOle->Release(); if ((m_richFlags & REO_SELECTED) == 0) { CHARRANGE sel; SendMessage(m_hwnd, EM_EXGETSEL, 0, (LPARAM)&sel); if (reObj.cp >= sel.cpMin && reObj.cp < sel.cpMax) m_richFlags |= REO_INVERTEDSELECT; else m_richFlags &= ~REO_INVERTEDSELECT; } }
static void SetPosition(HWND hwnd) { IRichEditOle* RichEditOle; if (SendMessage(hwnd, EM_GETOLEINTERFACE, 0, (LPARAM)&RichEditOle) == 0) return; ITextDocument* TextDocument; if (RichEditOle->QueryInterface(IID_ITextDocument, (void**)&TextDocument) != S_OK) { RichEditOle->Release(); return; } // retrieve text range ITextRange* TextRange; if (TextDocument->Range(0, 0, &TextRange) != S_OK) { TextDocument->Release(); RichEditOle->Release(); return; } TextDocument->Release(); int objectCount = RichEditOle->GetObjectCount(); for (int i = objectCount - 1; i >= 0; i--) { REOBJECT reObj = {0}; reObj.cbStruct = sizeof(REOBJECT); HRESULT hr = RichEditOle->GetObject(i, &reObj, REO_GETOBJ_POLEOBJ); if (FAILED(hr)) continue; ISmileyBase *igsc = NULL; if (reObj.clsid == CLSID_NULL) reObj.poleobj->QueryInterface(IID_ISmileyAddSmiley, (void**) &igsc); reObj.poleobj->Release(); if (igsc == NULL) continue; TextRange->SetRange(reObj.cp, reObj.cp); BOOL res; POINT pt; RECT rect; hr = TextRange->GetPoint(tomStart | TA_BOTTOM | TA_LEFT, &pt.x, &pt.y); if (hr == S_OK) { res = ScreenToClient(hwnd, &pt); rect.bottom = pt.y; rect.left = pt.x; } else rect.bottom = -1; hr = TextRange->GetPoint(tomStart | TA_TOP | TA_LEFT, &pt.x, &pt.y); if (hr == S_OK) { res = ScreenToClient(hwnd, &pt); rect.top = pt.y; rect.left = pt.x; } else rect.top = -1; igsc->SetPosition(hwnd, &rect); igsc->Release(); } TextRange->Release(); RichEditOle->Release(); }
// 获取文本 void RichEdit_GetText(ITextServices * pTextServices, tstring& strText) { REOBJECT reobject; LONG nFaceId, nPos = 0; tstring strOrgText, strTemp; IRichEditOle * pRichEditOle = RichEdit_GetOleInterface(pTextServices); if (NULL == pRichEditOle) return; CHARRANGE chrg = {0, RichEdit_GetWindowTextLength(pTextServices)}; RichEdit_GetTextRange(pTextServices, &chrg, strOrgText); for (LONG i = 0; i < (int)strOrgText.size(); i++) { memset(&reobject, 0, sizeof(REOBJECT)); reobject.cbStruct = sizeof(REOBJECT); reobject.cp = i; HRESULT hr = pRichEditOle->GetObject(REO_IOB_USE_CP, &reobject, REO_GETOBJ_POLEOBJ); if (SUCCEEDED(hr)) { if (reobject.cp > 0 && reobject.cp > nPos) { strTemp = strOrgText.substr(nPos, reobject.cp-nPos); Replace(strTemp, _T("/"), _T("//")); strText += strTemp; } nPos = reobject.cp + 1; if (NULL == reobject.poleobj) continue; if (CLSID_ImageOle == reobject.clsid) { IImageOle * pImageOle = NULL; hr = reobject.poleobj->QueryInterface(__uuidof(IImageOle), (void**)&pImageOle); if (SUCCEEDED(hr)) { pImageOle->GetFaceId(&nFaceId); if (nFaceId != -1) { TCHAR cBuf[32] = {0}; wsprintf(cBuf, _T("/f[\"%03d\"]"), nFaceId); strText += cBuf; } else { strText += _T("/c[\""); BSTR bstrFileName = NULL; pImageOle->GetFileName(&bstrFileName); strText += bstrFileName; ::SysFreeString(bstrFileName); strText += _T("\"]"); } pImageOle->Release(); } } reobject.poleobj->Release(); } } if (nPos < (int)strOrgText.size()) { strTemp = strOrgText.substr(nPos); Replace(strTemp, _T("/"), _T("//")); strText += strTemp; } pRichEditOle->Release(); }
// 插入表情图片 BOOL RichEdit_InsertFace(ITextServices *pTextServices, ITextHost *pTextHost, LPCTSTR lpszFileName, int nFaceId, int nFaceIndex, COLORREF clrBg, BOOL bAutoScale, int nReservedWidth) { BSTR bstrFileName = NULL; IRichEditOle * pRichEditOle = NULL; IOleClientSite *pOleClientSite = NULL; IImageOle* pImageOle = NULL; IOleObject *pOleObject = NULL; REOBJECT reobject = {0}; HRESULT hr = E_FAIL; if (NULL == pTextServices || NULL == pTextHost || NULL == lpszFileName || NULL == *lpszFileName) return FALSE; TCHAR cProtocol[16] = {0}; _tcsncpy(cProtocol, lpszFileName, 7); if ((_tcsicmp(cProtocol, _T("http://")) != 0) && ::GetFileAttributes(lpszFileName) == 0xFFFFFFFF) return FALSE; bstrFileName = ::SysAllocString(lpszFileName); if (NULL == bstrFileName) return FALSE; pTextServices->TxSendMessage(EM_GETOLEINTERFACE, 0, (LPARAM)&pRichEditOle, NULL); if (NULL == pRichEditOle) goto Ret0; hr = ::CoCreateInstance(CLSID_ImageOle, NULL, CLSCTX_INPROC_SERVER, IID_IImageOle, (void**)&pImageOle); if (FAILED(hr)) goto Ret0; hr = pImageOle->QueryInterface(IID_IOleObject, (void **)&pOleObject); if (FAILED(hr)) goto Ret0; pRichEditOle->GetClientSite(&pOleClientSite); if (NULL == pOleClientSite) goto Ret0; pOleObject->SetClientSite(pOleClientSite); pImageOle->SetTextServices(pTextServices); pImageOle->SetTextHost(pTextHost); pImageOle->SetFaceId(nFaceId); pImageOle->SetFaceIndex(nFaceIndex); pImageOle->SetBgColor(clrBg); pImageOle->SetAutoScale(bAutoScale, nReservedWidth); pImageOle->LoadFromFile(bstrFileName); hr = ::OleSetContainedObject(pOleObject, TRUE); reobject.cbStruct = sizeof(REOBJECT); reobject.clsid = CLSID_ImageOle; reobject.cp = REO_CP_SELECTION; reobject.dvaspect = DVASPECT_CONTENT; reobject.dwFlags = REO_BELOWBASELINE; reobject.poleobj = pOleObject; reobject.polesite = pOleClientSite; reobject.dwUser = 0; hr = pRichEditOle->InsertObject(&reobject); Ret0: if (pOleObject != NULL) pOleObject->Release(); if (pImageOle != NULL) pImageOle->Release(); if (pOleClientSite != NULL) pOleClientSite->Release(); if (pRichEditOle != NULL) pRichEditOle->Release(); if (bstrFileName != NULL) ::SysFreeString(bstrFileName); return SUCCEEDED(hr); }
BOOL UIIMEdit::GetContent(OUT MixedMsg& mixMsg) { mixMsg.m_strTextData = GetTextRange(0, GetTextLength()); if (mixMsg.m_strTextData.IsEmpty()) return FALSE; mixMsg.ReplaceReturnKey(); IRichEditOle *pRichEditOle = m_pRichEditOle; if (NULL == pRichEditOle) { return FALSE; } UInt32 nImageCount = pRichEditOle->GetObjectCount(); if (nImageCount == 0)//纯文字 { CString strContent = mixMsg.m_strTextData; strContent.Trim(); if (strContent.IsEmpty()) { LOG__(DEBG, _T("After trimed,is empty msg"));//日志干扰 return FALSE; } } else//图文混排 { CString strEmotionFilesDir = module::getMiscModule()->getEmotionFilesDir(); int nPosAdd = 0; for (UInt32 i = 0; i < nImageCount; i++) { ST_picData picData; if (GetPicPosAndPathbyOrder(i, picData.nPos, picData.strLocalPicPath)) { TCHAR fullPath[MAX_PATH] = { 0 }; LPTSTR* pStart = nullptr; if (!GetFullPathName(picData.strLocalPicPath, MAX_PATH, fullPath, pStart)) { continue; } CString strFullPath = fullPath; int nPos = strFullPath.Find(strEmotionFilesDir); if (-1 != nPos) { //是表情,不用上传图片 int nLen = picData.strLocalPicPath.GetLength(); CString fileName = strFullPath.Mid(strEmotionFilesDir.GetLength(), nLen - strEmotionFilesDir.GetLength() + 1); CString fileID; if (!module::getEmotionModule()->getEmotionIDByName(fileName, fileID)) { return FALSE; } mixMsg.m_strTextData.Insert(nPosAdd + picData.nPos, fileID); mixMsg.m_strTextData.Delete(nPosAdd + picData.nPos + fileID.GetLength(), 1); //nPosAdd += picData.nPos + fileID.GetLength(); nPosAdd += fileID.GetLength() - 1; } else { picData.nPos += nPosAdd; mixMsg.m_picDataVec.push_back(picData); } } } } SetText(_T("")); return TRUE; }
void CExRichEditWindowless::InsertGif(LONG gif) { CComQIPtr<IDynamicOleCom> spDyn; HRESULT hr = spDyn.CoCreateInstance(STR_PROGID); if(SUCCEEDED(hr)) { LPOLEOBJECT lpOleObject = NULL; HRESULT hr = spDyn->QueryInterface(IID_IOleObject, (void**)&lpOleObject); IUnknownPtr lpUnk = lpOleObject; hr = lpUnk->QueryInterface(IID_IOleObject, (LPVOID*)&lpOleObject); if (lpOleObject == NULL) throw(E_OUTOFMEMORY); //hr = lpOleObject->SetClientSite( static_cast<IOleClientSite *>( this ) ); IViewObject2Ptr lpViewObject;// IViewObject for IOleObject above hr = lpOleObject->QueryInterface(IID_IViewObject2, (LPVOID*)&lpViewObject); if (hr != S_OK) { AtlThrow(hr); } IRichEditOle* pRichEditOle = GetIRichEditOle(); ////获取RichEdit的OLEClientSite IOleClientSitePtr lpClientSite; hr = pRichEditOle->GetClientSite(&lpClientSite); if (hr != S_OK) { AtlThrow(hr); } REOBJECT reobject; ZeroMemory(&reobject,sizeof(REOBJECT)); reobject.cbStruct = sizeof(REOBJECT); CLSID clsid; hr = lpOleObject->GetUserClassID(&clsid); if (hr != S_OK) { AtlThrow(hr); } reobject.clsid = clsid; reobject.cp = -1; //reobject.cp = REO_CP_SELECTION; reobject.dvaspect = DVASPECT_CONTENT;//DVASPECT_OPAQUE; reobject.poleobj = lpOleObject; reobject.polesite = lpClientSite; //reobject.pstg = lpStorage; SIZEL sizel; sizel.cx = sizel.cy = 0; // let richedit determine initial size Image* img = (Image*)gif; SIZEL sizeInPix = {img->GetWidth(), img->GetHeight()}; SIZEL sizeInHiMetric; AtlPixelToHiMetric(&sizeInPix, &sizeInHiMetric); reobject.sizel = sizeInHiMetric; reobject.dwFlags = REO_BELOWBASELINE|REO_STATIC;//REO_RESIZABLE CExRichEditData* pdata = new CExRichEditData; pdata->m_dataType = GIF; pdata->m_data = (void*)gif; reobject.dwUser = (DWORD)pdata;//TODO 用户数据 lpOleObject->SetClientSite(lpClientSite); hr = pRichEditOle->InsertObject(&reobject); lpOleObject->SetExtent(DVASPECT_CONTENT, &sizeInHiMetric); OleSetContainedObject(lpOleObject, TRUE); lpOleObject->Release(); spDyn->SetHostWindow((LONG)hwndParent); spDyn->InsertGif(gif); } }
// --------------------------------------------------------------------------- // CWinMenubar::AboutProc() // Dialog Window proc for About dialog // --------------------------------------------------------------------------- BOOL CALLBACK CWinMenubar::AboutProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(lParam); // unless SDK_REGISTRATION is defined switch (message) { case WM_INITDIALOG: { TCHAR text[128]; CWinMenubar* menubar = (CWinMenubar*)lParam; HINSTANCE hMod = menubar->ModuleHandle(); GetWindowText(GetParent(hDlg), text, sizeof(text)/sizeof(text[0])); SetWindowText(hDlg, text); HBITMAP hBitmap = NULL; UINT textScrollID = IDC_ABOUT_TEXT_SCROLL; UINT textNoScrollID = IDC_ABOUT_TEXT_NO_SCROLL; UINT setTextMsg = WM_SETTEXT; WPARAM setTextParam = 0; SETTEXTEX setText; setText.flags = ST_SELECTION; setText.codepage = CP_ACP; char* aboutText = NULL; if (menubar->iRichEdit) { aboutText = ReadTextFile(ABOUTBOX_RTF_FILE); } if (aboutText) { setTextMsg = EM_SETTEXTEX; textScrollID = textNoScrollID = IDC_ABOUT_RICHTEXT; setTextParam = (WPARAM)&setText; hBitmap = LoadBitmap(hMod,MAKEINTRESOURCE(IDB_JAVA_POWERED)); #ifdef HAVE_WLIB HWND hText = GetDlgItem(hDlg, IDC_ABOUT_RICHTEXT); SendMessage(hText, EM_SETEVENTMASK, 0, SendMessage(hText, EM_GETEVENTMASK, 0,0) | ENM_LINK); SendMessage(hText, EM_AUTOURLDETECT, TRUE, 0); #endif // HAVE_WLIB } if (!aboutText && menubar->iRichEdit) { // Load default about text from the resource void* ptr = NULL; UINT size = 0; HGLOBAL hg = 0; HRSRC hr = FindResourceA(hMod,MAKEINTRESOURCEA(IDR_ABOUT_RTF),"RTF"); if (hr) { size = SizeofResource(ModuleHandle(), hr); hg = LoadResource(ModuleHandle(), hr); ptr = LockResource(hg); } if (ptr) { aboutText = (char*)Alloc(size+1); if (aboutText) { memcpy(aboutText, ptr, size); aboutText[size] = 0; setTextMsg = EM_SETTEXTEX; textScrollID = IDC_ABOUT_RICHTEXT; textNoScrollID = IDC_ABOUT_RICHTEXT; hBitmap = LoadBitmap(hMod,MAKEINTRESOURCE(IDB_JAVA_POWERED)); setTextParam = (WPARAM)&setText; } UnlockResource(hg); } } if (aboutText) { // Check if we need the scrollbar. 12 lines of text // will fit into the edit control. HWND hText = GetDlgItem(hDlg, textNoScrollID); SendMessageA(hText,setTextMsg,setTextParam,(LPARAM)aboutText); if (SendMessageA(hText, EM_GETLINECOUNT,0,0) <= 12) { // No need for the scrollbar, show the edit // control without the WS_VSCROLL style ShowWindow(hText, SW_SHOWNORMAL); } else { // We need the vertical scrollbar, show the edit control // with the WS_VSCROLL style. Note that textScrollID and // textNoScrollID may point to the same window, so reset // the text in the control (bug #DPEV-6JUJSQ) hText = GetDlgItem(hDlg, textScrollID); SendMessageA(hText,WM_SETTEXT,0,(LPARAM)""); SendMessageA(hText,setTextMsg,setTextParam,(LPARAM)aboutText); ShowWindow(hText, SW_SHOWNORMAL); } // Add full SDK name to the RichEdit control by replacing <sdk_name> tag with the // name defined in SdkProductInfo.h. Note that decision between MIDP and C++ SDK // product names is made using CWinMenubar iMidpSdk member. static const TCHAR keywordHeading[] = TEXT("<sdk_name>"); static const UINT keywordHeadingLen = COUNT(keywordHeading)-1; FINDTEXT findHeading; ZeroMemory(&findHeading, sizeof(findHeading)); findHeading.chrg.cpMax = -1; findHeading.lpstrText = (LPTSTR)keywordHeading; // Select whole content SendMessage(hText, EM_SETSEL, 0, 0); // Find from selection int pos = SendMessage(hText,EM_FINDTEXT, FR_MATCHCASE|FR_DOWN, (LPARAM)&findHeading); if (pos >= 0) { // Sdk name tag found IRichEditOle* re = NULL; SendMessage(hText, EM_GETOLEINTERFACE, 0, (LPARAM)&re); if (re) { // Select SDK name tag and replace it with the full SDK name SendMessage(hText, EM_SETSEL, pos, pos+keywordHeadingLen); if(menubar->iMidpSDK) SendMessage(hText, EM_REPLACESEL, true, (LPARAM)TEXT(SDK_FULL_PRODUCT_NAME_MIDP)); else SendMessage(hText, EM_REPLACESEL, true, (LPARAM)TEXT(SDK_FULL_PRODUCT_NAME_CPP)); re->Release(); } } if (hBitmap) { static const TCHAR keyword[] = TEXT("<java logo>"); static const UINT keywordLen = COUNT(keyword)-1; FINDTEXT find; ZeroMemory(&find, sizeof(find)); find.chrg.cpMax = -1; find.lpstrText = (LPTSTR)keyword; SendMessage(hText, EM_SETSEL, 0, 0); int pos = SendMessage(hText,EM_FINDTEXT, FR_MATCHCASE|FR_DOWN, (LPARAM)&find); if (pos >= 0) { IRichEditOle* re = NULL; SendMessage(hText, EM_GETOLEINTERFACE, 0, (LPARAM)&re); if (re) { CImageDataObject* bmp = new CImageDataObject(hBitmap); if (bmp) { SendMessage(hText,EM_SETSEL,pos,pos+keywordLen); bmp->Insert(re); bmp->Release(); } re->Release(); } } } Free(aboutText); } #ifdef SDK_REGISTRATION // Show product key if (gRegProductContext) { HWND hProductKey = GetDlgItem(hDlg, IDC_PRODUCT_KEY); const char* szKey = REG_ProductKey(gRegProductContext); SetWindowTextA(hProductKey, szKey); // The control is created invisible, show it ShowWindow(hProductKey, SW_SHOWNORMAL); if (REG_ProductStatus(gRegProductContext) != RegRegistered) { // Show the Register button ShowWindow(GetDlgItem(hDlg, IDC_REGISTER), SW_SHOWNORMAL); } } #endif // SDK_REGISTRATION // Subclass the product name control HWND hName = GetDlgItem(hDlg, IDC_PRODUCT_NAME); HINSTANCE hInst = (HINSTANCE)GetWindowLong(hDlg,GWL_HINSTANCE); if (hName) { // Allocate TitleData structure. It will be deallocated // by TitleWndProc when it receives WM_DESTROY message TitleData* data = (TitleData*)malloc(sizeof(TitleData)); if (data) { LOGFONTA logFont; ZeroMemory(data, sizeof(*data)); ZeroMemory(&logFont, sizeof(logFont)); logFont.lfHeight = 24; logFont.lfWeight = FW_BOLD; logFont.lfCharSet = ANSI_CHARSET; logFont.lfOutPrecision = OUT_DEFAULT_PRECIS; logFont.lfClipPrecision = CLIP_DEFAULT_PRECIS; logFont.lfQuality = ANTIALIASED_QUALITY; logFont.lfPitchAndFamily = VARIABLE_PITCH; // Try Nokia font first strcpy(logFont.lfFaceName, "Nokia Sans"); data->hFont = CreateFontIndirectA(&logFont); if (!data->hFont) { // No Nokia font, try Arial then strcpy(logFont.lfFaceName, "Arial"); data->hFont = CreateFontIndirectA(&logFont); } // Load bitmaps data->hBitmap = LoadBitmapA(hInst, MAKEINTRESOURCEA(IDB_ABOUT_TOP)); // load product name from the file data->productName = ReadTextFile(PRODUCTNAME_FILE); data->productId = menubar->GetProductId(); // Request initial bitmap data->bRepaint = TRUE; #ifdef SDK_REGISTRATION data->hGradientBitmap = LoadBitmapA(hInst, MAKEINTRESOURCEA(IDB_ABOUT_GRADIENT)); if (gRegProductContext) { data->scrollText = TitleCreateScrollData(hName, gRegProductContext); if (data->scrollText) { // Initial delay SetTimer(hName, SCROLL_DELAY_TIMER, SCROLL_TIMER_DELAY, NULL); } } #endif // SDK_REGISTRATION // Subclass the window data->superProc = (WNDPROC)GetWindowLong(hName,GWL_WNDPROC); SetWindowLong(hName, GWL_USERDATA, (LONG)data); SetWindowLong(hName, GWL_WNDPROC, (LONG)TitleWndProc); } } #ifdef HAVE_WLIB WIN32_CenterWindow(hDlg, NULL); #endif // HAVE_WLIB return TRUE; } case WM_COMMAND: switch (wParam) { #ifdef SDK_REGISTRATION case IDC_REGISTER: if (REG_RegisterNow(gRegProductContext, hDlg)) { TitleStopScroller(hDlg); // Update the scroller HWND hTitle = GetDlgItem(hDlg, IDC_PRODUCT_NAME); ScrollTextData* scroll = TitleCreateScrollData( hTitle, gRegProductContext); if (scroll) { TitleData* data; data = (TitleData*)GetWindowLong(hTitle,GWL_USERDATA); TitleDeleteScrollData(data->scrollText); data->scrollText = scroll; } } if (REG_ProductStatus(gRegProductContext) == RegRegistered) { // The button has served its purpose. Hide it ShowWindow(GetDlgItem(hDlg, IDC_REGISTER), SW_HIDE); } return TRUE; #endif // SDK_REGISTRATION case IDOK: case IDCANCEL: EndDialog(hDlg, wParam); return TRUE; default: return FALSE; } #ifdef HAVE_WLIB // Need wlib to use WIN32_BrowseURL case WM_NOTIFY: if (((LPNMHDR)lParam)->idFrom == IDC_ABOUT_RICHTEXT) { char url[256]; ENLINK* link = (ENLINK*)lParam; if (link->msg == WM_LBUTTONDOWN && (link->chrg.cpMax - link->chrg.cpMin) < (COUNT(url)/2-1)) // EM_GETTEXTRANGE may think it's in WCHARs { // Visual effect HWND hText = link->nmhdr.hwndFrom; SendMessage(hText,EM_SETSEL,link->chrg.cpMin,link->chrg.cpMax); // It's not very clear what EM_GETTEXTRANGE message writes // into the buffer. Since we use SendMessageA (ANSI API), // I would expect that it returns ANSI string as most other // text-related messages do. Yet, at least some versions of // RichEdit control seem to return UCS-2 characters. Internet // search produces conflicting results. Let's be prepared for // anything. After all, there are only two possiblities. It's // either UCS-2 or ASCII. TEXTRANGEA range; range.chrg = link->chrg; range.lpstrText = url; url[0] = url[1] = 0; SendMessageA(hText, EM_GETTEXTRANGE, 0, (LPARAM)&range); url[COUNT(url)-1] = url[COUNT(url)-2] = 0; if (!_wcsnicmp((WCHAR*)url,L"http://",7)) { // Looks like UCS-2 string to me. Convert it to ASCII LPWSTR w = (WCHAR*)url; LPSTR p = url; do { *p++ = (char)*w++; } while (*w); *p = 0; } // Start the default browser WIN32_BrowseURL(url); } } // Usually, the return value is ignored return FALSE; #endif // HAVE_WLIB #ifdef SDK_REGISTRATION case WM_CTLCOLORSTATIC: // We don't want the product key edit control to erase its // background because it's drawn on top of the product name // bitmap (white cloud). { int nDlgCtrlID = GetDlgCtrlID((HWND)lParam); switch (nDlgCtrlID) { case IDC_PRODUCT_KEY: // Return transparent brush for the product key control return (BOOL)GetStockObject(HOLLOW_BRUSH); } } return FALSE; case WM_LBUTTONDOWN: case WM_RBUTTONDOWN: case WM_MBUTTONDOWN: // Stop scrolling on mouse click TitleStopScroller(hDlg); return FALSE; #endif // SDK_REGISTRATION default: return FALSE; } }
void UIIMEdit::InsertImage(BSTR bstrFileName,SIZE size,BOOL isGif) { LPSTORAGE lpStorage = NULL; LPOLEOBJECT lpObject = NULL; LPLOCKBYTES lpLockBytes = NULL; LPOLECLIENTSITE lpClientSite = NULL; GifSmiley::IGifSmileyCtrl* lpAnimator = nullptr; HRESULT hr = ::CoCreateInstance(GifSmiley::CLSID_CGifSmileyCtrl, NULL, CLSCTX_INPROC, GifSmiley::IID_IGifSmileyCtrl, (LPVOID*)&lpAnimator); if (NULL == lpAnimator || FAILED(hr)) { LOG__(ERR, _T("InsertImage CoCreateInstance failed")); goto End; } COLORREF backColor = (COLORREF)(::GetSysColor(COLOR_WINDOW)); HWND hwnd = (HWND)((long)m_pManager->GetPaintWindow()); IRichEditOle *pRichEditOle = m_pRichEditOle; if (NULL == pRichEditOle) goto End; BSTR path = NULL; //Create lockbytes hr = ::CreateILockBytesOnHGlobal(NULL, TRUE, &lpLockBytes); if (FAILED(hr)) { LOG__(ERR, _T("InsertImage CreateILockBytesOnHGlobal failed")); goto End; } //use lockbytes to create storage SCODE sc = ::StgCreateDocfileOnILockBytes(lpLockBytes, STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &lpStorage); if (sc != S_OK) { LOG__(ERR, _T("InsertImage StgCreateDocfileOnILockBytes failed")); goto End; } // retrieve OLE interface for richedit and Get site pRichEditOle->GetClientSite(&lpClientSite); try { //COM operation need BSTR, so get a BSTR path = bstrFileName; //Load the image if (isGif) lpAnimator->LoadFromFile(path); else { UInt32 height = (size.cy < GetHeight()) ? size.cy : GetHeight(); UInt32 width = (size.cx < GetWidth() / 2) ? size.cx : GetWidth() / 2; lpAnimator->LoadFromFileSized(path, width, height); } //Set back color OLE_COLOR oleBackColor = (OLE_COLOR)backColor; lpAnimator->put_BackColor(oleBackColor); //get the IOleObject hr = lpAnimator->QueryInterface(IID_IOleObject, (void**)&lpObject); if (FAILED(hr)) { LOG__(ERR, _T("InsertImage lpAnimator QueryInterface failed")); goto End; } //Set it to be inserted OleSetContainedObject(lpObject, TRUE); //to insert into richedit, you need a struct of REOBJECT REOBJECT reobject; ZeroMemory(&reobject, sizeof(REOBJECT)); reobject.cbStruct = sizeof(REOBJECT); CLSID clsid; hr = lpObject->GetUserClassID(&clsid); //set clsid reobject.clsid = clsid; //can be selected reobject.cp = REO_CP_SELECTION; //content, but not static reobject.dvaspect = DVASPECT_CONTENT; //goes in the same line of text line reobject.dwFlags = REO_BELOWBASELINE; //reobject.dwUser = (DWORD)myObject; //the very object reobject.poleobj = lpObject; //client site contain the object reobject.polesite = lpClientSite; //the storage reobject.pstg = lpStorage; SIZEL sizel = { 0 }; reobject.sizel = sizel; LPOLECLIENTSITE lpObjectClientSite = NULL; hr = lpObject->GetClientSite(&lpObjectClientSite); if (FAILED(hr) || lpObjectClientSite == NULL) lpObject->SetClientSite(lpClientSite); pRichEditOle->InsertObject(&reobject); //redraw the window to show animation ::RedrawWindow(hwnd, NULL, NULL, RDW_INVALIDATE); } catch (...) { LOG__(ERR, _T("InsertImage unknown exeption")); } End: if (lpClientSite) { lpClientSite->Release(); lpClientSite = nullptr; } if (lpObject) { lpObject->Release(); lpObject = nullptr; } if (lpLockBytes) { lpLockBytes->Release(); lpLockBytes = nullptr; } if (lpStorage) { lpStorage->Release(); lpStorage = nullptr; } if (lpAnimator) { lpAnimator->Release(); lpAnimator = nullptr; } }
LRESULT CChatBkDlg::OnPreSendMsg(WPARAM wParam, LPARAM lParam) { switch (wParam) { case 0: if (m_pMsgEdit->GetRichEditCtrl().GetSafeHwnd() && m_pMsgEdit->GetRichEditCtrl().GetTextLength()) { clock_t clr0 = clock(); //将字符串插入到整个内容的最前面 m_pMsgEdit->GetRichEditCtrl().HideSelection(TRUE, FALSE); m_pMsgEdit->GetRichEditCtrl().SetSel(0, -1); m_pMsgEdit->GetRichEditCtrl().SetSelectionCharFormat(m_defaultCharFormat); CMemFile memFile(m_pBuf, BUFLEN); memFile.SeekToBegin(); ///////////////////////将整个 RichView中的内容写到内存文件中 EDITSTREAM es; es.dwCookie = (DWORD_PTR)&memFile; es.pfnCallback = RichEditStreamOutCallback; m_pMsgEdit->GetRichEditCtrl().SetSel(0, -1); m_pMsgEdit->GetRichEditCtrl().StreamOut(SF_RTF | SFF_SELECTION, es); m_pMsgEdit->GetRichEditCtrl().Clear(); m_pMsgEdit->GetRichEditCtrl().HideSelection(FALSE, FALSE); TRACE(_T("写入内存 用时:%d ms 时间:%d\n"), clock() - clr0, clock()); clr0 = clock(); //IRichEditOle* pRichEditOleMsg = pChatFrame->m_pMsgView->GetRichEditCtrl().GetIRichEditOle(); //int count = pRichEditOleMsg->GetObjectCount(); //for(int i = 0 ; i < count ; i++) //遍历位图 //{ // REOBJECT object; //位图信息存在这里 // memset(&object,0,sizeof(REOBJECT)); // object.cbStruct = sizeof(REOBJECT); // pRichEditOleMsg->GetObject(i, &object, REO_GETOBJ_ALL_INTERFACES); // int pos = object.cp ; //位图的位置信息 // DWORD dwUSer =object.dwUser; //位图的信息,之前应用程序设置的,应有程序当然知道什么意思了 //} //IRichEditOle* pRichEditOleRecord = pChatFrame->m_pRecordView->GetRichEditCtrl().GetIRichEditOle(); if (m_pCurrentUser->state == USERINFO::USER_STATE_ONLINE) { CNetData *pChatNetData = new CNetData(); pChatNetData->MakeNETBuffer(CNetData::TCP_CHATMSG, RIMConfig::GetInstance()->m_pLogonUser, m_pCurrentUser, m_curUserIP, m_pBuf, UINT(memFile.Seek(0, CFile::current))); if (pChatNetData->GetBufferLen()) RIMConfig::GetInstance()->m_TCPSendQueue.Push(pChatNetData); else delete pChatNetData; //int memFileLen = UINT(memFile.Seek(0, CFile::current)); //LPBYTE pBufferTemp = new BYTE[memFileLen + 5]; //////////////////////////////对数据进行压缩 //if (HZIP hz = CreateZip(pBufferTemp, memFileLen + 5, "")) //{ // tstring newGuidStr = GetNewGuid() + _T(".txt"); // if (ZR_OK == ZipAdd(hz, newGuidStr.c_str(), m_pBuf, UINT(memFile.Seek(0, CFile::current)))) // { // LPBYTE pZipBuffer = NULL; // DWORD destlen = 0; // ZipGetMemory(hz, (void**)&pZipBuffer, &destlen); // if (pZipBuffer && destlen) // { // CNetData *pChatNetData = new CNetData(); // pChatNetData->MakeNETBuffer(CNetData::TCP_CHATMSG, RIMConfig::GetInstance()->m_pLogonUser, m_pCurrentUser, pZipBuffer, destlen); // RIMConfig::GetInstance()->m_TCPSendQueue.Push(pChatNetData); // } // } // if (hz != NULL) { CloseZip(hz); hz = NULL; } //} //if (pBufferTemp) // delete[] pBufferTemp; } TRACE(_T("写入数据队列 用时:%d ms 时间:%d\n"), clock() - clr0, clock()); clr0 = clock(); {//////////////// 将内存文件中的内容写到通话记录视图中 ///////////////构造字符串,包括发送的用户,及发送时间 SYSTEMTIME systemtime; GetLocalTime(&systemtime); TCHAR ch[MAX_PATH] ={ 0 }; _stprintf_s(ch, MAX_PATH, _T("%s (%d/%02d/%02d %02d:%02d:%02d):\n"), RIMConfig::GetInstance()->m_pLogonUser->UserName.c_str(), systemtime.wYear, systemtime.wMonth, systemtime.wDay, systemtime.wHour, systemtime.wMinute, systemtime.wSecond); memFile.SeekToBegin(); m_pRecordView->GetRichEditCtrl().SetReadOnly(FALSE); m_pRecordView->GetRichEditCtrl().SetSel(-2, -1); m_pRecordView->GetRichEditCtrl().SetWordCharFormat(m_sendUserCharFormat); m_pRecordView->GetRichEditCtrl().ReplaceSel(ch, FALSE); //输入用户发送时间 EDITSTREAM es; es.dwCookie = (DWORD_PTR)&memFile; es.pfnCallback = RichEditStreamInCallback; m_pRecordView->GetRichEditCtrl().SetSel(-2, -1); m_pRecordView->GetRichEditCtrl().StreamIn(SF_RTF | SFF_SELECTION, es); //为了解决添加SFF_SELECTION后,自动滚动不显示的问题 if(!(GetAsyncKeyState(VK_LBUTTON) && 0x8000)) ////鼠标没有按下 m_pRecordView->GetRichEditCtrl().PostMessage(WM_VSCROLL, MAKELONG(SB_BOTTOM, 0), 0);; m_pRecordView->GetRichEditCtrl().SetReadOnly(TRUE); } TRACE(_T("写入上面View 用时:%d ms 时间:%d\n"), clock() - clr0, clock()); clr0 = clock(); } break; case 1: { CFileDialog filedlg(TRUE, NULL, NULL, OFN_PATHMUSTEXIST | OFN_READONLY, _T("All Files (*.*)|*.*||"), this); if (IDOK == filedlg.DoModal()) { CString filePath = filedlg.GetPathName(); SendFileOrDic(filePath); } InvalidateRect(m_sendFileRc, FALSE); } break; case 2: { TCHAR szPath[MAX_PATH] ={ 0 }; //存放选择的目录路径 BROWSEINFO bi; bi.hwndOwner = m_hWnd; bi.pidlRoot = NULL; bi.pszDisplayName = szPath; bi.lpszTitle = _T("请选择需要导出的目录:"); bi.ulFlags = BIF_RETURNONLYFSDIRS; bi.lpfn = BrowseCallbackProc; //设置CALLBACK函数 bi.iImage = 0; bi.lParam = long(m_oldDic.GetBuffer()); //弹出选择目录对话框 LPITEMIDLIST lp = SHBrowseForFolder(&bi); if (lp && SHGetPathFromIDList(lp, szPath)) { m_oldDic = szPath; SendFileOrDic(szPath); } InvalidateRect(m_sendDicRc, FALSE); } break; case 3: { CString sFilter = _T("All image file|*.bmp;*.jpg;|Bitmap Files (*.bmp)|*.bmp|JPEG Files (*.jpg)|*.jpg|"); //CString sFilter = _T("All image file|*.bmp;*.jpg;*.gif|Bitmap Files (*.bmp)|*.bmp|JPEG Files (*.jpg)|*.jpg|GIF Files (*.gif)|*.gif|"); CFileDialog filedlg(TRUE, NULL, NULL, OFN_PATHMUSTEXIST | OFN_READONLY, sFilter, this); if (IDOK == filedlg.DoModal()) { CTapBitmap bmp; if (bmp.Load(filedlg.GetPathName()) == FALSE) { AfxMessageBox(_T("Could not load image.")); return TRUE; } CEnBitmap enBitmap; CBitmap Bitmap; if (enBitmap.Attach(bmp.GetBMP(), 0)) { Bitmap.DeleteObject(); Bitmap.Attach(enBitmap.Detach()); IRichEditOle *pRichEditOle; pRichEditOle = m_pMsgEdit->GetRichEditCtrl().GetIRichEditOle(); HBITMAP hBitmap = (HBITMAP)Bitmap; if (hBitmap) { ImageDataObject::InsertBitmap(pRichEditOle, hBitmap); } pRichEditOle->Release(); } } InvalidateRect(m_sendPictureRc, FALSE); } break; } return TRUE; }