在Visual Studio上構建C++的GUI架構wxWidgets的開發環境_Android

來源:互聯網
上載者:User

本文使用的Unicode+DLL+Debug的方式,因為不想最後產生的exe檔案太大。

環境搭建步驟如下:

1、下載wxWidgets包:

登入wxWidgets的下載頁面:http://www.wxwidgets.org/downloads
下載最新的Stable Release穩定版,我這裡用舊的2.8.12版作示範。

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

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

選擇“全是”。

3、進入到VS2005的介面,在下圖所示地區選取項目DLL Unicode Debug:

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

不過第一次執行會提示有一些失敗的。因為有一些產生項依賴於其他的產生項。此時繼續按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

如下圖:

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檔案所在的目錄下。此時再運行就可以正確執行了:

關於wxWidgets控制項出現亂碼問題的解決
這兩天在用wxWidgets做一個小程式,突然遇到了一個控制項顯示出現亂碼的問題。

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

我們知道,wxWidgets中控制項顯示字串一般都是用wxString,例如下面的一小段代碼建立並顯示一個按鈕:

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

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

但是,很多情況下,我們想要顯示的控制項的標籤是先放在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);

得到的結果是

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

Google了很久都沒找到解決辦法,後來突然想到,以前做一個GTK項目的時候遇到過中文出現亂碼的問題,當時峰哥給我發了一個將字串轉換編碼的函數,當然,GTK有內建的函數可以進行轉換,是g_locale_to_utf8。而wxWidgets貌似沒有這樣的函數。峰哥給我的函數正好派上用場。

峰哥給我的函數是ANSI與UTF8相互轉換,為什麼有用,是因為VS預設的編碼是ANSI。我今天在Google的時候,見到有人說將原始碼的編碼格式改成UTF8,在VS的 檔案——進階儲存選項中,我試過了,沒用。但是用了峰哥給我的函數,效果就不一樣了。

峰哥的代碼是:

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;}

可以把這段代碼放在程式的某個標頭檔中,作為一個成員函數。別忘了包含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);

這樣就可以正常顯示了:

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.