bool SColorParser::ParseValue(const SStringW & strValue, COLORREF & value) { int r = 255, g = 255, b = 255, a = 255; int nSeg=0; SStringW strValueL = strValue; strValueL.MakeLower(); if(strValueL.Left(1)==L"#") { nSeg = swscanf(strValueL,L"#%02x%02x%02x%02x",&r,&g,&b,&a); }else if(strValueL.Left(4).CompareNoCase(L"rgba")==0) { nSeg = swscanf(strValueL,L"rgba(%d,%d,%d,%d)",&r,&g,&b,&a); }else if(strValueL.Left(3).CompareNoCase(L"rgb")==0) { nSeg = swscanf(strValueL,L"rgb(%d,%d,%d)",&r,&g,&b); } if(nSeg!=3 && nSeg != 4) { SASSERT_FMT(FALSE,TEXT("ParseColor Failed with [%s]"),S_CW2T(strValue)); return false; }else { value = RGBA(r,g,b,a); return true; } }
bool SPropertyItemColor::ParseValue(const SStringT & strValue, COLORREF & value) { int r,g,b,a=255; int nSeg=0; SStringW strValueL = strValue; strValueL.MakeLower(); if(strValueL.Left(1)==L"#") { nSeg = swscanf(strValueL,L"#%02x%02x%02x%02x",&r,&g,&b,&a); }else if(strValueL.Left(4).CompareNoCase(L"rgba")==0) { nSeg = swscanf(strValueL,L"rgba(%d,%d,%d,%d)",&r,&g,&b,&a); }else if(strValueL.Left(3).CompareNoCase(L"rgb")==0) { nSeg = swscanf(strValueL,L"rgb(%d,%d,%d)",&r,&g,&b); } if(nSeg!=3 && nSeg != 4) { //SASSERT_FMT(FALSE,TEXT("解析颜色值失败 [%s]"),S_CW2T(strValue)); value = CR_INVALID; return false; }else { value = RGBA(r,g,b,a); return true; } }
bool San::FileIOStream::gloWriteFile(const SString &strFilePath, const SStringW &strData, const bool bCover) { if (strFilePath.empty()) { return false; } ios::openmode FileFlag = ios::binary | ios::out; if (bCover) { FileFlag = FileFlag | ios::trunc; } else { FileFlag = FileFlag | ios::ate; } fstream* pFile = new fstream(strFilePath, FileFlag, 0x40); if (pFile == nullptr) { return false; } pFile->write((const char*) strData.c_str(), sizeof(swchar) *strData.size()); pFile->close(); delete pFile; pFile = nullptr; return true; }
LRESULT SSkinImgFrame2::OnAttrSrc(const SStringW & strValue,BOOL bLoading) { int iPos = strValue.Find(L'{'); if(iPos==-1) return E_FAIL; m_strImgKey = strValue.Left(iPos); SStringW strRgn = strValue.Right(strValue.GetLength()-iPos); if(swscanf(strRgn,L"{%d,%d,%d,%d}",&m_rcImg.left,&m_rcImg.top,&m_rcImg.right,&m_rcImg.bottom)!=4) { CPoint pt; CSize sz; if(swscanf(strRgn,L"{%d,%d,@%d,@%d}",&pt.x,&pt.y,&sz.cx,&sz.cy)!=4) return E_FAIL; m_rcImg = CRect(pt,sz); } IMGPOOL::CPair * p = s_imgPool.Lookup(m_strImgKey); if(p) { SSkinImgFrame::SetImage(p->m_value); p->m_value->AddRef(); }else { IBitmap *pImg=LOADIMAGE2(m_strImgKey); if(!pImg) return E_FAIL; s_imgPool[m_strImgKey]=pImg; SSkinImgFrame::SetImage(pImg); } return S_OK; }
void STimeEdit::SetMins(int nMins) { m_nMins = nMins; SStringW strText; strText.Format(L"%02d:%02d", m_nHours, m_nMins); SetWindowText(strText); }
////////////////////////////////////////////////////////////////////////// // xml helpers SStringW XMLEscape(SStringW& strXML) { strXML.Replace(L"&", L"&"); strXML.Replace(L"<", L"<"); strXML.Replace(L">", L">"); strXML.Replace(L"'", L"'"); strXML.Replace(L"\"", L"""); return strXML; }
void SMenu::BuildMenu( HMENU menuPopup,pugi::xml_node xmlNode ) { pugi::xml_node xmlItem=xmlNode.first_child(); while(xmlItem) { if(wcscmp(L"item",xmlItem.name())==0) { SMenuItemData *pdmmi=new SMenuItemData; pdmmi->hMenu=menuPopup; pdmmi->itemInfo.iIcon=xmlItem.attribute(L"icon").as_int(-1); SStringW strText = xmlItem.text().get(); strText.TrimBlank(); InitMenuItemData(pdmmi->itemInfo,strText); int nID=xmlItem.attribute(L"id").as_int(0); BOOL bCheck=xmlItem.attribute(L"check").as_bool(false); BOOL bRadio=xmlItem.attribute(L"radio").as_bool(false); BOOL bDisable=xmlItem.attribute(L"disable").as_bool(false); pugi::xml_writer_buff writer; xmlItem.print(writer,L"\t",pugi::format_default,pugi::encoding_utf16); SStringW str(writer.buffer(),writer.size()); pugi::xml_node xmlChild=xmlItem.first_child(); while(xmlChild && xmlChild.type()==pugi::node_pcdata) xmlChild=xmlChild.next_sibling(); if(!xmlChild) { pdmmi->nID=nID; UINT uFlag=MF_OWNERDRAW; if(bCheck) uFlag|=MF_CHECKED; if(bDisable) uFlag |= MF_GRAYED; if(bRadio) uFlag |= MFT_RADIOCHECK|MF_CHECKED; AppendMenu(menuPopup,uFlag,(UINT_PTR)pdmmi->nID,(LPCTSTR)pdmmi); } else { HMENU hSubMenu=::CreatePopupMenu(); pdmmi->nID=(UINT_PTR)hSubMenu; UINT uFlag=MF_OWNERDRAW|MF_POPUP; if(bDisable) uFlag |= MF_GRAYED; AppendMenu(menuPopup,uFlag,(UINT_PTR)hSubMenu,(LPCTSTR)pdmmi); BuildMenu(hSubMenu,xmlItem);//build sub menu } m_arrDmmi.Add(pdmmi); } else if(wcscmp(L"sep",xmlItem.name())==0) { AppendMenu(menuPopup,MF_SEPARATOR|MF_OWNERDRAW,(UINT_PTR)0,(LPCTSTR)NULL); } xmlItem=xmlItem.next_sibling(); } }
BOOL RichEditBkImg::ParsePosition34(POSITION_ITEM* pPosItem, const SStringW & strPos3, const SStringW &strPos4 ) { if(strPos3.IsEmpty() || strPos4.IsEmpty()) return FALSE; POSITION_ITEM pos3,pos4; if(!StrPos2ItemPos(strPos3,pos3) || !StrPos2ItemPos(strPos4,pos4) ) return FALSE; pPosItem [PI_RIGHT] = pos3; pPosItem [PI_BOTTOM] = pos4; return TRUE; }
HRESULT SLinearLayoutParam::OnAttrWidth(const SStringW & strValue,BOOL bLoading) { if(strValue.CompareNoCase(L"matchParent") == 0) width.setMatchParent(); else if(strValue.CompareNoCase(L"wrapContent") == 0) width.setWrapContent(); else width = GETLAYOUTSIZE(strValue); return S_OK; }
BOOL RichEditBkImg::ParsePosition12(POSITION_ITEM* pPosItem, const SStringW & strPos1, const SStringW &strPos2 ) { if(strPos1.IsEmpty() || strPos2.IsEmpty()) return FALSE; POSITION_ITEM pos1,pos2; if(!StrPos2ItemPos(strPos1,pos1) || !StrPos2ItemPos(strPos2,pos2) ) return FALSE; if(pos1.pit == PIT_SIZE || pos2.pit == PIT_SIZE)//前面2个属性不能是size类型 return FALSE; pPosItem [PI_LEFT] = pos1; pPosItem [PI_TOP] = pos2; return TRUE; }
void SMenu::InitMenuItemData(SMenuItemInfo & itemInfo, const SStringW & strTextW) { itemInfo.strText=S_CW2T(TR(strTextW,m_menuAttr.m_strTrCtx)); //查找快捷键 int iHotKey = strTextW.Find(L"&"); if(iHotKey != -1 && iHotKey < strTextW.GetLength()-1) { itemInfo.vHotKey = tolower(strTextW[iHotKey+1]); }else { itemInfo.vHotKey = 0; } }
BOOL RichEditBkImg::StrPos2ItemPos(const SStringW &strPos, POSITION_ITEM & pos) { if(strPos.IsEmpty()) return FALSE; LPCWSTR pszPos = strPos; switch(pszPos[0]) { //case POSFLAG_REFCENTER: pos.pit=PIT_CENTER,pszPos++;break; //case POSFLAG_PERCENT: pos.pit=PIT_PERCENT,pszPos++;break; case POSFLAG_REFPREV_NEAR: pos.pit=PIT_PREV_NEAR,pszPos++;break; case POSFLAG_REFNEXT_NEAR: pos.pit=PIT_NEXT_NEAR,pszPos++;break; case POSFLAG_REFPREV_FAR: pos.pit=PIT_PREV_FAR,pszPos++;break; case POSFLAG_REFNEXT_FAR: pos.pit=PIT_NEXT_FAR,pszPos++;break; case POSFLAG_SIZE:pos.pit=PIT_SIZE,pszPos++;break; default: pos.pit=PIT_NORMAL;break; } pos.nRefID = -1;//not ref sibling using id if(pszPos [0] == L'-') { pos.cMinus = -1; pszPos ++; }else { pos.cMinus = 1; } pos.nPos=(float)_wtof(pszPos); return TRUE; }
SStringW SLayoutSize::toString() const { SStringW strValue = SStringW().Format(L"%f",fSize); //去掉sprintf("%f")生成的小数点最后无效的0 LPCWSTR pszData = strValue; for(int i=strValue.GetLength()-1;i>=0;i--) { if(pszData[i]!=L'0') { if(pszData[i]==L'.') i--; strValue = strValue.Left(i+1); break; } } return SStringW().Format(L"%s%s",strValue,s_pszUnit[unit]); }
void SLayoutSize::parseString(const SStringW & strSize) { if(strSize.IsEmpty()) return; SStringW strUnit = strSize.Right(2); strUnit.MakeLower(); unit = px; for(int i=0; i< ARRAYSIZE(s_pszUnit);i++) { if(strUnit.Compare(s_pszUnit[i]) == 0) { unit = (Unit)i; break; } } fSize = (float)_wtof(strSize); }
void CMainDlg::InsertSingleInfo(tagMusicInfo pMusicInfo, int nNum) { /*---------------------------------------------- listboxex动态插入 beg -----------------------------------------------------*/ //m_SeleInfoMap.clear(); SListBoxEx *pMusicLbe=FindChildByName2<SListBoxEx>(L"music_lbe"); if(pMusicLbe) { SStringW m_sTemp; //信息 SStringW StrTotleTime;//时间 DWORD dwTotleTime = pMusicInfo.dwTime; StrTotleTime.Format(L"%u:%02u",dwTotleTime/60,dwTotleTime%60); if (nNum%2) { m_sTemp.Format(L"<item>\ <img skin=\"_skin.logo.skin\" pos=\"5,5,55,55\" />\ <text pos=\"70,5\" valign=\"middle\" align=\"left\" colorText=\"#CDD7E1\" >歌曲:%s </text>\ <text pos=\"70,20\" valign=\"middle\" align=\"left\" colorText=\"#CDD7E1\" >歌手:%s </text>\ <text pos=\"70,35\" valign=\"middle\" align=\"left\" colorText=\"#CDD7E1\" >时长:%s 交流群:229313785 </text>\ </item>",pMusicInfo.szTitle,pMusicInfo.szArtist,StrTotleTime); }else {
SStringW SChatEdit::GetFormatText() { SStringW strTxt; TEXTRANGE txtRng; txtRng.chrg.cpMin =0; txtRng.chrg.cpMax = SSendMessage(WM_GETTEXTLENGTH); txtRng.lpstrText = (LPTSTR)strTxt.GetBufferSetLength(txtRng.chrg.cpMax); SSendMessage(EM_GETTEXTRANGE,0,(LPARAM)&txtRng); strTxt.ReleaseBuffer(); SComPtr<IRichEditOle> ole; SSendMessage(EM_GETOLEINTERFACE,0,(LPARAM)(void**)&ole); SStringW strMsg; int iPlainTxtBegin = 0; for(int i=0;i<strTxt.GetLength();i++) { if(strTxt[i] == 0xfffc) {//找到一个OLE对象 strMsg += strTxt.Mid(iPlainTxtBegin,i-iPlainTxtBegin); iPlainTxtBegin = i+1; REOBJECT reobj={sizeof(reobj),0}; reobj.cp = i; HRESULT hr = ole->GetObject( REO_IOB_USE_CP , &reobj, REO_GETOBJ_POLEOBJ); if(SUCCEEDED(hr) && reobj.poleobj) { if(reobj.clsid == CLSID_CSoSmileyCtrl) { SComPtr<ISoSmileyCtrl> smiley; hr = reobj.poleobj->QueryInterface(__uuidof(ISoSmileyCtrl), (void**)&smiley); if(SUCCEEDED(hr)) { SComPtr<ISmileySource> source; hr = smiley->GetSource(&source); SASSERT(SUCCEEDED(hr)); UINT uID = -1; SStringW strSmiley = L"<smiley"; if(SUCCEEDED(source->GetID(&uID))) { strSmiley += SStringW().Format(L" id=\"%d\"",uID); } BSTR strFile; if(SUCCEEDED(source->GetFile(&strFile))) { strSmiley += SStringW().Format(L" path=\"%s\"",strFile); ::SysFreeString(strFile); } strSmiley += L"/>"; strMsg += strSmiley; } } reobj.poleobj->Release(); } } } if(iPlainTxtBegin<strTxt.GetLength()) { strMsg += strTxt.Right(strTxt.GetLength()-iPlainTxtBegin); } return strMsg; }
int SChatEdit::_InsertFormatText(int iCaret,CHARFORMATW cf,pugi::xml_node xmlText,BOOL bCanUndo) { SStringW strText = xmlText.value(); if(xmlText.name() == KLabelSmiley) {//insert smiley SComPtr<ISoSmileyCtrl> pSmiley; HRESULT hr=::CoCreateInstance(CLSID_CSoSmileyCtrl,NULL,CLSCTX_INPROC,__uuidof(ISoSmileyCtrl),(LPVOID*)&pSmiley); if(FAILED(hr)) return 0; SComPtr<IRichEditOle> ole; if(SSendMessage(EM_GETOLEINTERFACE,0,(LPARAM)(void**)&ole) && ole) { SComPtr<IRichEditOleCallback> pCallback; hr=ole->QueryInterface(IID_IRichEditOleCallback,(void**)&pCallback); if(FAILED(hr)) return 0; SComPtr<ISmileyHost> host; hr = pCallback->QueryInterface(__uuidof(ISmileyHost),(void**)&host); if(FAILED(hr)) return 0; SComPtr<ISmileySource> pSource; hr = host->CreateSource(&pSource); if(FAILED(hr)) return 0; { UINT uID = xmlText.attribute(L"id").as_uint(-1); SStringW strPath = xmlText.attribute(L"path").value(); if(uID != -1) hr = pSource->LoadFromID(uID); else hr = pSource->LoadFromFile(strPath); if(SUCCEEDED(hr)) { pSmiley->SetSource(pSource); SSendMessage(EM_SETSEL,iCaret,iCaret); pSmiley->Insert2Richedit((DWORD_PTR)(void*)ole); } } } return SUCCEEDED(hr)?1:0; } CHARFORMATW cfNew = cf; cfNew.dwMask = 0; if(xmlText.name() == KLabelColor) { cfNew.crTextColor = StringToColor(xmlText.attribute(L"value").value()) & 0x00ffffff; cfNew.dwMask |= CFM_COLOR; }else if(xmlText.name()== KLabelFont) { wcscpy(cf.szFaceName,cfNew.szFaceName); wcscpy_s(cfNew.szFaceName,LF_FACESIZE-1,xmlText.attribute(L"value").value()); cfNew.dwMask |= CFM_FACE; }else if(xmlText.name()==KLabelUnderline) { cfNew.dwMask |=CFM_UNDERLINE; cfNew.dwEffects |= CFE_UNDERLINE; }else if(xmlText.name() == KLabelItalic) { cfNew.dwMask |=CFM_ITALIC; cfNew.dwEffects |= CFE_ITALIC; }else if(xmlText.name() == KLabelBold) { cfNew.dwMask |=CFM_BOLD; cfNew.dwEffects |= CFE_BOLD; }else if(xmlText.name() == KLabelStrike) { cfNew.dwMask |= CFM_STRIKEOUT; cfNew.dwEffects |= CFE_STRIKEOUT; }else if(xmlText.name() == KLabelLink) { cfNew.dwMask |= CFM_LINK; cfNew.dwEffects |= CFE_LINK; COLORREF cr = StringToColor(xmlText.attribute(L"color").value()); if(cr!=0) { cfNew.dwMask |= CFM_COLOR; cfNew.crTextColor = cr & 0x00ffffff; } }else if(xmlText.name() == KLabelSize) { cfNew.dwMask |= CFM_SIZE; HDC hdc=GetDC(NULL); LONG yPixPerInch = GetDeviceCaps(hdc, LOGPIXELSY); ReleaseDC(NULL,hdc); cfNew.yHeight = abs(MulDiv(xmlText.attribute(L"value").as_uint(12), LY_PER_INCH, yPixPerInch)); } int nRet = strText.GetLength(); SSendMessage(EM_REPLACESEL,bCanUndo,(LPARAM)(LPCWSTR)strText); int iEnd = iCaret + nRet; SSendMessage(EM_SETSEL,iCaret,iEnd); SSendMessage(EM_SETCHARFORMAT,SCF_SELECTION,(LPARAM)&cfNew); iCaret = iEnd; SSendMessage(EM_SETSEL,iCaret,iCaret); pugi::xml_node xmlChild = xmlText.first_child(); while(xmlChild) { int nSubLen = _InsertFormatText(iCaret,cfNew,xmlChild,bCanUndo); iCaret += nSubLen; nRet += nSubLen; xmlChild = xmlChild.next_sibling(); } if(cfNew.dwMask) { cf.dwMask = CFM_ALL; SSendMessage(EM_SETCHARFORMAT,SCF_SELECTION,(LPARAM)&cf); } return nRet; }
VARIANT ExecuteScript(IWebBrowser2 *pWebBrowser, const SStringW & fun,SArray<SStringW> & params) { VARIANT varErr; VariantInit( &varErr ); //get document dispatch interface IDispatch* pDisp = NULL; HRESULT hr = pWebBrowser->get_Document( &pDisp ); if ( FAILED( hr ) || pDisp == NULL ) { return varErr; } IHTMLDocument2* pDoc = NULL; pDisp->QueryInterface( IID_IHTMLDocument2,(void**)&pDoc ); pDisp->Release(); IDispatch* pScript = NULL; hr = pDoc->get_Script( &pScript ); pDoc->Release(); if ( FAILED( hr ) || pScript == NULL ) { return varErr; } sbstr bstrMember((int)fun.GetLength(),fun ); DISPID dispid = 0; BSTR bstr = (BSTR)bstrMember; hr = pScript->GetIDsOfNames( IID_NULL,&(bstr),1,LOCALE_SYSTEM_DEFAULT,&dispid ); if ( FAILED( hr ) ) { return varErr; } DISPPARAMS dispparams; ::ZeroMemory( &dispparams,sizeof( DISPPARAMS ) ); dispparams.cArgs = (UINT)params.GetCount(); dispparams.rgvarg = new VARIANT[dispparams.cArgs]; dispparams.cNamedArgs = 0; for ( size_t i = 0;i < params.GetCount();i++ ) { size_t indx = params.GetCount() - i - 1; sbstr bstrParam((int)params[indx].GetLength(),params[indx]); dispparams.rgvarg[i].bstrVal = bstrParam.Release(); dispparams.rgvarg[i].vt = VT_BSTR; } EXCEPINFO excepinfo; ::ZeroMemory( &excepinfo,sizeof( EXCEPINFO ) ); VARIANT varRet; UINT nArgErr = (UINT)-1; //initialize to invalid arg hr = pScript->Invoke( dispid,IID_NULL,0,DISPATCH_METHOD,&dispparams,&varRet,&excepinfo,&nArgErr ); delete []dispparams.rgvarg; pScript->Release(); if ( FAILED( hr ) ) { return varErr; } return varRet; }
SStringW cXMLLoader::_StringTranslate(SStringW strSource) { if (strSource.empty()) { return L""; } uint32 Size = strSource.length() + 1; swchar* pDest = new swchar[Size]; ::gloMemSet(pDest, 0, sizeof(swchar) *Size); const swchar* pSrc = strSource.c_str(); uint32 DestSeek = 0; for (uint32 seek = 0; seek<Size; seek = seek + 1) { if (pSrc[seek] != L'&') { pDest[DestSeek] = pSrc[seek]; } else { uint32 seek_begin = seek; while ((seek<Size) && (pSrc[seek] != L';')) { seek = seek + 1; } if (seek == Size) { delete[] pDest; pDest = nullptr; return L""; } switch (seek - seek_begin - 1) { case 2: if ((pSrc[seek_begin + 1] == L'l') && (pSrc[seek_begin + 2] == L't')) { pDest[DestSeek] = L'<'; } if ((pSrc[seek_begin + 1] == L'g') && (pSrc[seek_begin + 2] == L't')) { pDest[DestSeek] = L'>'; } break; case 3: if ((pSrc[seek_begin + 1] == L'a') && (pSrc[seek_begin + 2] == L'm') && (pSrc[seek_begin + 3] == L'p')) { pDest[DestSeek] = L'&'; } break; case 4: if ((pSrc[seek_begin + 1] == L'a') && (pSrc[seek_begin + 2] == L'p') && (pSrc[seek_begin + 3] == L'o') && (pSrc[seek_begin + 4] == L's')) { pDest[DestSeek] = L'\''; } if ((pSrc[seek_begin + 1] == L'q') && (pSrc[seek_begin + 2] == L'u') && (pSrc[seek_begin + 3] == L'o') && (pSrc[seek_begin + 4] == L't')) { pDest[DestSeek] = L'='; } break; default: delete[] pDest; pDest = nullptr; return L""; } } DestSeek = DestSeek + 1; } SStringW DestString = pDest; delete[] pDest; pDest = nullptr; return DestString; }
COLORREF Hex2Color(const SStringW & strColor,COLORREF crDef) { if(strColor.IsEmpty()) return crDef; return GETCOLOR(strColor); }
SStringW Color2Hex(COLORREF cr) { SStringW str; str.Format(L"#%02x%02x%02x%02x",GetRValue(cr),GetGValue(cr),GetBValue(cr),GetAValue(cr)); return str; }