在Visual Studio上構(gòu)建C++的GUI框架wxWidgets的開(kāi)發(fā)環(huán)境
本文使用的Unicode+DLL+Debug的方式,因?yàn)椴幌胱詈笊傻膃xe文件太大。
環(huán)境搭建步驟如下:
1、下載wxWidgets包:
登錄wxWidgets的下載頁(yè)面:http://www.wxwidgets.org/downloads
下載最新的Stable Release穩(wěn)定版,我這里用舊的2.8.12版作演示。
2、將wxMSW-2.8.12.zip解壓到D盤根目錄下。
轉(zhuǎn)到D:\wxMSW-2.8.12\build\msw目錄,用VS2005打開(kāi)wx.dsw,會(huì)有提示轉(zhuǎn)換項(xiàng)目:

選擇“全是”。
3、進(jìn)入到VS2005的界面,在下圖所示區(qū)域選擇DLL Unicode Debug:

4、按F7生成解決方案,這個(gè)操作會(huì)在D:\wxMSW-2.8.12\lib下生成一個(gè)“vc_dll”文件夾,里面是我們需要的dll和lib。
不過(guò)第一次執(zhí)行會(huì)提示有一些失敗的。因?yàn)橛幸恍┥身?xiàng)依賴于其他的生成項(xiàng)。此時(shí)繼續(xù)按F7,直到提示有1個(gè)失敗。此時(shí),再按F7也是沒(méi)用的,看看錯(cuò)誤提示:
1>LINK : fatal error LNK1104: 無(wú)法打開(kāi)文件“..\..\lib\vc_dll\wxbase28ud_odbc.lib”
這個(gè)wxbase28ud_odbc.lib在D:\wxMSW-2.8.12\lib\vc_dll下并不存在。此時(shí)可以在上圖中選擇Unicode Debug,之后在左邊選擇odbc,右擊,選擇生成,會(huì)在D:\wxMSW-2.8.12\lib\vc_lib目錄下生成wxbase28ud_odbc.lib,將這個(gè)文件拷到D:\wxMSW-2.8.12\lib\vc_dll目錄下,在上圖中將選項(xiàng)選回DLL Unicode Debug,再按F7,這樣所有的文件都生成了。
這樣,在生成了14個(gè)dll文件和18個(gè)lib文件。
5、在菜單欄依次選擇 工具——選項(xiàng),在打開(kāi)的窗口依次選擇 項(xiàng)目和解決方案——VC++目錄。
5.1 在“包含文件”中添加:
D:\wxMSW-2.8.12\include D:\wxMSW-2.8.12\include\msvc
5.2 在“庫(kù)文件”中添加:
D:\wxMSW-2.8.12\lib\vc_dll D:\wxMSW-2.8.12\lib\vc_dll\mswud
如下圖:

