2014-02-18 53 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的项目。在这种情况下,您需要解决的问题是进入项目设置并将“字符集”设置为“使用多字节字符集”。