我没有用c ++编程很长时间,但需要为我的学校制作一个Win32应用程序.老师帮助了我很多信息,但经过几天的尝试,我仍然被卡住了.
错误:
error C2440: '=' : cannot convert from 'const char [11]' to 'LPCWSTR'
error C2664: 'CreateWindowExW' : cannot convert parameter 2 from 'const char [11]' to 'LPCWSTR'
error C2664: 'TextOutW' : cannot convert parameter 4 from 'char *' to 'LPCWSTR'
IntelliSense: argument of type "char *" is incompatible with parameter of type "LPCWSTR"
Run Code Online (Sandbox Code Playgroud)
不知道所有其他的后缀是否正确,但我现在只得到那4个错误
cpp文件:
/* Hoofdstuk 10, User Interface */
#include "Callback_NYCM.h"
// UI
int WINAPI WinMain(HINSTANCE thisInstance,HINSTANCE prevInstance,LPSTR lpCmdLine,int nShowCmd)
{
PAINTSTRUCT ps;
HDC hdc;
MSG msg;
HWND hwnd;
WNDCLASSEX wndclassex; //struct_WNDCLASSEX via windows.h
// toekenning
wndclassex.cbSize = sizeof(WNDCLASSEX);
wndclassex.style = CS_HREDRAW | CS_VREDRAW;
wndclassex.lpfnWndProc = WndProc;
wndclassex.cbClsExtra = 0;
wndclassex.cbWndExtra = 0;
wndclassex.hInstance = thisInstance;
wndclassex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclassex.hCursor = LoadCursor(thisInstance,IDC_ARROW);
wndclassex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wndclassex.lpszMenuName = NULL;
wndclassex.lpszClassName = "WNDCLASSEX";
wndclassex.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
// functie aanroep
RegisterClassEx(&wndclassex);
// IfThen -> CreateWindows
if(!(hwnd = CreateWindowEx(NULL,"WNDCLASSEX","Hoofdstuk 10",WS_OVERLAPPEDWINDOW
| WS_VISIBLE,50,50,650,300,NULL,NULL,thisInstance,NULL)))
{
return 0;
}
// logische structuur
while(GetMessage(&msg, NULL, 0, 0))
{
if(msg.message == WM_QUIT)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int) msg.wParam;
};
Run Code Online (Sandbox Code Playgroud)
头文件:
/*Hoofdstuk 10, Deelnemer.h*/
//Declaratie
class Deelnemer
{
private:
char* nm;
public:
//Constructor
Deelnemer(){
}
//Methoden = prototype
void Deelnemer::Invoeren();
char* Deelnemer::WeergevenNaam();
};
//Implemenmtatie.Invoeren
void Deelnemer::Invoeren()
{
nm = "Roy";
}
//.Weergeven
char* Deelnemer::WeergevenNaam()
{
return nm;
}
Run Code Online (Sandbox Code Playgroud)
callback_NYCM.h:
/*Hoofdstuk 10, Callback_NYCM*/
#include "Windows.h"
#include "Deelnemer.h"
// prototype
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam);
//Implementatie
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam)
{
//Constructie
PAINTSTRUCT ps;
HDC hdc;
MSG msg;
WNDCLASSEX wndclassex;
// HWND hwnd;
Deelnemer deelnemer1;
//UI
switch(message)
{
case WM_PAINT:
{
//Functieaanroep.Initialisatie
deelnemer1.Invoeren();
//.TextOut
TextOut(hdc,50,50,deelnemer1.WeergevenNaam(),
strlen(deelnemer1.WeergevenNaam()));
EndPaint(hwnd,&ps);
return 0;
}
break;
case WM_DESTROY:
{
PostQuitMessage(0);
return 0;
}
break;
default:
{
return DefWindowProc(hwnd,message,wparam,lparam);
}
break;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我认为我的构造函数或类似的东西是错的,我的返回值为char*Deelnemer :: WeergevenNaam()
有人可以解释一下我的代码中有什么问题所以我知道如何让它工作吗?
更新应用程序需要始终使用UNICODE字符串文字,即L"MyString"而不是"MyString".您还需要使用WCHAR/wchar_t代替char
但是我如何使用我的代码执行此操作,有人可以帮忙吗?
这解决了很多错误!
但是我在这部分还有一些错误
Deelnemer deelnemer1;
switch(message)
{
case WM_PAINT:
{
//Functieaanroep.Initialisatie
deelnemer1.Invoeren();
//.TextOut
TextOut(hdc,50,50,deelnemer1.WeergevenNaam(),
strlen(deelnemer1.WeergevenNaam()));
EndPaint(hwnd,&ps);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
所以错误是在线的:deelnemer1.WeergevenNaam()
-TextOutW':无法将参数4从'char*'转换为'LPCWSTR'
-IntelliSense:类型"char*"的参数与"LPCWSTR"类型的参数不兼容
经过一些测试我发现了一个解决方案(就像你们下面说的那样)但是现在我只剩下这个了:
TextOut (hdc,50,50,deelnemer1.WeergevenNaam(), //在deelnemer1.weergevenNaam()上
有错误C2664:'TextOutW':无法从'const char*'转换参数4到'LPCWSTR'
您的代码编写为ANSI编译,但您的解决方案设置包括_UNICODE/ UNICODE.您可以通过更改字符集(在配置属性的常规节点上)从使用Unicode字符集到使用多字节字符集或更新应用程序代码(建议使用后者)来设置解决方案以使用ANSI编码.
更新您的应用程序需要始终使用UNICODE字符串文字,即L"MyString"代替"MyString".您还需要使用WCHAR/ wchar_t代替char(如果适用)并调用Windows API的宽版本.对于许多API调用,存在W最终具有最终版本的广泛版本,例如CreateWindowExW.如果您使用的是标准C++库,您还需要确保使用需要字符编码的UNICODE变体(例如,std::wstring而不是std::string).其他信息可以在Visual C++中的Text和Strings中找到.
关于这里发生了什么的更多背景:Windows API和Microsoft的CRT实现可用于使用ANSI/Multi-Byte字符集或UNICODE字符集编译代码.同时支持字符编码的C/C++预处理器取代了相应的字符类型和API调用,依赖于是否在具体实施方式_UNICODE和UNICODE预处理符号被定义.
例如,呼叫CreateWindowEx被扩展为CreateWindowExA或CreateWindowExW.两种实现都有不同的字符串参数参数类型(char*和wchar_t*分别).要使用ANSI/Multi-Byte编码,呼叫将是CreateWindowExA(NULL,"WNDCLASSEX",...).对于UNICODE,它看起来像CreateWindowExW(NULL,L"WNDCLASSEX",...).
要查看预处理器完成后代码的样子,可以使用/ P或/ E编译器开关(假设您使用的是Microsoft编译器).
注意:不要忘记阅读绝对最低每个软件开发人员,绝对必须知道Unicode和字符集(没有借口!).