vc++编程技术600个大型项目源码(十).doc_第1页
vc++编程技术600个大型项目源码(十).doc_第2页
vc++编程技术600个大型项目源码(十).doc_第3页
vc++编程技术600个大型项目源码(十).doc_第4页
vc++编程技术600个大型项目源码(十).doc_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本资料由-校园大学生创业网-提供/ OpenGL+MFC单文档图形绘制具体函数实现 1.在5Veiw:preCreateWindow()函数加入以下代码/设置窗口类型cs.style|=WS_CLIPCHILDREN|WS_CLIPSIBLINGS;return CView:PreCreateWindow(cs);2.在5Veiw:OnDraw()函数加入 RenderScene();3.在5Veiw:OnCreate()加入一下代码/初始化OpenGL和设置定时器m_pDC = new CClientDC(this);SetTimer(1,20,NULL);InitializeOpenGL(m_pDC);4.在5Veiw:OnDestroy加入/删除调色板和渲染上下文、定时器:wglMakeCurrent(0,0);:wglDeleteContext(m_hRC);if(m_hPalette)DeleteObject(m_hPalette);if(m_pDC)Delete m_pDC;KillTimer(1);5.在5Veiw:OnSize()函数加入glViewport(0,0,cx,cy);6.在5Veiw:OnTimer(UINT nIDEvent)函数加入/添加定时响应器和场景更新函数Invalidate(FALSE);CView:OnTimer(nIDEvent);7.添加void 5Veiw:SetLogiclPalette(void)/设置逻辑调色板structWORD Version;WORD NumberOfEnteries;PALETTEENTRY aEnteries256;logicalPalette=0300,256;BYTE reds = 0,36,72,109,145,182,218,255;BYTE greens=0,36,72,109,145,182,218,255;BYTE blues=0,85,170,255;for(int colorNum=0;colorNum0x03)&0x07;logicalPalette.aEntriescolorNum.peBlue = greens(colorNum0x06)&0x03;logicalPalette.aEntriescolorNum.peFlags=0;m_hPalette = CreatePalette(LOGPALETTE*)&logicalPalette);7.添加BOOL 5Veiw:InitializeOpenGL(CDC*pDC) m_pDC = pDC;setupPixelFormat();/生成绘制表m_hRC = :wglCreateContext(m_pDC-GetSafeHdc();/设置当前绘制描述表:wglMakeCruute(m_pDC-GetSafeHdc(),m_hRC);return TRUE;8.添加BOOL 5Veiw:SetupPixelFormat() static PIXELFORMATDESCRIPTOR pfd = sizeof(PIXELFORMATDESCRIPTOR), / pdf结构大小 1, / 版本号 PFD_DRAW_TO_WINDOW | / 支持的窗口绘图 PFD_SUPPORT_OPENGL | / 支持OpenGL PFD_DOUBLEBUFFER, / double buffered PFD_TYPE_RGBA, / RGBA type 24, / 24-bit color depth 0, 0, 0, 0, 0, 0, / 忽略颜色位 0, / 没有非透明度缓存 0, / 忽略移位位 0, / 无累加缓存 0, 0, 0, 0, / 忽略累加位 16, / 16-bit 深度缓存 0, / 无模板缓存 0, /无辅助缓存 PFD_MAIN_PLANE, / 主层 0, / 保留 0, 0, 0 / 忽略层,可见性和损毁掩模 ;/选择像素格式 int m_nPixelFormat = :ChoosePixelFormat(m_pDC-GetSafeHdc(), &pfd);/设置像素格式 if ( m_nPixelFormat = 0 ) return FALSE; if ( :SetPixelFormat(m_pDC-GetSafeHdc(), m_nPixelFormat, &pfd) = FALSE) return FALSE; if(pdf.dwFlags & PDF_NEED_PALETTE) SetLogicalPaltte();/设置逻辑调色板 return TRUE;8.添加BOOL 5Veiw:RenderScene():SwapBuffers(m_pDC-GetSafeHdc();return TRUE;利用MFC编程在工具条中增加组合框控件Windows UI技术一直是程序设计人员尤其是用户接口程序设计人员最关心的技术。显然新颖美观的界面会给用户留下深刻的印象。Windows操作系统的流行也在于其用户界面的不断创新与改进。Office 97、Visual Studio 97、Outlook、IE等每一个新的软件的推出都能够给人新的感觉。尤其是这些软件工具条十分丰富美观,如3D形式的工具条、飞行Tips,这些小技巧既富于吸引力,又方便了使用者。我们知道,Visual C+所提供的标准工具条中基本上只有一些简单的诸如文档打开、存储以及一些编辑功能按钮,而Visual C+自身的工具条功能十分丰富,尤其是工具条中内嵌的组合框控件十分方便。实际上利用MFC编程在工具条中增加一些有趣的控件还是比较容易的,下面我们就谈谈如何利用MFC编程在工具条中增加组合框控件。 1. 创建AppWizard工程文件设为toolbar,采用系统缺省设置。 2. 打开资源编辑器,选择工具条,在工具条中增加一个按钮,设置按钮 I D 为 I D_MY_COMBO_BOX 。 移动该按钮以使按钮处于适当的位置。 3. 从 C ToolBar 派 生出一个新类 C MyToolBar , 在 C MyToolBar 类 中增加一个成员变量 m_wndMyComboBox , 代码如下: class CMyToolBar : public CToolBarpublic: CComboBox m_wndMyComboBox; 注意要将代码放在工程文件mainframe.h中“#endif / _MSC_VER 1000”语句之后,类CMainFrame定义之前。 4. 将工程文件mainframe.h中的CToolBar变量m_wndToolBar用CMyToolBar变量m_wndToolBar代替。同时增加函数CreateMyComboToolBar()声明。代码如下: protected: / control bar embedded members CStatusBar m_wndStatusBar;CMyToolBar m_wndToolBar;int CreateMyComboToolBar();5. 在工程文件mainframe.cpp中的OnCreate()函数返回语句之前调用函数CreateMyToolBar();代码如下所示: if(!CreateMyComboToolBar() MessageBox(Create My Combo ToolBar Failure);6. 以文本方式打开资源头文件resource.h,增加一个控制ID如下,注意该控制的ID值不要与其它控制或资源的ID值重复: #define IDC_MY_COMBO11117. 在工程文件mainframe.cpp中增加函数CreateMyToolBar();代码如下: int MainFrame:CreateMyToolBar() #define COMBO_BOX_WIDTH 80 /the width of the combo box /set up the ComboBox control as a select box/First get the index of the buttons position in the toolbarint index = 0;CRecr rect;while(m_wndToolBar.GetItemID(index)!= ID_MY_COMBO_BOX) index+;/next convert that button to a seperator and get its positionm_wndToolBar.SetButtonInfo(index, ID_MY_COMBO_BOX, TBBS_SEPARATOR, COMBO_BOX_WIDTH); m_wndToolBar.GetItemRect(index, &rect);/expand the rectangle to allow the combo box room to drop down rect.top+=2; rect.bottom += 200; / then .Create the combo box and show it if (!m_wndToolBar.m_ wndMyComboBox.Create( WS_CHILD|WS_VISIBLE | CBS_AUTOHSCROLL | CBS_DROPDOWNLIST | CBS_HASSTRINGS , rect, &m_wndToolBar, IDC_MY_COMBO) TRACE0(Failed to create combo-box); return FALSE; m_wndToolBar.m_wndMyComboBox.ShowWindow(SW_SHOW); /adding string to the combo box m_wndToolBar.m_wndMyComboBox.AddString(Fisrt Select); m_wndToolBar.m_wndMyComboBox.AddString(Second Select); m_wndToolBar.m_wndMyComboBox.AddString(Third Select); m_wndToolBar.m_wndMyComboBox.AddString(Fourth Select); m_wndToolBar.m_wndMyComboBox.AddString(Fifth Select); m_wndToolBar.m_wndMyComboBox.SetCurSel(0);编译并运行该应用,就会发现工具条中多了一个组合框控件。 从上面的例程可以看出,在工具条中增加新的控件,关键在于重写主框架的OnCreate()函数。掌握了这一点,就可以在工具条中增加各种各样的控件了,如增加无限输入(Radio)控件、检查框(Check)控件等。有兴趣的读者可以自己去尝试一下加深理解。 MFC通过ADO访问SQL数据库VS2008中首先新建个基于Dialog的MFC应用程序, 然后经过wizard生成的stdafx.h文件的末尾添加上#import C:Program FilesCommon FilesSystemadomsado15.dllno_namespace rename(EOF,rsEOF)双击resouce view中dialog目录下的Dialog中的任意一个按钮然后再Dlg.CPP按钮事件中添加如下代码CoInitialize(NULL);/AfxOleInit();_ConnectionPtr pConn(_uuidof(Connection);_RecordsetPtr pRst(_uuidof(Recordset);_CommandPtr pCmd(_uuidof(Command);/实例化一个Command对象pCmd if (FAILED(pConn.CreateInstance(ADODB.Connection)AfxMessageBox(LCreate Instance failed!);return;pConn-Open(Provider=SQLOLEDB.1;Integrated Security=SSPI; Initial Catalog=Component;Data Source=VISIONSKYsqlexpress;,adModeUnknown); AfxMessageBox(L连接成功);catch(_com_error e)AfxMessageBox(L连接失败 +e.Description(); 这里使用的方法是windows验证,你也可以用混合验证 Provider=SQLOLEDB.1;Integrated Security=SSPI; Initial Catalog=Component;Data Source=VISIONSKYsqlexpress;替换成Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;PWD=sa;Initial Catalog=Component;Data Source=VISIONSKYsqlexpress我的数据库用的是sql2005express,如果你用的是2005而不是express版本的,那么你需要将sqlexpress去掉即可MFC中关于控件和变量对应方法在MFC中我们常常要把一些变量于控件对应起来!1. 控件与value变量对应。通过UpdateDate来实调用DoDataExchange(CDataExchange* pDX)实现变量信息交换!如:DDX_Text(pDX, IDC_STATICCOUNT, m_sCount); - value把控件ID为IDC_STATICCOUNT的控件与m_sCount变量对应起,用UpdateDate(TRUE)来把IDC_STATICCOUNT控件数据写到m_sCount;用UpdateDate(FALSE)把m_sCount数据读写到IDC_STATICCOUNT控件;2. 控件与控制变量对应。DDX_Control(pDX, IDC_BSTARTTIME, m_cStartTime);-control把控件ID为IDC_BSTARTTIME的控件与m_sCount变量对应起,如BUTTON。此时我们可以通过m_cStartTime控件变量改变对应控件状态!m_cStartTime.EnableWindow(FALSE); 可以改变控件是否可用!如果没有control对应,那么我们可以使用等价语句:GetDlgItem(IDC_BSTARTTIME)-EnableWindow(TRUE);对话框数据交换(MFC)/Jiangsheng的牢骚(对话框数据交换)由于越来越多的人问如何在对话框中获得文档/视图指针以执行数据访问和交换的问题,我大多数情况下都不得不建议比较好的方式是备份数据而不是直接修改。本文的内容以现状提供并且不提供任何担保,Jiangsheng不对使用本文造成的可能的损失负责/EndJiangsheng的牢骚(对话框数据交换)通常,简单的对话框不使用结构来存储成员数据。但是大量的简单类型的成员交换会使得代码繁琐。这时候可以使用结构来封装简单类型的数据,声明一个赋值操作符和修改DDX调用来简化数据交换代码。例如在文档或者视图的命令处理函数中voidCMyView:OnSomeButton()CMyDoc*pDoc=GetDocument();CMyDialogmydlg;mydlg.m_data=pDoc-data1;if(mydlg.DoModal()!=IDOK)return;/AllowcancelpDoc-data1=mydlg.m_data;voidCMyDialog:oDataExchange(CDataExchange*pDX)CDialog:oDataExchange(pDX);/callbaseclass/AFX_DATA_MAP(CMyDialog)/AFX_DATA_MAPDDX_Check(pDX,IDC_SEX,m_data.m_bFemale);DDX_Text(pDX,IDC_EDIT1,m_data.m_strName);这里pDoc-data1和mydlg.m_data不必是同一类型的类,只需要有=操作符来复制数据就行了。我要把文档的数据复制一个备份的原因是,如果在模态对话框中把控件直接绑定到文档的成员,那么如果在对话框数据验证过程中一个控件验证失败,那么验证过程中这个控件之前的数据交换已经执行,即使选择取消之后也无法恢复弹出对话框之前的状态。这可能不是用户期望的行为。另外,基于MFC的句柄映射机制,跨线程调用CWnd成员函数,例如UpdateData,会有不可预料的后果。有兴趣的可以参考微软知识库文章Q147578CWndDerivedMFCObjectsandMulti-threadedApplications。修改工程的CLW文件以扩展默认的DDX/DDV机制的方法对我不很实用。我的VC经常丢失部分类的向导信息(在存盘的时候,我的杀毒软件就隔离了我的代码文件开始扫描病毒,然后VC报告文件不能保存,classview的相关类信息就丢失了)我不得不每隔一段时间删除并且重建CLW文件。顺便说一下,TN026里面似乎有好多BUG,被解释了两次,根据顺序来看,第一个解释应该是正确的。第二个似乎是旧的解释的版本,忘记删除了。另外有一段话“=singleidentifierfortheDDV_procedure.TheC+functionnamemuststartwith“DDV_”butdontinclude“DDX_”intheidentifier.”被重复了两次。看起来看MFC技术文章的人次是不多.编程删除IE历史在你调用IUrlHistoryStg:eleteUrl之后,这个URL项目仍旧会出现在IE历史纪录目录中。你可以使用IContextMenu:InvokeCommand模拟一个手动删除命令,但是这样做的缺点是你不能够跳过删除确认对话框下面的代码删除一个IE历史纪录目录中顶层目录的第一项。这通常是最久的历史纪录,但是你可以修改部分代码来删除需要的项目。/Errorcheckingminimizedforclarity.voidDeleteUrlFromHistoryShell()HRESULThr;/Callthisifneeded.CoInitialize(NULL);IShellFolder*pDesktopFolder=NULL;IMalloc*pMalloc=NULL;hr=:SHGetMalloc(&pMalloc);/Getdesktopfolder.hr=:SHGetDesktopFolder(&pDesktopFolder);/Getthehistoryfolder.ITEMIDLIST*pidlHistoryFolder=NULL;hr=:SHGetSpecialFolderLocation(NULL,CSIDL_HISTORY,&pidlHistoryFolder);/GettheIShellFolderofthehistoryfolder.IShellFolder*pHistoryFolder=NULL;hr=pDesktopFolder-BindToObject(pidlHistoryFolder,NULL,IID_IShellFolder,(void*)&pHistoryFolder);/Enumeratethehistoryitems.IEnumIDList*pHistoryEnum=NULL;hr=pHistoryFolder-EnumObjects(NULL,SHCONTF_FOLDERS|SHCONTF_NONFOLDERS,&pHistoryEnum);ITEMIDLIST*pidl=NULL;ULONGfetched=0;hr=pHistoryEnum-Next(1,&pidl,&fetched);if(SUCCEEDED(hr)constITEMIDLIST*pidl2=pidl;/GettheIContextMenuinterface.IContextMenu*pContextMenu=NULL;hr=pHistoryFolder-GetUIObjectOf(NULL,1,&pidl2,IID_IContextMenu,NULL,(void*)&pContextMenu);if(SUCCEEDED(hr)CMINVOKECOMMANDINFOpCommandInfo=0;pCommandInfo.cbSize=sizeof(CMINVOKECOMMANDINFO);pCommandInfo.lpVerb=_T(delete);pCommandInfo.fMask=CMIC_MASK_FLAG_NO_UI;/hasnoeffecthr=pContextMenu-InvokeCommand(&pCommandInfo);pContextMenu-Release();pHistoryEnum-Release();pHistoryFolder-Release();pMalloc-Release();pDesktopFolder-Release();IUrlHistoryStg2:ClearHistory从IE历史纪录目录清除一已经被删除的URL项目。IUrlHistoryStg:eleteUrl并非设计来用于删除历史纪录中的URL项目,因为很多内部函数依赖于它,所以他的行为不能被改变。限制应用程序的实例数目/CTheApp:FirstInstance/FirstInstancechecksforanexistinginstanceoftheapplication./Ifoneisfound,itisactivated./ThisfunctionusesatechniquesimilartothatdescribedinKB/articleQ109175tolocatethepreviousinstanceoftheapplication./However,insteadofsearchingforamatchingclassname,itsearches/foramatchingcaption.Thisallowsustousethenormaldialog/classforourmainwindow.ItassumesthattheAFX_IDS_APP_TITLE/stringresourcematchesthecaptionspecifiedinthedialogtemplate.BOOLCTheApp:FirstInstance()CStringstrCaption;strCaption.LoadString(AFX_IDS_APP_TITLE);CWnd*pwndFirst=CWnd:FindWindow(LPCTSTR)(DWORD_PTR)WC_DIALOG,strCaption);if(pwndFirst)/anotherinstanceisalreadyrunning-activateitCWnd*pwndPopup=pwndFirst-GetLastActivePopup();pwndFirst-SetForegroundWindow();if(pwndFirst-IsIconic()pwndFirst-ShowWindow(SW_SHOWNORMAL);if(pwndFirst!=pwndPopup)pwndPopup-SetForegroundWindow();returnFALSE;else/thisisthefirstinstancereturnTRUE;/CTheApp:InitInstance/InitInstanceperformsper-instanceinitializationoftheDLGCBAR/application.Ifaninstanceoftheapplicationisalreadyrunning,/itactivatesthatinstance.Otherwise,itcreatesthemodeless/dialogwhichservesastheapplicationsinterface.BOOLCTheApp:InitInstance()if(!FirstInstance()returnFALSE;这里使用了窗口标题进行查找匹配。可以使用内核同步对象来进行准确的匹配和防止同时启动。让msxml4导出的文本xml缩进和换行问起过好多次的问题了,手头正好在做XML的生成,就写了一下其实,缩进和换行就是文本,在需要的位置创建文本节点就可以了。另外一个方法就是用SAX来写可以这么写出来voidCChatEditDlg:SendContent(BSTRbstrContent)CHARFORMAT2&rcf=m_wndSend.GetCharFormatSelection();CComBSTRbstrXML;USES_CONVERSION;tryIXMLDOMDocument2PtrpDoc;IXMLDOMProcessingInstructionPtrpProcessingInstruction;IXMLDOMElementPtrpLog,pMessage;IXMLDOMElementPtrpFrom,pTo;IXMLDOMElementPtrpUser;IXMLDOMElementPtrpText;HRESULThr=pDoc.CreateInstance(_uuidof(MSXML2:OMDocument40);if(pDoc)pDoc-async=false;pDoc-resolveExternals=false;pDoc-validateOnParse=true;/pProcessingInstruction=pDoc-createProcessingInstruction(_T(xml),/_T(version=1.0encoding=UTF-16);/pDoc-appendChild(pProcessingInstruction);/LogpLog=pDoc-createElement(_T(Log);hr=pDoc-appendChild(pLog);AppendTextNode(pDoc,pLog,_T(rnt);/Log/MessagepMessage=pDoc-createElement(_T(Message);hr=pLog-appendChild(pMessage);AppendTextNode(pDoc,pMessage,_T(rnt);COleDateTimet=COleDateTime:GetCurrentTime();COleDateTimetd=t;td.m_dt=(int)td.m_dt;COleDateTimett=t-td;/Log/Message/DatepMessage-setAttribute(LDate,COleVariant(td);/Log/Message/TimepMessage-setAttribute(LTime,COleVariant(tt);/Log/Message/DateTimepMessage-setAttribute(LDateTime,COleVariant(t);/Log/Message/SessionIDpMessage-setAttribute(LSessionID,(long)1);/Log/Message/FrompFrom=pDoc-createElement(_T(From);hr=pMessage-appendChild(pFrom);AppendTextNode(pDoc,pFrom,_T(rntt);/Log/Message/From/UserpUser=pDoc-createElement(_T(User);hr=pFrom-appendChild(pUser);/AppendTextNode(pDoc,pUser,_T(rntt);AppendTextNode(pDoc,pFrom,_T(rnt);AppendTextNode(pDoc,pMessage,_T(rnt);/Log/Message/From/User/LogonNamepUser-setAttribute(LLogonName,_T();/Log/Message/From/User/FriendlyNamepUser-setAttribute(LFriendlyName,_T(user1);/Log/Message/TopTo=pDoc-createElement(_T(To);hr=pMessage-appendChild(pTo);AppendTextNode(pDoc,pTo,_T(rntt);/Log/Message/To/UserpUser=pDoc-createElement(_T(User);hr=pTo-appendChild(pUser);/Log/Message/To/User/LogonNamepUser-setAttribute(LLogonName,_T();/Log/Message/To/User/FriendlyNamepUser-setAttribute(LFriendlyName,_T(user2);AppendTextNode(pDoc,pTo,_T(rnt);AppendTextNode(pDoc,pMessage,_T(rnt);/Log/Message/TextpText=pDoc-createElement(_T(Text);pText-put_text(bstrContent);hr=pMessage-appendChild(pText);pText-setAttribute(LStyle,(LPCTSTR)GetStyleAttrib(rcf);AppendTextNode(pDoc,pMessage,_T(rn);/element/dateproperty/timeproperty/datetimeproperty/SessionIDproperty/element/element/LogonNameproperty/FriendlyNameproperty/element/LogonNameproperty/FriendlyNameproperty/element/Styleproperty/element/dateproperty/timeproperty/datetimeproperty/SessionIDproperty/element/element/LogonNameproperty/FriendlyNameproperty/element/element/Styleproperty/element/dateproperty/timeproperty/datetimeproperty/SessionIDproperty/element/element/LogonNameproperty/FriendlyNamepropertypMessage-get_xml(&bstrXML);TRACE(_T(%srn),OLE2T(bstrXML);catch(.)return;voidCChatEditDlg:AppendTextNode(IXMLDOMDocument2PtrpDoc,IXMLDOMElementPtrpElement,LPCTSTRlpszText)IXMLDOMNodePtrpTextNode=pDoc-createTextNode(lpszText);pElement-appendChild(pTextNode);ActiveX控件访问所在网页的DHTML文档对象模型(MFC)voidCICWXPlayerCtrl:SetHolderID(CICWXPlayerWindowHolder:enumHolderIndexiHolderIndex,LPCTSTRlpszElementID)IOleClientSite*pClientSite=GetClientSite();doif(pClientSite=NULL)break;CComQIPtrpISP(pClientSite);if(pISP=NULL)break;CComPtrpIWebBrowser2;pISP-QueryService(IID_IWebBrowserApp,IID_IWebBrowser2,(void*)&pIWebBrowser2);if(pIWebBrowser2=NULL)break;CComPtrspDocument;pIWebBrowser2-get_Document(&spDocument);CComQIPtrpIHTMLDocument2(spDocument);if(pIHTMLDocument2=NULL)break;CComPtrpHTMLElementCollection;pIHTMLDocument2-get_all(&pHTMLElementCollection);if(pHTMLElementCollection=NULL)break;COleVariantvarName(lpszElementID,VT_BSTR);COleVariantvarindex;CComPtrspElement;pHTMLElementCollection-item(varName,varindex,&spElement);if(spElement=NULL)break;/isitanIframe?CComQIPtrpFrame(spElement);if(pFrame)switch(iHolderIn

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论