国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

在Visual Studio上構建C++的GUI框架wxWidgets的開發(fā)環(huán)境

2019-12-12 06:32:04
字體:
來源:轉載
供稿:網友

本文使用的Unicode+DLL+Debug的方式,因為不想最后生成的exe文件太大。

環(huán)境搭建步驟如下:

1、下載wxWidgets包:

登錄wxWidgets的下載頁面:http://www.wxwidgets.org/downloads
下載最新的Stable Release穩(wěn)定版,我這里用舊的2.8.12版作演示。

2、將wxMSW-2.8.12.zip解壓到D盤根目錄下。

轉到D:/wxMSW-2.8.12/build/msw目錄,用VS2005打開wx.dsw,會有提示轉換項目:

2016422143616269.png (436×240)

選擇“全是”。

3、進入到VS2005的界面,在下圖所示區(qū)域選擇DLL Unicode Debug:

2016422143635372.png (465×241)

4、按F7生成解決方案,這個操作會在D:/wxMSW-2.8.12/lib下生成一個“vc_dll”文件夾,里面是我們需要的dll和lib。

不過第一次執(zhí)行會提示有一些失敗的。因為有一些生成項依賴于其他的生成項。此時繼續(xù)按F7,直到提示有1個失敗。此時,再按F7也是沒用的,看看錯誤提示:

1>LINK : fatal error LNK1104: 無法打開文件“../../lib/vc_dll/wxbase28ud_odbc.lib”

這個wxbase28ud_odbc.lib在D:/wxMSW-2.8.12/lib/vc_dll下并不存在。此時可以在上圖中選擇Unicode Debug,之后在左邊選擇odbc,右擊,選擇生成,會在D:/wxMSW-2.8.12/lib/vc_lib目錄下生成wxbase28ud_odbc.lib,將這個文件拷到D:/wxMSW-2.8.12/lib/vc_dll目錄下,在上圖中將選項選回DLL Unicode Debug,再按F7,這樣所有的文件都生成了。

這樣,在生成了14個dll文件和18個lib文件。

5、在菜單欄依次選擇 工具――選項,在打開的窗口依次選擇 項目和解決方案――VC++目錄。

5.1 在“包含文件”中添加:

D:/wxMSW-2.8.12/includeD:/wxMSW-2.8.12/include/msvc

5.2 在“庫文件”中添加:

D:/wxMSW-2.8.12/lib/vc_dllD:/wxMSW-2.8.12/lib/vc_dll/mswud

如下圖:

2016422143719550.png (757×493)

6、關閉原來的工程,新建一個空的Win32項目,名稱為wxTest。注意,要是空的項目。

為這個項目添加一個C++文件Test.cpp,內容為D:/wxMSW-2.8.12/samples/minimal/minimal.cpp的內容。

7、配置項目:

選中這個項目,在菜單欄依次選擇 項目――wxTest屬性,在打開的窗口配置屬性:

7.1 在“配置屬性 ―― C/C++ ―― 預處理器”中的“預處理器定義”添加:

_UNICODE;WXUSINGDLL

7.2 在“配置屬性 ―― C/C++ ―― 運行時庫”中的“運行時庫”選擇:

多線程調試 DLL (/MDd)

7.3 在“配置屬性 ―― 鏈接器 ―― 輸入”中的“附加依賴庫”添加:

wxbase28ud.libwxbase28ud_net.libwxbase28ud_odbc.libwxbase28ud_xml.libwxexpatd.libwxjpegd.libwxmsw28ud_adv.libwxmsw28ud_aui.libwxmsw28ud_core.libwxmsw28ud_html.libwxmsw28ud_media.libwxmsw28ud_qa.libwxmsw28ud_richtext.libwxmsw28ud_xrc.libwxpngd.libwxregexud.libwxtiffd.libwxzlibd.lib

這里是一股腦全加上了。

8、生成解決方案,是成功的。按F5運行這個程序,會提示計算機中丟失wxmsw28ud_core_vc_custom.dll,從D:/wxMSW-2.8.12/lib/vc_dll中把這個文件拷到生成的exe文件所在的目錄下。再次運行,會提示丟失wxbase28ud_vc_custom.dll,再把這個文件拷到生成的exe文件所在的目錄下。此時再運行就可以正確執(zhí)行了:

2016422143924026.png (476×270)

關于wxWidgets控件出現(xiàn)亂碼問題的解決
這兩天在用wxWidgets做一個小程序,突然遇到了一個控件顯示出現(xiàn)亂碼的問題。

首先聲明:我用的編譯器是Visual Studio 2005,wxWidgets版本是2.8.12,下面的解決方法不一定對所有的平臺都有效。

我們知道,wxWidgets中控件顯示字符串一般都是用wxString,例如下面的一小段代碼創(chuàng)建并顯示一個按鈕:

// 創(chuàng)建一個按鈕,顯示名稱就是“按鈕”wxButton* oneButton = new wxButton( itemFrame1, ID_BUTTON, wxT("按鈕"), wxDefaultPosition, wxDefaultSize, 0);// 把這個按鈕放在一個BoxSizer中itemBoxSizer->Add(oneButton, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5);

上面的代碼沒有錯誤,顯示截圖如下:

2016422143955526.png (200×150)

但是,很多情況下,我們想要顯示的控件的標簽是先放在char *中的,我們當然要先轉換成wxString,轉換的方法有很多,比如用wxString::FromUTF8(),或者可以定義一個wxString對象,調用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);

得到的結果是

2016422144022865.png (200×150)

而如果使用wxString::FromUTF8(),則控件中根本沒有顯示的標簽。

谷歌了很久都沒找到解決辦法,后來突然想到,以前做一個GTK項目的時候遇到過中文出現(xiàn)亂碼的問題,當時峰哥給我發(fā)了一個將字符串轉換編碼的函數(shù),當然,GTK有自帶的函數(shù)可以進行轉換,是g_locale_to_utf8。而wxWidgets貌似沒有這樣的函數(shù)。峰哥給我的函數(shù)正好派上用場。

峰哥給我的函數(shù)是ANSI與UTF8相互轉換,為什么有用,是因為VS默認的編碼是ANSI。我今天在谷歌的時候,見到有人說將源代碼的編碼格式改成UTF8,在VS的 文件――高級保存選項中,我試過了,沒用。但是用了峰哥給我的函數(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;}

可以把這段代碼放在程序的某個頭文件中,作為一個成員函數(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);

這樣就可以正常顯示了:

2016422144053513.png (200×150)

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 洛隆县| 武平县| 昌宁县| 东丽区| 广州市| 克东县| 贵南县| 舟曲县| 绥德县| 开平市| 宿松县| 安义县| 紫金县| 岗巴县| 台安县| 山东| 云龙县| 涪陵区| 信阳市| 宝应县| 隆化县| 永胜县| 新疆| 大丰市| 清新县| 岗巴县| 宁夏| 仙游县| 中方县| 康马县| 霍州市| 塘沽区| 古丈县| 滦南县| 盘山县| 龙里县| 喀喇| 沈阳市| 柘荣县| 宜兴市| 普陀区|