从vc到vs,工具越来越强大,方便性不言而喻。但同时新的工具就有很多操作与旧的习惯不一样,刚学visual c++ 时就安装了vs2010,但按照老课本的建立工程方法怎么都不能顺利编译。通过各种查阅资料,终于解决问题了。
在vc6.0里面可以直接在wizard里面建立win 32 application ,只是在最后选上空项目即可。然后添加cpp文件,编辑后直接编译就可以了。
但有一个问题是:同样可以在vc6.0里面编译的源文件,如果在vs2010里面直接编译,呵呵,你会知道什么叫做杯具。无法编译啊无法编译!
在vs2010 里面,你一定会按照vc6.0里那样的建立工程方法,照猫画虎的建立一个win32 项目。如下图:(如果看不到此图,请用IE浏览器。本人测试有效)
然后理所当然的选择教科书上的空项目:
然后添加cpp文件:
然后编辑cpp(测试代码见文章末),完成。
终于建好了,想看看运行结果,兴奋的按了Ctrl + F5,但让你失望的是 : 编译错误。仔细检查代码,和书上完整无误。这下可急了。
你会认为自己用的是vs2010,建立项目的过程和教材上用vc6.0建立的过程完全一样啊,怎么还不能正常编译???(vs2010里面叫win32 项目,vc6.0里面叫win32 application,形似,但不完全相同)
原来错误就发生在vs2010和vc6.0 的默认设置不同。详细如下:
这两个IDE默认的文档编码不同,vs2010默认是UNICODE编码,而vc6.0是MBCS,所以在vs2010里面编译的时候你会发现在字符串赋值的地方无法通过(下面代码中红色部分)。所以最简单的办法就是修改默认的编码方式。方法有二种:
一:把当前项目的项目设置中的编码方式改成MBCS,过程如下:
选择项目--属性:
然后修改MBCS
点击确定,保存即可。然后再运行,你会发现惊喜出现了。哈哈,搞定了。(严重推荐用第一种方法)
二:将char 用TCHAR代替,并用_T()宏把字符串包含进来。
结语:工具虽好,但要会用。否则拿着碧血剑,不开“鞘”怎么用!
附:上文中所提到的代码:
#include <windows.h>
#include <stdio.h>
LRESULT CALLBACK WinSunProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // command line
int nCmdShow // show state
)
{
WNDCLASS wndcls;
wndcls.cbClsExtra=0;
wndcls.cbWndExtra=0;
wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
wndcls.hCursor=LoadCursor(NULL,IDC_CROSS);
wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);
wndcls.hInstance=hInstance;
wndcls.lpfnWndProc=WinSunProc;
wndcls.lpszClassName="BitBible";
wndcls.lpszMenuName=NULL;
wndcls.style=CS_HREDRAW | CS_VREDRAW;
RegisterClass(&wndcls);
HWND hwnd;
hwnd=CreateWindow("BitBible","http://hi.baidu.com/donghao8/home",WS_OVERLAPPEDWINDOW,
0,0,600,400,NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,SW_SHOWNORMAL);
UpdateWindow(hwnd);
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WinSunProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
switch(uMsg)
{
case WM_CHAR:
char szChar[20];
sprintf(szChar,"char code is %d",wParam);
MessageBox(hwnd,szChar,"char",0);
break;
case WM_LBUTTONDOWN:
MessageBox(hwnd,"mouse clicked","message",0);
HDC hdc;
hdc=GetDC(hwnd);
TextOut(hdc,0,50,"BitBible",strlen("BitBible"));
//ReleaseDC(hwnd,hdc);
break;
case WM_PAINT:
HDC hDC;
PAINTSTRUCT ps;
hDC=BeginPaint(hwnd,&ps);
TextOut(hDC,0,0,"http://hi.baidu.com/donghao8/home",strlen("http://hi.baidu.com/donghao8/home"));
EndPaint(hwnd,&ps);
break;
case WM_CLOSE:
if(IDYES==MessageBox(hwnd,"BitBible/n是否真的结束?","message",MB_YESNO))
{
DestroyWindow(hwnd);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}