炫彩界面库论坛

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 2334|回复: 0

我将代码全改成ANSI的啦。哈啊哈 提供一个思路,所以没有

[复制链接]

该用户从未签到

发表于 2013-4-3 15:26:18 | 显示全部楼层 |阅读模式
[ 本帖最后由 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);    }}
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

QQ|Archiver|手机版|小黑屋|炫彩界面库 ( 鄂ICP备2023014763号-1 )

GMT+8, 2024-9-20 00:32 , Processed in 0.089824 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表