天天看點

VC開發多語言界面支援的簡單方法

VC開發多語言界面支援的簡單方法 作者:成曉旭 ( 需要完整源代碼請留言 ) 最近在做一個小程式,要求實作對多語言界面顯示支援功能,并且,界面顯示内容使用者能夠自己設定。 初步設計用 INI 檔案來配置顯示内容,換一種語言的配置檔案,就能夠更換整個系統的顯示語言。考慮到系統規模很小,周期又短,不想用太複雜的方案來解決這個問題,當參考了很多網上類似的設計和代碼,發現都不是很滿意。 主要問題在于:絕大多數基于 INI 檔案配置這種簡單應有實作的代碼,都是針對元件 ID 固定加載,寫死了元件的 ID 号,比如: strCaption = fileManager.GetString(section,"IDC_Stc_ListStudent",""); SetDlgItemText(IDC_Stc_ListStudent,strCaption); strCaption = fileManager.GetString(section,"IDC_Stc_AllContent",""); SetDlgItemText(IDC_Stc_AllContent,strCaption);          這樣:界面元件越多,加載代碼越長;每新增一個顯示視窗,又必須複制、粘貼類似的代碼,根據元件 ID 常量值來修改相關的附加元件。很是不爽!          初步設想是:設計統一、通用的視窗元件 Caption 設定方法,對給定的 Frame 或 Dialog 等 Window 容器元件内的是以元件進行周遊,當增、減顯示元件不對語言包加載代碼産生影響,達到自适應界面元件語言包加載效果。          這樣就産生一個新問題:語言包配置檔案中的 Caption 值如何跟相關的元件正确地一一對應? 好友文國慶建議:用 XML 檔案來定義這種對應關系。這個想法觸動了我:反正就是一個 [Key,Value] 的資料,就用已經實作的 INI 配置檔案也可以啊。于是所有問題解決! 具體設計是:語言包配置檔案就直接設定成元件 ID 與元件顯示資訊的 Hash 表, Key = Value 的形式,比如: BtnOK 元件的 ControlID 為“ 1003 ” , 中文顯示 Caption 為“登入”,語言包配置内容就是“ 1003= 登入”。 語言包的加載過程為 2 步實作: 首先,從語言包配置檔案中,讀取所有配置的 ID 、 Caption 條目到 Vector 或者 Array 中。 其次,在周遊指定視窗中所有元件時,每發現一個元件,就用其 ID 在已經加載的語言包數組中查找,找到就用配置的值修改元件 Caption 屬性;找不到,就認為是不需要動态配置,不做處理。 配置檔案執行個體: 配置項解釋: Section : [Login Dialog] : 界面 視窗;等号左邊:視窗中需要設定其 Caption 屬性的元件 ID ;等号左邊:視窗中需要設定其 Caption 屬性的元件 Caption 值; [Login Dialog] 1001 = 使用者帳号 1002 = 使用者密碼 1017 = 登   錄 1018 = 退   出 語言包配置資訊加載代碼:   

VC開發多語言界面支援的簡單方法

BOOL CLanguageManager::loadFromFile()

VC開發多語言界面支援的簡單方法
VC開發多語言界面支援的簡單方法