6、關(guān)閉原來(lái)的工程,新建一個(gè)空的Win32項(xiàng)目,名稱為wxTest。注意,要是空的項(xiàng)目。
為這個(gè)項(xiàng)目添加一個(gè)C++文件Test.cpp,內(nèi)容為D:\wxMSW-2.8.12\samples\minimal\minimal.cpp的內(nèi)容。
7、配置項(xiàng)目:
選中這個(gè)項(xiàng)目,在菜單欄依次選擇 項(xiàng)目——wxTest屬性,在打開(kāi)的窗口配置屬性:
7.1 在“配置屬性 —— C/C++ —— 預(yù)處理器”中的“預(yù)處理器定義”添加:
_UNICODE;WXUSINGDLL
7.2 在“配置屬性 —— C/C++ —— 運(yùn)行時(shí)庫(kù)”中的“運(yùn)行時(shí)庫(kù)”選擇:
多線程調(diào)試 DLL (/MDd)
7.3 在“配置屬性 —— 鏈接器 —— 輸入”中的“附加依賴庫(kù)”添加:
wxbase28ud.lib wxbase28ud_net.lib wxbase28ud_odbc.lib wxbase28ud_xml.lib wxexpatd.lib wxjpegd.lib wxmsw28ud_adv.lib wxmsw28ud_aui.lib wxmsw28ud_core.lib wxmsw28ud_html.lib wxmsw28ud_media.lib wxmsw28ud_qa.lib wxmsw28ud_richtext.lib wxmsw28ud_xrc.lib wxpngd.lib wxregexud.lib wxtiffd.lib wxzlibd.lib
這里是一股腦全加上了。
8、生成解決方案,是成功的。按F5運(yùn)行這個(gè)程序,會(huì)提示計(jì)算機(jī)中丟失wxmsw28ud_core_vc_custom.dll,從D:\wxMSW-2.8.12\lib\vc_dll中把這個(gè)文件拷到生成的exe文件所在的目錄下。再次運(yùn)行,會(huì)提示丟失wxbase28ud_vc_custom.dll,再把這個(gè)文件拷到生成的exe文件所在的目錄下。此時(shí)再運(yùn)行就可以正確執(zhí)行了:

關(guān)于wxWidgets控件出現(xiàn)亂碼問(wèn)題的解決
這兩天在用wxWidgets做一個(gè)小程序,突然遇到了一個(gè)控件顯示出現(xiàn)亂碼的問(wèn)題。
首先聲明:我用的編譯器是Visual Studio 2005,wxWidgets版本是2.8.12,下面的解決方法不一定對(duì)所有的平臺(tái)都有效。
我們知道,wxWidgets中控件顯示字符串一般都是用wxString,例如下面的一小段代碼創(chuàng)建并顯示一個(gè)按鈕:
// 創(chuàng)建一個(gè)按鈕,顯示名稱就是“按鈕”
wxButton* oneButton = new wxButton( itemFrame1, ID_BUTTON, wxT("按鈕"), wxDefaultPosition, wxDefaultSize, 0);
// 把這個(gè)按鈕放在一個(gè)BoxSizer中
itemBoxSizer->Add(oneButton, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5);
上面的代碼沒(méi)有錯(cuò)誤,顯示截圖如下:

但是,很多情況下,我們想要顯示的控件的標(biāo)簽是先放在char *中的,我們當(dāng)然要先轉(zhuǎn)換成wxString,轉(zhuǎn)換的方法有很多,比如用wxString::FromUTF8(),或者可以定義一個(gè)wxString對(duì)象,調(diào)用Printf方法。然而,兩種方法都不行。
如下代碼:
char *label = "按鈕";
wxString wxLabel;
wxLabel.Printf(wxT("%s"), label);
wxButton* oneButton = new wxButton( itemFrame1, ID_BUTTON, wxLabel, wxDefaultPosition, wxDefaultSize, 0);
itemBoxSizer->Add(oneButton, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5);
得到的結(jié)果是

