转载自:http://blog.163.com/zm_shichaoren/blog/static/6880234120087211452776/
Visual studio 2005入门记
终于卸掉了Visual C++6.0,换上了全新的Visual C++2005。尽管是简体中文版的,但是功能强大的Visual studio 2005 IDE庞大的开发环境和N多的配置设置,学习起来还不是很简单。C++/CLI通过对ISO C++ 标准的纯粹扩展和新语法,不像传统的MS-DOS 控制台程序,所以对于新手,首先应弄明白怎样在Visual studio 2005开发环境下编译常规控制台应用程序及Windows应用程序。下面是本人的入门手记:
1) win32控制台应用程序
文件—〉新建—〉项目à Visual C++——〉win32——〉win32控制台应用程序—〉控制台应用程序—〉预编译头—〉完成—〉新建win32.cpp.
<1>//Basic IOProgram
// winconsole.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include <iostream>
using std::cin;
using std::cout;
int _tmain(int argc, _TCHAR* argv[])
{
cout<<"Hello World.\n";
getchar();
return 0;
}
Ctrl+F7编译,Ctrl+F5运行。
<2> //托换代码和非托管代码混合编程
// managed.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#using <mscorlib.dll> // 为了使用Console::WriteLine方法
#include <stdio.h> // 为了使用printf
using namespace System;
// 声明非托管代码
#pragma unmanaged
void print(char *msg)
{
printf("%s\n", msg);
}
// 切换回托换代码
#pragma managed
int _tmain(int argc, _TCHAR* argv[])
{
// 调用托管的方法输出到控制台
Console::WriteLine(L"Hello world from managed method");
// 使用标准输出
print("hello world from unmanaged method");
getchar();
return 0;
}
注意: 项目属性—〉配置属性—〉常规—〉公共语言运行库支持—〉公共语言运行库支持(/clr)
我们观察“配置属性—〉常规——〉多字节字符集/Unicode字符集”,这一选项默认为“Unicode字符集”。在vs2005以前版本的vs默认使用多字节字符集,而vs2005默认使用unicode字符集,这会使一些代码不能编译通过。这里我们要弄清楚从main到_tmain和从char*到_TCHAR*的问题。
从Visual Studio 7开始,Microsoft引入了所谓的一般文本例程映射。TCHAR.H中定义的是映射到多字节字符集 (MBCS)、单字节字符集 (SBCS)和Unicode模型的宏或内联函数。这些映射处理那些表示为单字节ANSI ASCII或者双字节Unicode编码的字符数据。
如果正在遵从Unicode算法,则要确定把所有的main()函数改为_tmain(),并把字符指针从char*改为_TCHAR*。关于Windows编码问题将会经常遇到,大家可以网上查阅相关资料。
2) CLR控制台应用程序
文件—〉新建—〉项目à Visual C++——〉CLR—〉CLR控制台应用程序—〉打开左侧“解决方案资源管理器”中的源文件—〉右击—〉添加新项—〉建立.cpp。
注意: 项目属性—〉配置属性—〉常规—〉公共语言运行库支持—〉公共语言运行库支持(/clr)
// clrconsole.cpp: 主项目文件。
#include "stdafx.h"
using namespace System;
int main(array<System::String ^> ^args)
{
Console::WriteLine(L"Hello World from CLR console application.");
return 0;
}
3) MFC编写windows控制台应用程序
文件—〉新建—〉项目à Visual C++——〉win32——〉win32控制台应用程序—〉控制台应用程序—〉空项目
#include <afx.h> //必需
#include <afxwin.h> // 必需
#include <iostream>
using std::cout;
using std::endl;
CWinApp theApp; //创建应用程序实例
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) //入口函数
{
int nRetCode = 0;
if (!AfxWinInit(::GetModuleHandle(NULL),
NULL,
::GetCommandLine(),
0) //由于没有调用MFC提供的WinMain函数,所以在此AfxWinInit进行初始化
)
{
nRetCode = 1;
}
else
{
CString strHello("Hello World from MFC winconsole platform"); //MFC类CString定义一个字符串对象
AfxMessageBox(strHello);
char *strHelloT = "Hello World from win32 console platform";
cout << strHelloT << endl;
}
getchar();
return nRetCode;
}
fatal error C1189: #error : Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD[d]
解决方法:项目属性—〉配置属性—〉常规—〉MFC的使用—〉在共享DLL中使用MFC
或在静态中使用MFC。
4)利用vc++2005 进行传统SDK编程;
文件—〉新建—〉项目à Visual C++——〉win32——〉win32应用程序—〉空项目—〉完成—〉新建win32.cpp.
#include<windows.h>
//消息处理函数,Windows系统规定每个消息处理函数的定义形式都相同
LRESULT CALLBACK WndProc(
HWND hWnd, //窗口句柄
UINT nMessage, //所发出的消息
WPARAM wParam, //参数1
LPARAM lParam //参数2
)
{
switch(nMessage)
{
//响应WM_LBUTTONDOWN消息
case WM_LBUTTONDOWN:
MessageBox(hWnd,L"收到WM_LBUTTONDOWN消息!",L"通知",MB_OK);
break;
//响应WM_RBUTTONDOWN消息
case WM_RBUTTONDOWN:
MessageBox(hWnd,L"收到WM_RBUTTONDOWN消息!",L"通知",MB_OK);
break;
//响应WM_CREATE消息
case WM_CREATE:
MessageBox(hWnd,L"收到WM_CREATE消息!",L"通知",MB_OK);
break;
//响应WM_DESTROY消息
case WM_DESTROY:
MessageBox(hWnd,L"收到WM_DESTROY消息!",L"通知",MB_OK);
PostQuitMessage(0);
break;
//必须调用函数DefWindowProc(),这是Windows系统多规定的
default:
return DefWindowProc(hWnd,nMessage,wParam,lParam);
}
return FALSE;
}
//应用程序入口函数(此程序第一个被执行)
int WINAPI WinMain(
HINSTANCE hInstance, //程序实例句柄
HINSTANCE hPrevInstance,//为保持与Win16兼容的句柄
LPSTR lpCmdLine,// 命令行参数
int nCmdShow //初始化窗口显示方式
)
{
WNDCLASS oWnd; //窗口类,可为WNDCLASS
MSG msgTmp; //Windows 消息
HWND hWnd; //窗口句柄
oWnd.style=CS_HREDRAW|CS_VREDRAW; //窗口类型
oWnd.lpfnWndProc=(WNDPROC)WndProc; //窗口处理函数为WndProc()
oWnd.cbClsExtra=NULL; //窗口类无扩展
oWnd.cbWndExtra=NULL; //窗口实例无扩展
oWnd.hInstance=hInstance; //当前实例句柄
oWnd.hIcon=LoadIcon(NULL,IDI_APPLICATION); //窗口最小化图标,为默认图标
oWnd.hCursor=LoadCursor(NULL,IDC_ARROW); //用箭头作为鼠标图标
oWnd.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);//以白色作为窗口颜色
oWnd.lpszMenuName=NULL; //窗口无菜单
oWnd.lpszClassName=L"第一个Windows程序"; //窗口所属类名
//注册窗口类
if(!RegisterClass(&oWnd))
{
MessageBeep(0); //如注册失败则发出警告
return FALSE;
}
//创建窗口
hWnd=CreateWindow(
L"第一个Windows程序", //注册的窗口类名
L"第一个vWindows程序", //窗口标题名
WS_OVERLAPPEDWINDOW, //窗口的风格
CW_USEDEFAULT, //显示窗口的左上角的X坐标,取默认值
CW_USEDEFAULT, //显示窗口的左上角的Y坐标,取默认值
CW_USEDEFAULT, //显示窗口的右下角的X坐标,取默认值
CW_USEDEFAULT, //显示窗口的右下角的Y坐标,取默认值
NULL, //此窗口无父窗口
NULL, //菜单句柄(此处设为没有菜单句柄)
hInstance, //程序实力句柄
NULL //指向一个传递给窗口的指针型参数,此处设置为空
);
if(!hWnd)
return FALSE; //创建窗口失败,返回FALSE
ShowWindow(hWnd,nCmdShow); //显示窗口
UpdateWindow(hWnd); //更新窗口
while(GetMessage(&msgTmp,NULL,0,0))
{
TranslateMessage(&msgTmp); //翻译消息
DispatchMessage(&msgTmp); //将消息传递给处理函数
}
return msgTmp.wParam; //返回消息的附加参数
}
编译出错:使用VC2005 Express版时找不到msvcr80d.dll文件
解决方法:在"属性->配置属性->清单工具->常规"下有一个"使用FAT32解决办法“,把它选成“是”,再重新生成解决方案(重新编译)!(注意:一定要先配置这个选项,然后再编译工程,要不然还是不好用)
5)利用MFC类库开发Windows 应用程序
文件—〉新建—〉项目à Visual C++——〉win32——〉win32项目—〉win32应用程序—〉空项目—〉添加源文件
#include <afxwin.h> //MFC头文件
class CHelloApp:public CWinApp //建立应用程序类的实例
{
public:
virtual BOOL InitInstance();
};
CHelloApp theApp;
class CMainFrame:public CFrameWnd //声明主窗口类
{
public:
CMainFrame()
{
Create(NULL,"I love U",WS_OVERLAPPEDWINDOW,CRect(0,0,400,300));
}
protected:
afx_msg void OnLButtonDown(UINT nFlags,CPoint point);
afx_msg void OnRButtonDown(UINT nFlags,CPoint point);
DECLARE_MESSAGE_MAP()
};
//消息映射入口
BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)
ON_WM_LBUTTONDOWN() //单击鼠标左键的映射宏
ON_WM_RBUTTONDOWN()
END_MESSAGE_MAP()
//定义消息映射函数
void CMainFrame::OnLButtonDown(UINT nFlags,CPoint point)
{
MessageBox("万古长空","hello");
CFrameWnd::OnLButtonDown(nFlags,point);
}
void CMainFrame::OnRButtonDown(UINT nFlags,CPoint point)
{
MessageBox("一朝风月","hello");
CFrameWnd::OnRButtonDown(nFlags,point);
}
//每当应用程序执行时都要调用的初始化函数
BOOL CHelloApp::InitInstance()
{
m_pMainWnd=new CMainFrame();
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return TRUE;
}
注意1:项目属性—〉配置属性—〉常规—〉MFC的使用—〉在共享DLL中使用MFC
或在静态中使用MFC。
编译错误:error C2664: ‘CFrameWnd::Create‘ : cannot convert parameter 2 from ‘const char [9]‘ to ‘LPCTSTR‘
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
解决方法:项目属性—〉配置属性—〉常规—〉字符集—〉多字节字符集