我正在使用此代码项目:http://www.codeproject.com/Articles/10138/Voice-Recording-Playing-back-using-simple-classes
void CFisterDlg::OnRecord()
{
CString string;
m_RecButton.GetWindowText(string);
if(string == "Record")
{
StartRecordingToFile();
m_RecButton.SetWindowText("Stop");
}
else
{
StopRecordingToFile();
m_RecButton.SetWindowText("Record");
}
}
但是我在很多地方都遇到了这个错误:
error C2664: 'void CWnd::SetWindowTextW(LPCTSTR)' : cannot convert argument 1 from 'const char [5]' to 'LPCTSTR'
我认为这与我使用最新版本的visual studio(2013)有关。
答案 0 :(得分:5)
MSVC2013与之交互的原始字符串有两种。原始char
字符串看起来像"Hello"
。 wchar_t
字符串看起来像L"World"
。
此外,如果您的项目使用wchar_t
或char
字符串,则会设置一个设置。宏TCHAR
扩展为char
或wchar_t
,宏_T("some text")
将扩展为"some text"
或L"some text"
,具体取决于您的项目编译为使用char
或wchar_t
。
几乎每个采用字符串的Windows API都有一个宏包装它,将其映射到char
版本或wchar_t
版本。
所有这一切的目标是使编写单个应用程序成为可能,并使其具有广泛的字符识别能力。
Windows上的约定是窄字符char
接口使用基于代码页的系统,而宽字符wchar_t
接口使用UTF-16字符(OS中的子集UCS-2'在W2K之前,如果我阅读维基百科文章,那么XP中没有系统字体支持UCS-2之外的字符。
所有这一切的结束?您的项目已设置为使用宽字符串。这是一件好事,因为狭窄的字符构建的应用程序无法处理除一个字符代码页以外的任何内容。
因此,您的窄字符常量会产生错误,因为API现在期望广泛的字符常量。
简单的解决方法是将"raw strings"
包裹在_T("raw string")
_T
宏中。在代码中使用char const*
之类的内容时,请使用TCHAR const*
。
包含一个系统,以便对std::string
和std::cout
以及其他基于char
的{{1}}和其他图书馆执行相同的操作,或者在使用那些不与之交互的系统时用户和与Windows交谈时,使用std
终止的接口为A
或char
终止基于W
的字符串的接口函数。
现在很少见到"回去"在Windows上基于wchar_t
的接口,因此一种方法是取消宏并直接与基于char
的接口交互。您的字符串全部变为W
,L"wide character"
内容全部为std
等,您的字符变量全部为std::wstring
。这可能不是最佳实践。
最后请注意,基于wchar_t
和char
的基于简称和广义的界面可以有多个wchar_t
或char
每个"字符" 。当支持的所有窗口都是来自UTF-16的单个wchar_t
元素,并且多个wchar_t
字符相对较少时,对于一个狭窄的窗口来说,这不是真的,所以很多代码都无法处理那种可能性。
答案 1 :(得分:4)
要将const char *
转换为LPCTSTR
类型,请在L
之前添加const char *
,如下所示:
void CFisterDlg::OnRecord()
{
CString string;
m_RecButton.GetWindowText(string);
if(string == "Record")
{
StartRecordingToFile();
m_RecButton.SetWindowText(L"Stop");
}
else
{
StopRecordingToFile();
m_RecButton.SetWindowText(L"Record");
}
}
或者你可以用_T
莫名其妙地把它投射出来,就像这样:
void CFisterDlg::OnRecord()
{
CString string;
m_RecButton.GetWindowText(string);
if(string == "Record")
{
StartRecordingToFile();
m_RecButton.SetWindowText(_T("Stop"));
}
else
{
StopRecordingToFile();
m_RecButton.SetWindowText(_T("Record"));
}
}
_T
宏来自'tchar'库,因此如果您还没有这样做,则需要#include <tchar.h>
。
答案 2 :(得分:2)
SetWindowTextW()
使用字符指向字符串的数据,其中字符串数据由常规字符组成,但您的函数很可能需要 unicode字符串,所以你不能直接输入字符串类型。您需要使用L"thisismystring"
答案 3 :(得分:0)
LPCTSTR
是cstring operator。我建议您在拨打setWindowTExt
setWindowText(_T("Record"))
如果编译器知道函数, _T()
将直接调用隐式强制转换(这里是这种情况)。你可以使用L""
,感谢@Mgetzfor指出它。
答案 4 :(得分:0)
尝试在项目设置中使用多字节字符编码而不是Unicode。 对于VS2013,VS2015,您需要从此链接下载并安装Visual Studio的MBCS库https://www.microsoft.com/en-us/download/confirmation.aspx?id=40770
答案 5 :(得分:-4)
尝试这样的事情:
char ch[5] = "test";
int num = MultiByteToWideChar(0,0,ch,-1,NULL,0);
wchar_t *wide = new wchar_t[num];
MultiByteToWideChar(0,0,ch,-1,wide,num);