计算机软件技术专业
《VC++专业项目设计》课程设计报告
——三维环境的漫游程序设计
——基于WinSock的信息传输程序的设计
设计名称:VC++专业项目设计课程实习 班 级:软件09-1 姓 名:杨超群 学 号:0930183137
设计时间:2011年6月13日至2011年7月1日 指导教师:李昌领
1
2
一、课程实习准备工作
1、熟悉课程设计任务,明确设计内容。根据设计任务书给出的课题要求,理清思路,明确设计内容。
2、根据课程设计内容,查找有关编程资料。
2、根据设计内容的编程特点,准备实验环境和开发工具、文档书写工具。
二、实习任务、目的
综合利用VC++有关Windows编程的知识与技术实现对3D虚拟场景的建模、导入、显示与漫游。深入socket通信编程,完成基本的文本、图像信息的传输,模拟基本QQ会话功能。初步掌握利用VC++进行较大规模、功能比较复杂的任务的设计方法与技巧。
二、实习过程、内容
课题一:《三维环境的漫游程序设计》
1、目标
在OpenGL的基础上,分别以飞行模式和驾驶模式漫游室外场景或室内场景。
2、功能
1)程序应支持两种模式,一是飞翔模式,二是驾驶模式。 2)飞翔模式中应支持的功能有:
(1)前后飞行。沿Z轴正方向、反方向运动; (2)左右飞行。沿X轴正方向、反方向运动; (3)上下飞行。沿Y轴正方向、反方向运动; (4)场景旋转。分别沿X、Y、Z坐标轴旋转; 3)驾驶模式中应支持的功能有:
(1)显示即时运动信息; (2)自动行走;
(3)自动行走过程中,手动左右转弯;
3、基本思路
主要思路如下:
(1)小组讨论,建立什么样的场景,发挥想象力、创造力,创意出虚拟场景方案; (2)针对上述虚拟场景方案,建模人员实施建模; (3)将所建模型导出为3DS文件;
(4)利用相关软件察看文件内容,熟悉场景中的对象名称等内容; (5)导入3DS文件内容,在项目中显示其中的虚拟场景; (6)实现对场景的漫游。
4、场景建模
场景建模的平台主要有两种:一种是3DS MAX,用于景物的实体建模;一种是Photoshop,主要用来设计景物中的纹理贴图,达到真实性的效果。
5、导出模型
主要利用3DS MAX的导出功能,把所建模型输出为3DS文件。
3
图一 导出文件
图二 导出文件对话框
把得到的模型文件拷贝到项目的适当位置,如:
4
图三 项目文档结构图示例
6、建立编程项目环境
(1)建立一个单文档视项目,定好存放位置; (2)定制支持OpenGL环境的资源; (建立步骤详见平时实验及讲稿)。
7、利用第三方软件观察3DS文件中的模型
主要是利用Right Hemisphere公司生产的Deep Exploration软件来观察上面导出的3DS模型。
操作
8、操作3DS模型
在项目中导入3DS文件环境的搭建、从3DS文件中加载模型、显示模型、模型驱动的方法见实验示例。
课题二:《基于WinSock的信息传输程序的设计》
1、目标
在Windows Socket的原理的基础上,剖析QQ聊天程序的基本功能,设计即时通信的客户机和服务器程序,能够点对点传输文本及图像信息,
2、功能
1)服务器端 (1)接收来自客户机的登录请求,在文件或数据库中记录客户机的登录网络信息。 这些信息包括:用户标识、IP地址等。 (2)接收来自客户机的退出请求,在文件或数据库中删除客户机的登录记录。 (3)接收客户机的“取得所有用户信息”的请求,并把所有用户的信息发送给客 户机。
5
1)客户端 (1)把客户机的信息登录到服务器。这些信息包括:用户标识、IP地址等。 (2)请求服务器上的所有用户信息(用户标识、IP地址),并读取到客户机本地, 作为点对点通信的基础。
(3)选择某一用户,进行点对点通信(不再通过服务器)。通信的内容有两种开式: 文本信息、图像文件;
《三维环境的漫游程序设计》
主要程序代码如下:
#include \"stdafx.h\" #include \"Ex_MFC_OpenGL.h\"
#include \"MainFrm.h\"
#ifdef _DEBUG
#define new DEBUG_NEW #endif
IMPLEMENT_DYNCREATE(CMainFrame, CFrameWndEx)
const int iMaxUserToolbars = 10;
const UINT uiFirstUserToolBarId = AFX_IDW_CONTROLBAR_FIRST + 40;
const UINT uiLastUserToolBarId = uiFirstUserToolBarId + iMaxUserToolbars - 1;
6
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWndEx)
ON_WM_CREATE()
ON_COMMAND(ID_VIEW_CUSTOMIZE, &CMainFrame::OnViewCustomize)
ON_REGISTERED_MESSAGE(AFX_WM_CREATETOOLBAR, &CMainFrame::OnToolbarCreateNew) ON_COMMAND_RANGE(ID_VIEW_APPLOOK_WIN_2000,
ON_UPDATE_COMMAND_UI_RANGE(ID_VIEW_APPLOOK_WIN_2000,
ID_VIEW_APPLOOK_WINDOWS_7, ID_VIEW_APPLOOK_WINDOWS_7,
&CMainFrame::OnApplicationLook) &CMainFrame::OnUpdateApplicationLook) END_MESSAGE_MAP()
static UINT indicators[] = { };
CMainFrame::CMainFrame() { }
CMainFrame::~CMainFrame() { }
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) {
m_wndMenuBar.SetPaneStyle(m_wndMenuBar.GetPaneStyle()
|
CBRS_SIZE_DYNAMIC
|
CBRS_TOOLTIPS | CBRS_FLYBY);
if (!m_wndMenuBar.Create(this)) {
TRACE0(\"未能创建菜单栏\"); return -1; } BOOL bNameValid;
OnApplicationLook(theApp.m_nAppLook);
if (CFrameWndEx::OnCreate(lpCreateStruct) == -1)
return -1;
theApp.m_nAppLook = theApp.GetInt(_T(\"ApplicationLook\"), ID_VIEW_APPLOOK_VS_2008); ID_SEPARATOR, ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL,
7
if (CMFCToolBar::GetUserImages() == NULL) { }
{ }
CMFCToolBar::SetUserImages(&m_UserImages); if (m_UserImages.Load(_T(\".\\\\UserImages.bmp\")))
CDockingManager::SetDockingMode(DT_SMART); EnableAutoHidePanes(CBRS_ALIGN_ANY);
EnablePaneMenu(TRUE, ID_VIEW_CUSTOMIZE, strCustomize, ID_VIEW_TOOLBAR); CMFCToolBar::EnableQuickCustomization();
m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY); m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockPane(&m_wndMenuBar); DockPane(&m_wndToolBar);
if (!m_wndStatusBar.Create(this)) {
TRACE0(\"未能创建状态栏\"); return -1;
}
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | {
TRACE0(\"未能创建工具栏\"); return -1; }
!m_wndToolBar.LoadToolBar(theApp.m_bHiColorIcons
?
IDR_MAINFRAME_256
:
CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || IDR_MAINFRAME))
CMFCPopupMenu::SetForceMenuFocus(FALSE);
CString strToolBarName;
bNameValid = strToolBarName.LoadString(IDS_TOOLBAR_STANDARD); ASSERT(bNameValid);
m_wndToolBar.SetWindowText(strToolBarName); CString strCustomize;
bNameValid = strCustomize.LoadString(IDS_TOOLBAR_CUSTOMIZE); ASSERT(bNameValid);
m_wndToolBar.EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize); InitUserToolbars(NULL, uiFirstUserToolBarId, uiLastUserToolBarId);
m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT));
8
}
CList lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2003); lstBasicCommands.AddTail(ID_VIEW_APPLOOK_VS_2005); lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2007_BLUE); lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2007_SILVER); lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2007_BLACK); lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2007_AQUA); lstBasicCommands.AddTail(ID_VIEW_APPLOOK_WINDOWS_7); CMFCToolBar::SetBasicCommands(lstBasicCommands); return 0; BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { } #ifdef _DEBUG void CMainFrame::AssertValid() const { } void CMainFrame::Dump(CDumpContext& dc) const { } #endif CFrameWndEx::Dump(dc); CFrameWndEx::AssertValid(); if( !CFrameWndEx::PreCreateWindow(cs) ) return FALSE; return TRUE; 9 void CMainFrame::OnViewCustomize() { } LRESULT CMainFrame::OnToolbarCreateNew(WPARAM wp,LPARAM lp) { } void CMainFrame::OnApplicationLook(UINT id) { CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOfficeXP)); break; case ID_VIEW_APPLOOK_OFF_XP: switch (theApp.m_nAppLook) { case ID_VIEW_APPLOOK_WIN_2000: CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManager)); break; theApp.m_nAppLook = id; CWaitCursor wait; pUserToolbar->EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize); return lres; BOOL bNameValid; CString strCustomize; bNameValid = strCustomize.LoadString(IDS_TOOLBAR_CUSTOMIZE); ASSERT(bNameValid); CMFCToolBar* pUserToolbar = (CMFCToolBar*)lres; ASSERT_VALID(pUserToolbar); LRESULT lres = CFrameWndEx::OnToolbarCreateNew(wp,lp); if (lres == 0) { } return 0; CMFCToolBarsCustomizeDialog* pDlgCust = new CMFCToolBarsCustomizeDialog(this, TRUE pDlgCust->EnableUserDefinedToolbars(); pDlgCust->Create(); 10 case ID_VIEW_APPLOOK_OFF_2007_SILVER: CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_Obsid break; case ID_VIEW_APPLOOK_OFF_2007_BLACK: default: CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_LunaB break; switch (theApp.m_nAppLook) { case ID_VIEW_APPLOOK_OFF_2007_BLUE: CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows7)); CDockingManager::SetDockingMode(DT_SMART); break; case ID_VIEW_APPLOOK_WINDOWS_7: case ID_VIEW_APPLOOK_VS_2008: CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerVS2008)); CDockingManager::SetDockingMode(DT_SMART); break; case ID_VIEW_APPLOOK_VS_2005: CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerVS2005)); CDockingManager::SetDockingMode(DT_SMART); break; CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOffice2003)); CDockingManager::SetDockingMode(DT_SMART); break; case ID_VIEW_APPLOOK_OFF_2003: case ID_VIEW_APPLOOK_WIN_XP: CMFCVisualManagerWindows::m_b3DTabsXPTheme = TRUE; CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows)); break; lue); ianBlack); 11 r); ; } CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_Silve CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_Aqua) } break; break; case ID_VIEW_APPLOOK_OFF_2007_AQUA: CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOffice2007)); } RedrawWindow(NULL, NULL, RDW_ALLCHILDREN | RDW_INVALIDATE | RDW_UPDATENOW | RDW_FRAME CDockingManager::SetDockingMode(DT_SMART); | RDW_ERASE); theApp.WriteInt(_T(\"ApplicationLook\"), theApp.m_nAppLook); void CMainFrame::OnUpdateApplicationLook(CCmdUI* pCmdUI) { } BOOL CMainFrame::LoadFrame(UINT nIDResource, DWORD dwDefaultStyle, CWnd* pParentWnd, CCreateContext* pContext) { for (int i = 0; i < iMaxUserToolbars; i ++) { CMFCToolBar* pUserToolbar = GetUserToolBarByIndex(i); if (pUserToolbar != NULL) if (!CFrameWndEx::LoadFrame(nIDResource, dwDefaultStyle, pParentWnd, pContext)) { } BOOL bNameValid; CString strCustomize; bNameValid = strCustomize.LoadString(IDS_TOOLBAR_CUSTOMIZE); ASSERT(bNameValid); return FALSE; pCmdUI->SetRadio(theApp.m_nAppLook == pCmdUI->m_nID); 12 } } { } pUserToolbar->EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize); return TRUE; 课题二:《基于WinSock的信息传输程序的设计》 客户端: #include \"stdafx.h\" #include \"Msg.h\" CMsg::CMsg(CString& preMsg) { } void CMsg::Init() { } m_strText=_T(\"\"); m_strText=preMsg; 13 CString CMsg::WhatType() { } return m_strText; CString m=\"preType:\"+preType; AfxMessageBox(m); m=\"who:\"+m_nomalMsg.who;//+\"\\ntoWho:\"+toWho+\"\\nMessage:\"+msgItem; AfxMessageBox(m); m=\"toWho:\"+m_nomalMsg.toWho; AfxMessageBox(m); m=\"Message:\"+m_nomalMsg.msgItem; AfxMessageBox(m) begin=end+1; end=m_strText.Find(\"_\",begin); m_nomalMsg.toWho=m_strText.Mid(begin,end-begin); begin=end+1; m_nomalMsg.msgItem=m_strText.Mid(begin); CString preType(\"NULLMSG\"); CString who; CString toWho; CString msgItem; int begin=0; int end=0; m_strText=\"NOMALMSG_hupeng_jianghe_ if(m_strText.SpanIncluding(\"NOMALMSG\")==\"NOMALMSG\") { end=m_strText.Find(\"_\"); begin=end+1; end=m_strText.Find(\"_\",begin); m_nomalMsg.who=m_strText.Mid(begin,end-begin); preType=m_strText.Mid(begin,end-begin); // end=m_strText.Find(\"_\ // Client.cpp : Defines the class behaviors for the application. // #include \"stdafx.h\" #include \"Client.h\" #include \"ClientDlg.h\" 14 #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CClientApp BEGIN_MESSAGE_MAP(CClientApp, CWinApp) ///////////////////////////////////////////////////////////////////////////// // CClientApp construction CClientApp::CClientApp() { } ///////////////////////////////////////////////////////////////////////////// // The one and only CClientApp object CClientApp theApp; ///////////////////////////////////////////////////////////////////////////// // CClientApp initialization BOOL CClientApp::InitInstance() { AfxEnableControlContainer(); if (!AfxSocketInit()) { } AfxMessageBox(IDP_SOCKETS_INIT_FAILED); return FALSE; // TODO: add construction code here, // Place all significant initialization in InitInstance //{{AFX_MSG_MAP(CClientApp) // NOTE - the ClassWizard will add and remove mapping macros here. // DO NOT EDIT what you see in these blocks of generated code! //}}AFX_MSG ON_COMMAND(ID_HELP, CWinApp::OnHelp) END_MESSAGE_MAP() 15 #ifdef _AFXDLL } // LoadDlg.cpp : implementation file // #include \"stdafx.h\" #include \"Client.h\" #include \"LoadDlg.h\" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif // Since the dialog has been closed, return FALSE so that we exit the // application, rather than start the application's message pump. return FALSE; CClientDlg dlg; m_pMainWnd = &dlg; int nResponse = dlg.DoModal(); if (nResponse == IDOK) { } else if (nResponse == IDCANCEL) { } // TODO: Place code here to handle when the dialog is // dismissed with Cancel // TODO: Place code here to handle when the dialog is // dismissed with OK Enable3dControls(); // Call this when using MFC in a shared DLL #else Enable3dControlsStatic(); // Call this when linking to MFC statically #endif // Standard initialization // If you are not using these features and wish to reduce the size // of your final executable, you should remove from the following // the specific initialization routines you do not need. 16 ///////////////////////////////////////////////////////////////////////////// // CLoadDlg dialog CLoadDlg::CLoadDlg(CWnd* pParent /*=NULL*/) { } void CLoadDlg::DoDataExchange(CDataExchange* pDX) { } BEGIN_MESSAGE_MAP(CLoadDlg, CDialog) ///////////////////////////////////////////////////////////////////////////// // CLoadDlg message handlers void CLoadDlg::OnOK() { if(!m_user.IsEmpty()) { if(AfxMessageBox(\"用户名不能为空,请重新输入\",MB_YESNO)==IDNO) { } else CDialog::OnOK(); return; // CClientDlg::SendMsg(BuildLoadMsg()); //{{AFX_MSG_MAP(CLoadDlg) //}}AFX_MSG_MAP CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CLoadDlg) DDX_Text(pDX, IDC_EDIT_PASSWORD, m_password); DDX_Text(pDX, IDC_EDIT_USER, m_user); //}}AFX_DATA_MAP //{{AFX_DATA_INIT(CLoadDlg) m_password = _T(\"\"); m_user = _T(\"\"); //}}AFX_DATA_INIT : CDialog(CLoadDlg::IDD, pParent) END_MESSAGE_MAP() 17 } } { } return; CDialog::OnOK(); void CLoadDlg::OnCancel() { } // TODO: Add extra cleanup here CDialog::OnCancel(); 服务端: // Server.cpp : Defines the class behaviors for the application. // #include \"stdafx.h\" #include \"Server.h\" #include \"ServerDlg.h\" #ifdef _DEBUG 18 #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CServerApp BEGIN_MESSAGE_MAP(CServerApp, CWinApp) ///////////////////////////////////////////////////////////////////////////// // CServerApp construction CServerApp::CServerApp() { } ///////////////////////////////////////////////////////////////////////////// // The one and only CServerApp object CServerApp theApp; ///////////////////////////////////////////////////////////////////////////// // CServerApp initialization BOOL CServerApp::InitInstance() { // Standard initialization AfxEnableControlContainer(); if (!AfxSocketInit()) { } AfxMessageBox(IDP_SOCKETS_INIT_FAILED); return FALSE; // TODO: add construction code here, // Place all significant initialization in InitInstance //{{AFX_MSG_MAP(CServerApp) // NOTE - the ClassWizard will add and remove mapping macros here. // DO NOT EDIT what you see in these blocks of generated code! //}}AFX_MSG ON_COMMAND(ID_HELP, CWinApp::OnHelp) END_MESSAGE_MAP() 19 // If you are not using these features and wish to reduce the size // of your final executable, you should remove from the following // the specific initialization routines you do not need. #ifdef _AFXDLL } // ListeningSocket.cpp : implementation file // #include \"stdafx.h\" #include \"Server.h\" #include \"ListeningSocket.h\" #include \"ServerDlg.h\" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // Since the dialog has been closed, return FALSE so that we exit the // application, rather than start the application's message pump. return FALSE; CServerDlg dlg; m_pMainWnd = &dlg; int nResponse = dlg.DoModal(); if (nResponse == IDOK) { } else if (nResponse == IDCANCEL) { } // TODO: Place code here to handle when the dialog is // dismissed with Cancel // TODO: Place code here to handle when the dialog is // dismissed with OK Enable3dControls(); // Call this when using MFC in a shared DLL #else Enable3dControlsStatic(); // Call this when linking to MFC statically #endif 20 // CListeningSocket CListeningSocket::CListeningSocket() { } CListeningSocket::CListeningSocket(CServerDlg* pDlg) { } CListeningSocket::~CListeningSocket() { } // Do not edit the following lines, which are needed by ClassWizard. #if 0 BEGIN_MESSAGE_MAP(CListeningSocket, CSocket) //{{AFX_MSG_MAP(CListeningSocket) //}}AFX_MSG_MAP m_pDlg=pDlg; END_MESSAGE_MAP() #endif // 0 ///////////////////////////////////////////////////////////////////////////// // CListeningSocket member functions void CListeningSocket::OnAccept(int nErrorCode) { } // Machine generated IDispatch wrapper class(es) created by Microsoft Visual C++ // NOTE: Do not modify the contents of this file. If this class is regenerated by // Microsoft Visual C++, your modifications will be overwritten. #include \"stdafx.h\" #include \"font.h\" // TODO: Add your specialized code here and/or call the base class CSocket::OnAccept(nErrorCode); m_pDlg->OnAccept(); 21 ///////////////////////////////////////////////////////////////////////////// // COleFont properties CString COleFont::GetName() { } void COleFont::SetName(LPCTSTR propVal) { } CY COleFont::GetSize() { } void COleFont::SetSize(const CY& propVal) { } BOOL COleFont::GetBold() { } void COleFont::SetBold(BOOL propVal) { } BOOL COleFont::GetItalic() { BOOL result; GetProperty(0x4, VT_BOOL, (void*)&result); return result; SetProperty(0x3, VT_BOOL, propVal); BOOL result; GetProperty(0x3, VT_BOOL, (void*)&result); return result; SetProperty(0x2, VT_CY, &propVal); CY result; GetProperty(0x2, VT_CY, (void*)&result); return result; SetProperty(0x0, VT_BSTR, propVal); CString result; GetProperty(0x0, VT_BSTR, (void*)&result); return result; 22 } void COleFont::SetItalic(BOOL propVal) { } BOOL COleFont::GetUnderline() { } void COleFont::SetUnderline(BOOL propVal) { } BOOL COleFont::GetStrikethrough() { } void COleFont::SetStrikethrough(BOOL propVal) { } short COleFont::GetWeight() { } void COleFont::SetWeight(short propVal) { } short COleFont::GetCharset() SetProperty(0x7, VT_I2, propVal); short result; GetProperty(0x7, VT_I2, (void*)&result); return result; SetProperty(0x6, VT_BOOL, propVal); BOOL result; GetProperty(0x6, VT_BOOL, (void*)&result); return result; SetProperty(0x5, VT_BOOL, propVal); BOOL result; GetProperty(0x5, VT_BOOL, (void*)&result); return result; SetProperty(0x4, VT_BOOL, propVal); 23 { } void COleFont::SetCharset(short propVal) { } ///////////////////////////////////////////////////////////////////////////// // COleFont operations // ClientSocket.cpp : implementation file // #include \"stdafx.h\" #include \"Server.h\" #include \"ClientSocket.h\" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CClientSocket CClientSocket::CClientSocket() { } CClientSocket::CClientSocket(CServerDlg* pDlg) { m_pDlg=pDlg; /* m_pFile=NULL; } CClientSocket::~CClientSocket() m_pArchiveIn=NULL; m_pArchiveOut=NULL;*/ SetProperty(0x8, VT_I2, propVal); short result; GetProperty(0x8, VT_I2, (void*)&result); return result; 24 { } void CClientSocket::Initialize() { /* m_pFile=new CSocketFile(this); } /*void CClientSocket::SendMassage(CMsg* msg) { }*/ /*void CClientSocket::ReceiveMessage(CMsg* msg) { }*/ // Do not edit the following lines, which are needed by ClassWizard. #if 0 BEGIN_MESSAGE_MAP(CClientSocket, CSocket) //{{AFX_MSG_MAP(CClientSocket) //}}AFX_MSG_MAP // msg->Serialize(*m_pArchiveIn); if(m_pArchiveOut!=NULL) { } msg->Serialize(*m_pArchiveOut); m_pArchiveOut->Flush();* m_pArchiveIn=new CArchive(m_pFile,CArchive::load); m_pArchiveOut=new CArchive(m_pFile,CArchive::store);*/ END_MESSAGE_MAP() #endif // 0 ///////////////////////////////////////////////////////////////////////////// // CClientSocket member functions void CClientSocket::OnReceive(int nErrorCode) { // AfxMessageBox(\"CClientSocket::OnReceive\"); // AfxMessageBox(\"CClientSocket::OnReceive\"); CSocket::OnReceive(nErrorCode); if(nErrorCode==0) m_pDlg->OnReceive(this); 25 } 实训总结 通过这几周的VC++实训,我利用VC++有关Windows编程的知识与技术实现对3D虚拟场景的建模、导入、显示与漫游。深入socket通信编程,完成基本的文本、图像信息的传输,模拟基本QQ会话功能。初步掌握利用VC++进行较大规模、功能比较复杂的任务的设计方法与技巧。 本次实训一共要完成两个课题:三维环境的漫游程序设计和基于WINSOCK的信息传输程序的设计,我通过在网上查找相关的编程资料和向别人请教,最后完成了这两个实训项目。通过这次的实训我感觉到我的专业技能又进步了,而且我明白了学习是永无止尽的,要不断的学习,充实自己,才不会被社会淘汰。 26 因篇幅问题不能全部显示,请点此查看更多更全内容