而如果使用wxString::FromUTF8(),則控件中根本沒(méi)有顯示的標(biāo)簽。
谷歌了很久都沒(méi)找到解決辦法,后來(lái)突然想到,以前做一個(gè)GTK項(xiàng)目的時(shí)候遇到過(guò)中文出現(xiàn)亂碼的問(wèn)題,當(dāng)時(shí)峰哥給我發(fā)了一個(gè)將字符串轉(zhuǎn)換編碼的函數(shù),當(dāng)然,GTK有自帶的函數(shù)可以進(jìn)行轉(zhuǎn)換,是g_locale_to_utf8。而wxWidgets貌似沒(méi)有這樣的函數(shù)。峰哥給我的函數(shù)正好派上用場(chǎng)。
峰哥給我的函數(shù)是ANSI與UTF8相互轉(zhuǎn)換,為什么有用,是因?yàn)閂S默認(rèn)的編碼是ANSI。我今天在谷歌的時(shí)候,見(jiàn)到有人說(shuō)將源代碼的編碼格式改成UTF8,在VS的 文件——高級(jí)保存選項(xiàng)中,我試過(guò)了,沒(méi)用。但是用了峰哥給我的函數(shù),效果就不一樣了。
峰哥的代碼是:
BOOL ansi_to_utf8(char * lpcszStr, char** lpwszStr)
{
WCHAR* strA;
int i= MultiByteToWideChar(CP_ACP, 0, (char*)lpcszStr, -1, NULL, 0);
strA = (WCHAR *)malloc(sizeof(WCHAR) * i);
MultiByteToWideChar(CP_ACP, 0, (char* )lpcszStr, -1, strA, i*2);
i= WideCharToMultiByte(CP_UTF8, 0, strA, -1, NULL, 0, NULL, NULL);
*lpwszStr = (char *)malloc(i);
WideCharToMultiByte(CP_UTF8, 0, strA, -1, *lpwszStr, i, NULL, NULL);
return TRUE;
}
可以把這段代碼放在程序的某個(gè)頭文件中,作為一個(gè)成員函數(shù)。別忘了包含windows.h頭文件。
再修改上面的第二段代碼如下:
char *label = "按鈕2"; char *label_utf8; this->ansi_to_utf8(label, &label_utf8); wxButton* oneButton = new wxButton( itemFrame1, ID_BUTTON, wxString::FromUTF8(label_utf8), wxDefaultPosition, wxDefaultSize, 0); free(label_utf8); itemBoxSizer->Add(oneButton, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5);
這樣就可以正常顯示了:

- visual studio 2019安裝配置可編寫(xiě)c/c++語(yǔ)言的IDE環(huán)境
- 如何使用visual studio2019創(chuàng)建簡(jiǎn)單的MFC窗口(使用C++)
- Visual Studio Code (vscode) 配置 C / C++ 環(huán)境的流程
- Visual Studio Code配置C、C++環(huán)境并編寫(xiě)運(yùn)行的方法
- Visual Studio(VS2017)配置C/C++ PostgreSQL9.6.3開(kāi)發(fā)環(huán)境
- 使用Visual Studio 2017作為L(zhǎng)inux C++開(kāi)發(fā)工具
- Visual Studio C++指針靠前靠后的問(wèn)題全面解析
相關(guān)文章
Android實(shí)現(xiàn)微信加號(hào)菜單模式
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)微信加號(hào)菜單模式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08
Android 用 camera2 API 自定義相機(jī)
本文主要介紹了Android 用 camera2 API 自定義相機(jī)的相關(guān)知識(shí)。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-04-04
Android入門教程之ListView的應(yīng)用示例
這篇文章主要介紹了Android入門教程之ListView的應(yīng)用,結(jié)合簡(jiǎn)單實(shí)例形式分析了Android中l(wèi)istview的簡(jiǎn)單創(chuàng)建與使用步驟,需要的朋友可以參考下2016-10-10
Android開(kāi)發(fā)基礎(chǔ)使用ProgressBar加載進(jìn)度條示例
這篇文章主要介紹了安卓開(kāi)發(fā)基礎(chǔ)使用ProgressBar加載進(jìn)度條示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
Android中自定義ContentProvider實(shí)例
應(yīng)用A(TestBaidu)調(diào)用另外一個(gè)應(yīng)用(TestContentProvider)即自定義ContentProvider的使用,其它應(yīng)用調(diào)用該ContentProvider,具體如下,感興趣的朋友可以參考下哈2013-06-06
android實(shí)現(xiàn)可上下回彈的scrollview
這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)可上下回彈的scrollview,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
Android實(shí)現(xiàn)圖片設(shè)置圓角形式
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)圖片設(shè)置圓角形式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
深入Android HandlerThread 使用及其源碼完全解析
這篇文章主要介紹了深入Android HandlerThread 使用及其源碼完全解析,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08

