標籤:
轉載自: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> //托換代碼和Unmanaged 程式碼混合編程
// managed.cpp : 定義控制台應用程式的進入點。
#include "stdafx.h"
#using <mscorlib.dll> // 為了使用Console::WriteLine方法
#include <stdio.h> // 為了使用printf
using namespace System;
// 聲明Unmanaged 程式碼
#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 學習筆記一 入門