... {

VC開發多語言界面支援的簡單方法

    BOOL bRead=FALSE;

VC開發多語言界面支援的簡單方法

    int i;

VC開發多語言界面支援的簡單方法

    ItemContext temp;

VC開發多語言界面支援的簡單方法

    CStringArray itemBuf,valueBuf;

VC開發多語言界面支援的簡單方法

    bRead = fileManager.GetSectionValues("Main Window",itemBuf,valueBuf);

VC開發多語言界面支援的簡單方法

    if(bRead) 

VC開發多語言界面支援的簡單方法
VC開發多語言界面支援的簡單方法

    ...{

VC開發多語言界面支援的簡單方法

        for(i=0;i<itemBuf.GetSize();i++)

VC開發多語言界面支援的簡單方法
VC開發多語言界面支援的簡單方法

        ...{

VC開發多語言界面支援的簡單方法

            temp.uCtrlID = atoi(itemBuf.GetAt(i));

VC開發多語言界面支援的簡單方法

            temp.strContext = valueBuf.GetAt(i);

VC開發多語言界面支援的簡單方法

            m_vtContexts.push_back(temp);

VC開發多語言界面支援的簡單方法

        }

VC開發多語言界面支援的簡單方法

    }

VC開發多語言界面支援的簡單方法

    itemBuf.RemoveAll();

VC開發多語言界面支援的簡單方法

    valueBuf.RemoveAll();

VC開發多語言界面支援的簡單方法
VC開發多語言界面支援的簡單方法

    bRead = fileManager.GetSectionValues("Login Dialog",itemBuf,valueBuf);

VC開發多語言界面支援的簡單方法

    if(bRead) 

VC開發多語言界面支援的簡單方法
VC開發多語言界面支援的簡單方法

    ...{

VC開發多語言界面支援的簡單方法

        for(i=0;i<itemBuf.GetSize();i++)

VC開發多語言界面支援的簡單方法
VC開發多語言界面支援的簡單方法

        ...{

VC開發多語言界面支援的簡單方法

            temp.uCtrlID = atoi(itemBuf.GetAt(i));

VC開發多語言界面支援的簡單方法

            temp.strContext = valueBuf.GetAt(i);

VC開發多語言界面支援的簡單方法

            m_vtContexts.push_back(temp);

VC開發多語言界面支援的簡單方法

        }

VC開發多語言界面支援的簡單方法

    }

VC開發多語言界面支援的簡單方法

    return bRead;

VC開發多語言界面支援的簡單方法

}   讀取語言包配置資訊:

VC開發多語言界面支援的簡單方法

BOOL CIniFile::GetSectionValues(CString Section, CStringArray  & strItemBuf, CStringArray  & strValueBuf)

VC開發多語言界面支援的簡單方法
VC開發多語言界面支援的簡單方法

... {

VC開發多語言界面支援的簡單方法

    BOOL bRead = FALSE;

VC開發多語言界面支援的簡單方法

    ReadIniFile();//打開檔案

VC開發多語言界面支援的簡單方法
VC開發多語言界面支援的簡單方法

    if(bFileExist == FALSE || FileContainer.GetSize() < 0)

VC開發多語言界面支援的簡單方法

        return bRead;//檔案打開出錯或檔案為空,傳回預設值

VC開發多語言界面支援的簡單方法
VC開發多語言界面支援的簡單方法

    int i = 0;

VC開發多語言界面支援的簡單方法

    int iFileLines = FileContainer.GetSize();

VC開發多語言界面支援的簡單方法

    CString strline,str;

VC開發多語言界面支援的簡單方法
VC開發多語言界面支援的簡單方法

    while(i<iFileLines)

VC開發多語言界面支援的簡單方法
VC開發多語言界面支援的簡單方法

    ...{

VC開發多語言界面支援的簡單方法

        strline = FileContainer.GetAt(i++);

VC開發多語言界面支援的簡單方法
VC開發多語言界面支援的簡單方法

        strline.TrimLeft();

VC開發多語言界面支援的簡單方法

        if(strline.GetLength()<=0)

VC開發多語言界面支援的簡單方法

            continue;    //跳過空行

VC開發多語言界面支援的簡單方法

        if(strline.Left(2)=="//") 

VC開發多語言界面支援的簡單方法

            continue;    //跳過注釋行

VC開發多語言界面支援的簡單方法

        if(strline.GetAt(0)=='[')//查找Section,第一個必須為[

VC開發多語言界面支援的簡單方法
VC開發多語言界面支援的簡單方法

        ...{

VC開發多語言界面支援的簡單方法

            str=strline.Left(strline.Find("]"));//去掉]右邊

VC開發多語言界面支援的簡單方法

            str=str.Right(str.GetLength()-str.Find("[")-1);//去掉[左邊

VC開發多語言界面支援的簡單方法
VC開發多語言界面支援的簡單方法

            str.TrimLeft();

VC開發多語言界面支援的簡單方法

            str.TrimRight();

VC開發多語言界面支援的簡單方法
VC開發多語言界面支援的簡單方法

            if(Section == str)//找到Section

VC開發多語言界面支援的簡單方法
VC開發多語言界面支援的簡單方法

            ...{

VC開發多語言界面支援的簡單方法

                while(i<iFileLines)

VC開發多語言界面支援的簡單方法
VC開發多語言界面支援的簡單方法

                ...{

VC開發多語言界面支援的簡單方法

                    strline = FileContainer.GetAt(i++);

VC開發多語言界面支援的簡單方法

                    strline.TrimLeft();

VC開發多語言界面支援的簡單方法

                    if(strline.GetLength()<=0)

VC開發多語言界面支援的簡單方法

                        continue;    //跳過空行

VC開發多語言界面支援的簡單方法

                    if(strline.GetAt(0)=='[')

VC開發多語言界面支援的簡單方法

                        return bRead;//如果到達下一個[],即找不到,傳回預設值

VC開發多語言界面支援的簡單方法

                    if(strline.Left(2)=="//") 

VC開發多語言界面支援的簡單方法

                        continue;    //跳過注釋行

VC開發多語言界面支援的簡單方法
VC開發多語言界面支援的簡單方法

                    str = strline.Left(strline.Find("="));//去掉=右邊

VC開發多語言界面支援的簡單方法

                    str.TrimLeft();

VC開發多語言界面支援的簡單方法

                    str.TrimRight();

VC開發多語言界面支援的簡單方法

                    //儲存等号左邊項

VC開發多語言界面支援的簡單方法

                    strItemBuf.Add(str);

VC開發多語言界面支援的簡單方法
VC開發多語言界面支援的簡單方法

                    str=strline.Right(strline.GetLength()-strline.Find("=")-1);//去掉=左邊

VC開發多語言界面支援的簡單方法

                    str.TrimLeft();

VC開發多語言界面支援的簡單方法

                    str.TrimRight();

VC開發多語言界面支援的簡單方法

                    //儲存等号右邊項

VC開發多語言界面支援的簡單方法

                    strValueBuf.Add(str);

VC開發多語言界面支援的簡單方法

                    bRead = TRUE;

VC開發多語言界面支援的簡單方法

                }

VC開發多語言界面支援的簡單方法

                //目前Section周遊結束

VC開發多語言界面支援的簡單方法

            }

VC開發多語言界面支援的簡單方法

            //沒有找到Section

VC開發多語言界面支援的簡單方法

        }

VC開發多語言界面支援的簡單方法

        //目前行周遊結束

VC開發多語言界面支援的簡單方法

    }

VC開發多語言界面支援的簡單方法

    return bRead;

VC開發多語言界面支援的簡單方法

}   修改指定元件 Caption 屬性代碼:

VC開發多語言界面支援的簡單方法

BOOL CLanguageManager::setControlCaption(CWnd  *  pCtrl, UINT ctrlID)

VC開發多語言界面支援的簡單方法
VC開發多語言界面支援的簡單方法

... {

VC開發多語言界面支援的簡單方法

    BOOL isOK=FALSE;

VC開發多語言界面支援的簡單方法

    for(int i=0;i<m_vtContexts.size();i++)

VC開發多語言界面支援的簡單方法
VC開發多語言界面支援的簡單方法

    ...{

VC開發多語言界面支援的簡單方法

        isOK = (m_vtContexts[i].uCtrlID==ctrlID);

VC開發多語言界面支援的簡單方法

        if(isOK)

VC開發多語言界面支援的簡單方法
VC開發多語言界面支援的簡單方法

        ...{

VC開發多語言界面支援的簡單方法

            pCtrl->SetWindowText(m_vtContexts[i].strContext);

VC開發多語言界面支援的簡單方法

            break;

VC開發多語言界面支援的簡單方法

        }

VC開發多語言界面支援的簡單方法

    }

VC開發多語言界面支援的簡單方法

    return isOK;

VC開發多語言界面支援的簡單方法

}   周遊設定指定視窗所有元件 Caption 屬性代碼:

VC開發多語言界面支援的簡單方法

void  CLanguageManager::setCaptionForWindow(CWnd  *  pWnd)

VC開發多語言界面支援的簡單方法
VC開發多語言界面支援的簡單方法

... {

VC開發多語言界面支援的簡單方法

    //枚舉對話框中所有元件

VC開發多語言界面支援的簡單方法
VC開發多語言界面支援的簡單方法

    CWnd *pCtrl = pWnd->GetWindow(GW_CHILD);

VC開發多語言界面支援的簡單方法

    while(pCtrl!=NULL)

VC開發多語言界面支援的簡單方法
VC開發多語言界面支援的簡單方法

    ...{

VC開發多語言界面支援的簡單方法

        UINT ctrlID = pCtrl->GetDlgCtrlID();

VC開發多語言界面支援的簡單方法

        setControlCaption(pCtrl,ctrlID);

VC開發多語言界面支援的簡單方法

        pCtrl = pCtrl->GetNextWindow();

VC開發多語言界面支援的簡單方法

    }

VC開發多語言界面支援的簡單方法

}  

繼續閱讀