2012-05-27 74 views
1

可能重複:
Why does my simple C++ GUI application show a message box in Chinese?爲什麼用C消息框中++展示中國信息

我已經在Visual C++如下實施的代碼塊:

int nResult=MessageBox(NULL, 
         (LPCWSTR)"An example of Cancel,Retry,Continue", 
         (LPCWSTR)"Message Box!", 
         MB_ICONWARNING|MB_ABORTRETRYIGNORE); 

不過,無論我嘗試過什麼,它總是會顯示一箇中文消息框!因此,我只想爲我的問題尋求任何解決方案,爲什麼在這裏有中文信息。謝謝!

+1

哦,我的天啊,這又是一個小問題。 :-) – Xearinox

+1

我也有中文!我們爲什麼都是中國人?有沒有這麼多的中國人的名字,任何時候一個字符串指向隨機存儲器的地方,絕對有可能是中國人? – CodyBugstein

回答

10

你忘了在字符串文字前放置'L'。修改如下:

int nResult=MessageBox(NULL, 
        L"An example of Cancel,Retry,Continue", 
        L"Message Box!", 
        MB_ICONWARNING|MB_ABORTRETRYIGNORE); 

在C++ unicode字符串文字前加上L。如果您沒有放置前綴,則轉換爲'unicode字符串常量'將無濟於事,並導致內存位置的錯誤解釋。

+0

你能指點我到哪裏我可以瞭解更多關於這種特定類型的鑄造?據我所知,通常鑄造由'(Type)thingToBeCasted'組成。我不明白我們如何投入「L」以及它的意思。 – CodyBugstein

+0

這不是演員。如果你在你的字符串前加上'(LPCWSTR)',它**是一個強制轉換,但是在字符串之前加上'L'字符,告訴編譯器把這個字符串解釋爲一個Unicode字符串。有關更多信息,請參閱[這裏](http://msdn.microsoft.com/en-us/library/69ze775t.ASPX)。 –

+0

使它成爲寬字符串,你是對的。 – Deduplicator

5

您正在等待將指針從一個類型轉換爲另一個類型,以更改指向的值。這不是C++所做的。他們只是告訴編譯器將指針指向新類型。要指定wide literal,請在報價前使用L(如果編譯器支持它們,則使用new string literals)。擺脫演員陣容,這只是掩蓋了錯誤。

4

由於大衛說你已經鑄造了一個ASCII字符串到一個UNICODE字符串。改用_TEXT(「你的字符串」)宏。

你不能將ASCII字節解釋爲UNICODE字符串,否則會發生不好的事情。

編輯:另外如果你想要ASCII字符串,你可以明確地調用MessageBoxA()或者在項目設置中改變多字節字符設置。

+1

這是正確的方法。在字符串文字周圍使用_T()或_TEXT(),或者使用MessageBoxA()或MessageBoxW(),它們不會改變UNICODE宏是否在編譯時定義。微軟應該永遠不會推出那個愚蠢的宏! –