VC2008 express的一个问题。。。。

序员 2011-02-04 05:43:20
以前用VC6或MinGW写个最简单的win32都是这样,从来没有问题。。。

#include <windows.h>
char class_name[]="my_class";
char window_title[]="GDI_based_application";

//windows procedure
LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
static PAINTSTRUCT ps;
switch(msg)
{
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_CREATE:
PlaySound("file.wav",NULL,SND_FILENAME|SND_ASYNC);
break;
case WM_PAINT:
BeginPaint(hwnd,&ps);
//draw here
EndPaint(hwnd,&ps);
break;
default:
return DefWindowProc(hwnd,msg,wParam,lParam);


}
return 0;
}

//Program Entry Point
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE prev,LPSTR lpCmdLine,int nCmdShow)
{

HWND hwnd;
MSG msg;
WNDCLASSEX wc={
sizeof(WNDCLASSEX),
0,
WndProc,
0,
0,
hInstance,
LoadIcon(NULL,IDI_APPLICATION),
LoadCursor(NULL,IDC_ARROW),
(HBRUSH)(COLOR_WINDOW+1),
NULL,
class_name,
LoadIcon(NULL,IDI_APPLICATION)
};
RegisterClassEx(&wc);
hwnd= CreateWindowEx(
WS_EX_CLIENTEDGE,
class_name,
window_title,
WS_OVERLAPPED|WS_VISIBLE|WS_CAPTION|WS_SYSMENU,
CW_USEDEFAULT,CW_USEDEFAULT,640,480,
NULL,NULL,hInstance,NULL
);
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);

while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}


return msg.wParam;
}


用vc2008 ,错误如下

error C2664: 'PlaySoundW' : cannot convert parameter 1 from 'const char [9]' to 'LPCWSTR'
error C2440: 'initializing' : cannot convert from 'char [9]' to 'LPCWSTR'
CreateWindowExW' : cannot convert parameter 2 from 'char [9]' to 'LPCWSTR'



我又编译一些他人的DEMO,结果也是这样。。。

在class_name, window_title "file.wav" \之前加(LPCWSTR)
编译是可以,只是标题栏成了乱码,wav也打不开。。
请教解决方法。。。

...全文
172 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
序员 2011-02-12
  • 打赏
  • 举报
回复
#include <windows.h>

wchar_t class_name[]=L"my_class";
wchar_t window_title[]=L"GDI_based_application";

//windows procedure
LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
static PAINTSTRUCT ps;
switch(msg)
{
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_CREATE:
PlaySound(L"file.wav",NULL,SND_FILENAME|SND_ASYNC);
break;
case WM_PAINT:
BeginPaint(hwnd,&ps);
//draw here
EndPaint(hwnd,&ps);
break;
default:
return DefWindowProc(hwnd,msg,wParam,lParam);


}
return 0;
}

//Program Entry Point
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE prev,LPSTR lpCmdLine,int nCmdShow)
{

HWND hwnd;
MSG msg;
WNDCLASSEX wc={
sizeof(WNDCLASSEX),
0,
WndProc,
0,
0,
hInstance,
LoadIcon(NULL,IDI_APPLICATION),
LoadCursor(NULL,IDC_ARROW),
(HBRUSH)(COLOR_WINDOW+1),
NULL,
class_name,
LoadIcon(NULL,IDI_APPLICATION)
};
RegisterClassEx(&wc);
hwnd= CreateWindowEx(
WS_EX_CLIENTEDGE,
class_name,
window_title,
WS_OVERLAPPED|WS_VISIBLE|WS_CAPTION|WS_SYSMENU,
CW_USEDEFAULT,CW_USEDEFAULT,640,480,
NULL,NULL,hInstance,NULL
);
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);

while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}


return msg.wParam;
}
序员 2011-02-12
  • 打赏
  • 举报
回复
what the ..... are you talking about?
昵称很不好取 2011-02-04
  • 打赏
  • 举报
回复
印象express版本开发图形界面需要下载一个补丁
老邓 2011-02-04
  • 打赏
  • 举报
回复
VS2005/2008/2010在创建工程时,默认使用的是UNICODE工程。
不过,在创建工程之后,可以修改配置,让工程改用ANSI字符集,以VS2010为例,方法如下:
项目—右键—属性—C/C++—Language—WChar_t—No,如图所示:


当然,这种将UNICODE字符集改用ANSI字符集的方法,是不被推荐的!
因为Win2K以上系统,内核直接支持的就是Uniocde版本的API,UNICODE工程具有更高的执行效率!而且还可以很容易地在不同语言之间进行数据交换,进而多语言支持。

推荐:用宏实现对ANSI和Unicode通用的编程

如果我们想要我们的程序有两个版本:ANSI版本和Unicode版本。当然,编写两套代码分别实现ANSI版本和Unicode版本完全是行得通的。但是,针对ANSI字符和Unicode字符维护两套代码是非常麻烦的事情。为了减轻编程的负担,C++定义了一系列的宏,帮助您实现对ANSI和 Unicode的通用编程。C++宏实现ANSI和Unicode的通用编程的本质是根据”_UNICODE”(注意,有下划线)定义与否,这些宏展开为ANSI或Unicode字符(字符串)。

如下是tchar.h头文件中部分代码摘抄:

#ifdef _UNICODE
typedef wchar_t TCHAR;
#define __T(x) L##x
#define _T(x) __T(x)
#else
#define __T(x) x
typedef char TCHAR;
#endif

可见,这些宏根据“_UNICODE” 定义与否,分别展开为ANSI或Unicode字符。

C++为字符串函数也定义了一系列宏,同样,我们只例举几个常用的宏:

宏 未定义_UNICODE(ANSI字符) 定义了_UNICODE(Unicode字符)
_tcschr strchr wcschr
_tcscmp strcmp wcscmp
_tcslen strlen wcslen


编码时,在涉及ANSI与UNICODE字符集区别的函数调用时,一律用宏来替代。
这样就可以实现一套代码,根据_UNICODE是否定义,来决定编译成ANSI版本,还是UNICODE版本。

这在WinAPI中的应用更频繁,例如代码:

#include <windows.h>

int main()
{
MessageBox(0, "test", "title", 0);
return 0;
}

中的MessageBox,很多人会认为MessageBox是一个API,其实它是一个宏:

WINUSERAPI
int
WINAPI
MessageBoxA(
__in_opt HWND hWnd,
__in_opt LPCSTR lpText,
__in_opt LPCSTR lpCaption,
__in UINT uType);
WINUSERAPI
int
WINAPI
MessageBoxW(
__in_opt HWND hWnd,
__in_opt LPCWSTR lpText,
__in_opt LPCWSTR lpCaption,
__in UINT uType);
#ifdef UNICODE
#define MessageBox MessageBoxW
#else
#define MessageBox MessageBoxA
#endif // !UNICODE

可以看到,对Windows API来讲,与C/C++库函数中对ANSI/UNICODE的区分不一样的地方是:它要用一个叫做:UNICODE(注意前面少了一个下划线)的宏来决定是使用ANSI版本,还是UNICODE版本。
而且,很通用的,ANSI版本的最后一个字符是A,而UNICODE版本的最后一个字符是W。
zhangsongcui 2011-02-04
  • 打赏
  • 举报
回复
编译多字节字符集程序(MBCS)
或者在所有字符串前加_T,如_T("file.wav"),也可以直接加L
老邓 2011-02-04
  • 打赏
  • 举报
回复
默认是UNICODE编码。
改:
char class_name[]=_T("my_class");
char window_title[]=_T("GDI_based_application");

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