码迷,mamicode.com
首页 > 其他好文 > 详细

Visual Studio 2005 学习笔记一 入门

时间:2015-10-27 23:57:02      阅读:426      评论:0      收藏:0      [点我收藏+]

标签:

转载自: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

解决方法:项目属性—〉配置属性—〉常规—〉字符集—〉多字节字符集

Visual Studio 2005 学习笔记一 入门

标签:

原文地址:http://www.cnblogs.com/killer-xc/p/4915882.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!