2014-02-18 69 views
0

我正在構建一個使用Visual Studio 2013上的Win32應用程序。從我已閱讀的教程中,我知道下面的代碼是正確的,但我不知道在哪裏更改參數類型閱讀以下內容:Win32應用程序編程C++,參數類型錯誤LPCWSTR

case WM_CREATE: 
{ 
    hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "Edit", "", 
     WS_CHILD | WS_VISIBLE | ES_MULTILINE | ES_AUTOHSCROLL | 
     ES_AUTOVSCROLL, 50, 100, 300, 300, hWnd, (HMENU)IDC_EDIT_BOX, 
     NULL, NULL); 

編譯亮點「編輯」,並給了我這個錯誤:

Error 1 error C2664: 'HWND CreateWindowExW(DWORD,LPCWSTR,LPCWSTR,DWORD,int,int,int,int,HWND,HMENU,HINSTANCE,LPVOID)' : cannot convert argument 2 from 'const char [5]' to 'LPCWSTR'

+0

你有沒有試過在參數2中的「編輯」? – Sai

+0

和參數3中的L「」。 – WhozCraig

回答

6

您與定義UNICODE編譯。這意味着CreateWindowEx是寬字符版本CreateWindowExW的別名。或者:

  1. 供應寬字符文本,或
  2. 呼叫CreateWindowExA,或
  3. 編譯ANSI。

個人而言,我會建議選項1.您的代碼將變爲:

CreateWindowEx(WS_EX_CLIENTEDGE, L"Edit", L"", 
    WS_CHILD | WS_VISIBLE | ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL, 
    50, 100, 300, 300, hWnd, (HMENU)IDC_EDIT_BOX, NULL, NULL); 

L前綴爲您的字符串文字是用來指定寬字符文字。

+0

好的是的,這讓編譯器不抱怨謝謝! –

+0

@UysofSpades你需要更多的幫助嗎?或者這個問題回答了嗎? –

+0

如果您要硬編碼Unicode文本,則需要調用'CreateWindowExW()'而不是'CreateWindowEx()'。否則,如果繼續調用'CreateWindowEx()',那麼在傳遞文字時需要使用'TEXT()'宏。 –

0

錯誤消息抱怨CreateWindowExW(),但您的代碼正在調用CreateWindowEx()。這意味着您的項目正在編制UNICODE定義。在這種情況下,CreateWindowEx()映射到CreateWindowExW(),該數據期望寬(wchar_t*)數據,但是您傳遞的數據較窄(char*),因此錯誤。

您需要:

  1. 呼叫CreateWindowExW()直接,並與L前綴文字,使他們廣泛而不是狹隘:

    hEdit = CreateWindowExW(WS_EX_CLIENTEDGE, L"Edit", L"", ...); 
    
  2. 繼續調用CreateWindowEx()但包裝的文字與TEXT()宏,因此根據是否定義UNICODE,它會使它們變窄或變寬:

    hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("Edit"), TEXT(""), ...); 
    
0

首先,你需要決定你想關於字符集要創建什麼類型的項目。您有項目類型使用正(窄)字符只(char

  • 項目

    1. 項目使用寬字符只(wchar_t
    2. 「變壓器」項目,可以很容易地至少四個選項編譯爲1型或2型由在項目的簡單改變設置
    3. 項目自由地混合窄的和寬的字符

    這是你必須先做出的決定。在做出決定之前繼續進行是沒有意義的。現在

    ,這取決於你所做的選擇,你應該進行如下操作

    1. 定期char項目

      • 轉到項目設置,並設置「字符集」到「使用多字節字符集「
      • 在您的代碼中使用常規(窄)字符串和字符文字:"Edit",'A'
      • 使用正charchar [N]char *std::string類型與字符和字符串
      • 工作
      • 使用窄版本的標準庫函數:printfstrcpy
      • 使用「常規」的名字來調用Windows API函數:CreateWindowEx,或者他們的名字狹窄:CreateWindowExA(無論你更喜歡)
    2. wchar_t項目

      • 轉到項目設置,並設置「字符集」,以「使用Unicode字符集」
      • 在代碼中明確地使用寬字符串和字符:L"Edit"L'A'
      • 使用寬wchar_twchar_t [N]wchar_t *std::wstring類型與字符和字符串工作
      • 使用標準庫函數的寬版本:wprintfwcscpy
      • 使用「常規」的名字來調用Windows API函數:CreateWindowEx,或它們的通用名稱:CreateWindowExW(無論你更喜歡)
    3. 「變壓器」項目

      • 包括<tchar.h>到每一個翻譯單元
      • 在代碼中始終明確使用宏_T與字符串和字符: _T("Edit")_T('A')
      • 使用TCHARTCHAR [N]TCHAR *std::basic_string<TCHAR>類型的字符和字符串
      • 使用「變壓器」版本的標準庫函數的工作:_tprintf_tcscpy
      • 使用「正常」的名稱來調用Windows API函數: CreateWindowEx  
         
        有了這樣的項目,如果你做的一切正確,你將能夠1型和2型之間自動切換,通過簡單地改變「字符集」設置在項目設置中。
    4. 混合和匹配項目

        任何類型的角色,你在每一個具體情境喜歡(窄或寬),但要記住調用標準庫和Windows API函數的正確版本
      • 使用爲每個字符類型。在某些情況下,當狹義和廣泛的上下文相遇時,您將不得不在窄字符類型和寬字符類型之間進行轉換。

    當然,如果你開始的1型或2型的項目,您可以隨時開始混合字符類型將其分爲4個類型的項目。但是如果你需要一個3型項目,從一開始就堅持它的原則是一個好主意(以後轉換到3型是一個非常費力的過程)。


    您在項目中試圖做什麼並不明顯。但一個瘋狂的猜測是,你正試圖建立一個類型1的項目。在這種情況下,您需要解決的問題是進入項目設置並將「字符集」設置爲「使用多字節字符集」。