|
[ 本帖最后由 liuzewei 于 2013-4-3 15:27 编辑 ]
我将代码全改成ANSI的啦。哈啊哈
提供一个思路,所以没有整理,如果有考虑过这个问题的朋友能看懂
--- 14:48:31
我将代码全改成ANSI的啦。哈啊哈
--- 14:48:46
--- 14:49:41
源代码 没弄个UNICODE的宏开关
就写了一种
---- 14:50:00
龙开关也不行啊
中文输入部分要处理一下,接口也要改成char*
---- 14:50:44
一般VC接口啥的都是xxxA xxxW的
---- 14:53:37
都改成ANSI也不好,在英语系统上应该不能显示中文,即使带了中文字库。因为DrawText这些GDI在英语系统上的ACP不是中文。。所以,最好是请老大改成接口是char*,UTF8编码的,然后内部全部使用WCHAR
---- 14:53:59
其实UTF8最好
----- 14:54:09
内部显式调用XxxxW()这些系统API
然后编译选项还是选多字节,不要选unicode。这样对使用者的限制就小了
---- 14:55:18
嗯
---- 14:55:28
哦累累,哦啦啦
---- 14:55:33
不过我没精力改了啊,量太大了
---- 14:55:33
----- 14:56:29
全改成ANSI可以支持在中文系统上可以显示中文,英文系统上可以显示英文。。。也够自己用啦
----- 14:56:44
做个代码转换器
自己转换呗
---- 14:57:19
---- 14:57:21
哪个有svn client帮我下个东东呢
----- 14:59:05
int WINAPI X_UnicodeToAnsi(const wchar_t *pIn,char *pOut = NULL,int outLen = 0);
int WINAPI X_AnsiToUnicode(const char *pIn,wchar_t *pOut = NULL,int outLen = 0);
int WINAPI X_UnicodeToUTF8(const wchar_t *pIn, char *pOut = NULL,int outLen = 0);
int WINAPI X_UTF8ToUnicode(const char *pIn,wchar_t *pOut = NULL,int outLen = 0);
int WINAPI X_AnsiToUTF8(const char *pIn,char *pOut = NULL,int outLen = 0);
int WINAPI X_UTF8ToAnsi(const char *pIn,char *pOut = NULL,int outLen = 0);
int WINAPI X_UnicodeToAnsi(const wchar_t *pIn,char *pOut,int outLen)
{
return WideCharToMultiByte(CP_ACP,NULL,pIn,-1,pOut,outLen, NULL, NULL);
}
int WINAPI X_AnsiToUnicode(const char *pIn,wchar_t *pOut,int outLen)
{
return MultiByteToWideChar(CP_ACP,0,pIn,-1,pOut,outLen);
}
int WINAPI X_UnicodeToUTF8(const wchar_t *pIn, char *pOut, int outLen)
{
return WideCharToMultiByte(CP_UTF8, 0, pIn, -1, pOut, outLen, NULL, NULL);
}
int WINAPI X_UTF8ToUnicode(const char *pIn, wchar_t *pOut, int outLen)
{
return MultiByteToWideChar(CP_UTF8,0,pIn,-1,pOut,outLen);
}
int WINAPI X_AnsiToUTF8(const char *pIn,char *pOut,int outLen)
{
int unicodeLen = X_AnsiToUnicode(pIn);
wchar_t* pUnicode = new wchar_t[unicodeLen];
X_AnsiToUnicode(pIn, pUnicode, unicodeLen);
int utf8Len = X_UnicodeToUTF8(pUnicode, pOut, outLen);
delete[] pUnicode;
return utf8Len;
}
int WINAPI X_UTF8ToAnsi(const char *pIn,char *pOut,int outLen)
{
int unicodeLen = X_UTF8ToUnicode(pIn);
wchar_t* pUnicode = new wchar_t[unicodeLen];
X_UTF8ToUnicode(pIn, pUnicode, unicodeLen);
int ansiLen = X_UnicodeToAnsi(pUnicode, pOut, outLen);
delete[] pUnicode;
return ansiLen;
}
---- 15:03:05
struct richEdit_item_char_ //字符{ richEdit_item_ item; char ch[3]; ----》DBCS int cz;
//////自定义属性///////////////////////// HFONT hFont; //自定义字体 richEdit_font_Info_ *pFontInfo; BOOL bColor; //颜色是否有效 COLORREF color; //颜色 //自定义字符间距};然后在struct richEdit_{ ......
// DBCS 处理 BOOL bDBCS; char chDBCS[3]; int czDBCS;};
--- 15:07:54
richedit很好改,因为它本身就把一个个字符看成一个个元素,每个元素保存自己的内容,比如字符(或多字节字符数组),还有宽度等,只要修改原有结构为多字节就OK
edit不好改,因为它是字符串保存整个句子,所以改起来就不好改了,要改很多代码。
所以,最后我选择把edit的bMultiLine,bPass,bNumber功能在richedit里实现了一遍,不用edit就好了
---- 15:10:39
edit不好改的地方有比如光标的回退,定位之类的,但是richedit就很好改,因为原来的代码光标定位就是直接读取每个元素中struct richEdit_item_
{
rictEdit_ItemType_ type; //类型
richEdit_line_ *pLine; // 所属行节点
SIZE size;
};
size变量
其它相关代码:BOOL RichEdit_CharAsDBCS(HELE hEle, char ch){ richEdit_ *pRichEdit=(richEdit_*)hEle;
BOOL newChar = FALSE; if (pRichEdit->bDBCS) { pRichEdit->chDBCS[pRichEdit->czDBCS++] = ch; pRichEdit->bDBCS = FALSE; newChar = TRUE; } else { for (int i = 0; i < 3; ++i) pRichEdit->chDBCS[i] = 0; pRichEdit->czDBCS = 0; pRichEdit->chDBCS[pRichEdit->czDBCS++] = ch; if (IsDBCSLeadByte(ch)) pRichEdit->bDBCS = TRUE; else newChar = TRUE; }
return newChar;}
void RichEdit_Char(HELE hEle,char ch) //字符{ richEdit_ *pRichEdit=(richEdit_*)hEle; if (RichEdit_CharAsDBCS(hEle, ch)) { if(pRichEdit->bNumber) //数子 48 - 57 { if(ch<48 || ch>57) return; }
if(pRichEdit->bDrawSelect) RichEdit_DeleteSelect(hEle); //删除选择文本 //字符长度 SIZE size; HDC hdc=GetDC(NULL); HGDIOBJ hOldFont=SelectObject(hdc,XFont_GetHFONT(((ele_*)hEle)->hFontX));
if (pRichEdit->bPass) { char chMask = '*'; GetTextExtentPoint32(hdc,&chMask,1,&size); } else { GetTextExtentPoint32(hdc,pRichEdit->chDBCS,pRichEdit->czDBCS,&size); if(VK_TAB==pRichEdit->chDBCS[0]) size.cx=size.cy*2; }
SelectObject(hdc,hOldFont); ReleaseDC(NULL,hdc);
richEdit_item_char_ *pItem=(richEdit_item_char_*)malloc(sizeof(richEdit_item_char_)); pItem->item.type=richEdit_itemType_char; pItem->item.size=size; pItem->cz = pRichEdit->czDBCS; for (int q = 0; q <= pRichEdit->czDBCS; ++q) pItem->ch[q] = pRichEdit->chDBCS[q]; pItem->hFont=NULL; pItem->pFontInfo=NULL; pItem->bColor=FALSE; pItem->color=0;
//获取当前行 richEdit_line_ *pLine=(richEdit_line_*)XArray_GetAt(pRichEdit->hArrayLine,pRichEdit->row); pItem->item.pLine=pLine;
int countItem=XArray_GetCount(pLine->hArrayItem); if(pRichEdit->column==countItem) //增加到末尾 { XArray_Add(pLine->hArrayItem,pItem); //增加到行末尾 }else { XArray_insert(pLine->hArrayItem,pItem,pRichEdit->column); //插入 }
pLine->lenPixel+=size.cx; //行长度增加
pRichEdit->column++; //当前列增加 pRichEdit->caretPt.x+=size.cx;
if(size.cy>pLine->maxItemHeight) pLine->maxItemHeight=size.cy;
pRichEdit->bAdjustCaret=TRUE; pRichEdit->bAdjust=TRUE;
//RichEdit_Adjust(hEle); //RichEdit_SetCaretPos(hEle); //RichEdit_ScrollH(hEle); XEle_RedrawEle(hEle); }}
|
|