mfc常见问题总结.doc_第1页
mfc常见问题总结.doc_第2页
mfc常见问题总结.doc_第3页
mfc常见问题总结.doc_第4页
mfc常见问题总结.doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

mfc常见问题总结(1) 为什么某个类突然在工作区间里面突然看不见了?只是类隐藏了,打开FILEVIEW,找到隐藏类的头文件,随便敲一下键盘的空格键,类就会在CLASSVIEW中显示了 (2)在基于对话框的程序中,一按回车键,对话框就没了。把确定按纽的缺省属性前面的对勾去掉,重载OnOk()函数,在OnOk()函数里注释掉调用基类的OnOk()函数那行代码(3) 为什么我的VC6.0自动显示成员列表功能时有时无?删除该项目扩展名为.ncb文件,重新打开该项目。(4)我用SDK方式写的程序,为什么在我机子上不行?选菜单project-settings.在弹出的对话框中选Link,在最下边有Project Options,把里边的/subsystem:console删除就可以了(建错了工程类型)。(5)如何干净的删除一个类?先从workspace中的fileview中删除对应的.h和.cpp文件;再关闭项目,从实际的文件夹中删除对应的.h和.cpp文件;再删除.clw文件。 最后打开项目,rebuild all。(6)网络编程中的聊天室程序在为什么老是绑定失败?一般这种问题是端口设置在6000监听,正好和QQ的端口冲突,多换几个端口试试就可以了(7)网络程序只能在debug运行,release不行,提示错误 error LNK2001: unresolved external symbol _imp_WSAStartup8在Release下仍然需要添加Ws2_32.lib。(8)我画了一条直线但是当窗口最大化时或者被其他窗口覆盖时,直线不见了,只剩下直线原先存在的窗口这是因为窗口重绘,你可以在响应WM_PAINT的OnDraw()函数中添加画线的代码(9)在安装VC时未安装MSDN, 自己再用MSDN安装盘安装后在VC中按F1无法调用?修改注册表是最直接的方法,具体过程如下: 在HKEY_CURRENT_USER/Software/Microsoft/DevStudio/6.0/Help下增加Enable,Filename,State三个主键,注意其类型,含义如下: Enable 类型:DWORD,默认值是1,改变为0x00000001 Filename 类型:字符串改为c:program files.MSDev98helpMsdev.hlp State 类型:DWORD 默认值为0,改变为0x00000001 (10)如何在应用程序中打开一个超级链接?这个问题实际上很简单,只要使用ShellExecute API函数就行了(11)如何在没安装VC的环境下的机器也能打开运行用MFC编写的程序?把编译模式改为RELEASE,然后点工程-设置-常规,选择使用MFC作为静态连接库(12)如何自定义一个消息?1.#define WM_MY_MESSAGE WM_USER+1;2.头文件DECLARE_MESSAGE_MAP()前写消息响应函数原形;3.在 BEGIN_MESSAGE_MAP添加消息到函数的映射.4.写函数的实现部分(13)怎样改变VC+编辑器默认的颜色?工具选择格式,选中注释的颜色即可改变。 (14)复制了一段代码到当前工作空间里,可是代码排列很乱,如何调整?简单,按下鼠标左键拖动鼠标将代码选择上,同时按下键盘的ALT+F8键(15) _T(Option 1),_T()是什么意思?为什么要转换,直接用不可以? _T()自动将()内字符串转成unicode or Multibyte-character or SBCS (ASCII) 根据系统宏定义,为了将程序与vb等unicode 编码的程序交互,为了程序的国际化,为了.(16)如何改变视图的背景色? 你可以通过处理WM_ERASEBKGND消息来改变CView、CFrameWnd或CWnd对象的背景色(17)如何建立多文档? 为了加入对附加文档类型的支持,你可以在CWinApp派生类中创建和注册附加CmultiDocTemplate对象。将一个附加文档类型加入到MFC程序的一般步骤如下:用AppWizard来创建一个新的文档类和视图类。 用资源编辑器增加新的资源字串来支持新的文档类。要想知道关于文档样板字符串格式的更多内容,请参阅如何理解文档样板字符串。用资源编辑器增加附加的应用程序图标和菜单资源。注意,这些资源中每一个的ID都必须与在步骤2中创建的文档模板字符串的ID是相同的。这个ID被CmultiDocTemplate类用来识别与附加文档类型相关的资源。在应用程序的InitInstance()函数中,创建了另一个CMultiDocTemplate对象并且用CWinApp:AddDocTemplate()函数来注册。例如: CMultiDocTemplate* pDocTemplate2 = new CMultiDocTemplate( IDR_DOC2TYPE, RUNTIME_CLASS(CDoc2), RUNTIME_CLASS(CMDIChildWnd),RUNTIME_CLASS(CView2); AddDocTemplate(pDocTemplate2);最后,将定制的序列化和绘图代码加入到你的新文档和视图类中。 (18)如何使我的程序在启动时不创建一个新文档? 在程序的InitInstance中的ProcessShellCommand函数之前加入: cmdInfo.m_nShellCommand = CCommandLineInf:FileNothing(19) 如何获取应用程序的实例句柄?应用程序的实例句柄保存在CWinApp m_hInstance 中,可以这么调用AfxGetInstanceHandle获得句柄.(20)如何得到程序中其它类的指针(例如框架类,视类,文档类等等)?请看此贴: /club/showbbs.asp?id=184835 (21)为什么创建类的时候我不能直接生成从CDialogBar派生的类?ClassVizard的确没有提供这个功能,要从没有提供的类派生类的时候只能通过手动修改来完成(22)我用classwizard 给静态文本框加变量时,为什么里面没有它的ID?因为所有的静态文本控件的ID都被默认为了IDC_STATIC,你只需要修改这个ID号就可以了(23)获得各种目录信息Windows目录: Use GetWindowsDirectoryWindows下的system目录: Use GetSystemDirectorytemp目录: Use GetTempPath当前目录: Use GetCurrentDirectory(24)如果让控制台应用程序支持MFC类库? 可以在控制台应用程序中include 来引入mfc库,但是控制台应用程序缺省是单线程的,mfc是多线程的,为解决该矛盾,在project setting-c/c+ 选项,选择code generation,在use run-time library 下拉框中选择debug multithread。 (25) 我怎样才能在我的应用程序中循环浏览已经打开的文档?使用CDocTemplate中未公开的GetFirstDocPosition()和GetNextDoc()函数。 (26)才能在我的应用程序中循环浏览已经打开的视?使 用 CDocument 中 未 公 开 的 GetFirstViewPosition() 和 GetNextView() 函 数。(27)数PreCreateWindow是干什么用的?PreCreateWindow 允 许 你 在 调 用 CreateWindow 之 前 来 改 变 窗 口 属 性。(28)该怎样防止MFC在窗口标题栏上把文档名预置成应用程序名?在 PreCreateWindow 函 数 中 删 除 FWS_PREFIXTITLE 标 志 的 窗 口 样 式: cs.style &= FWS_PREFIXTITLE;(29) 我应该怎样防止MFC在窗口标题栏上添加文档名?在 PreCreateWindow 函 数 中 删 除 FWS_ADDTOTITLE 标 志 的 窗 口 样 式: cs.style &= FWS_ADDTOTITLE ;(30) 我应该如何改变视窗口的大小?因 为 视 窗 口 实 际 上 是 框 架 窗 口 的 子 窗 口,所 以 你 必 须 改 变 框 架 窗 口 的 大 小,而 不 是 改 变 视 窗 口。使 用 CView 类 中 的 GetParentFrame() 函 数 获 得 指 向 框 架 窗 口 的 指 针,然 后 调 用 MoveWindow() 函 数 来 改 变 框 架 的 大 小。这 会 使 变 尺 寸 的 视 充 满 框 架 窗 口。(31) 我有一无模式对话框。我怎样才能在窗口退出时删除CDialog对象?把“delete this”加 到 PostNcDestroy 中。这 主 要 用 在 需 要 自 动 删 除 对 象 的 场 合。(32) 为什么把“delete this”放在PostNcDestroy中而不是OnNcDestroy?OnNcDestroy 只 被 已 建 立 的 窗 口 调 用。如 果 建 立 窗 口 失 败 ( 如 PreCreateWindow ),则 没 有 窗 口 处 来 发 送 WM_NCDESTROY 消 息。PostNcDestroy 是 在 对 象 窗 口 被 完 全 删 除,在 OnNcDestroy 后,甚 至 在 窗 口 建 立 失 败 之 后 调 用 的。(33):如何为一个MFC应用程序添加ODBC功能? (1)在文件Stdafx.h文件末尾添加下面一行: #include / MFC ODBC database classes (2)在文本模式下编辑RC文件(利用File-Open As text 方式) 在下面的程序行(共有两处) #include l.chsafxprint.rc / printing/print preview resources 添加下一行: #include l.chsafxdb.rc / Database resources (34):数据库表修改后,如何快速更新一个绑定到表的CrecordSet记录集? 利用ClassWizard 中 Member Variables标签下选中记录集类后,利用UpdateColoumns和Bind All。 (35):怎么才能让窗口最大化显示啊? 我在框架的PreCreateWindow中 cs.styles|=WS_MAXIMIZE 不行啊, OnCreate 中 SetWindowLong(m_hWnd,GWL_STYLE,WS_MAXIMIZE);也不行啊上面两种方法都不行,要是窗口最大化显示,应改变ShowWindow()的参数,在InitInstance()中将m_pMainWnd-ShowWindow(.)改为m_pMainWnd-ShowWindow(SW_SHOWMAXINIZE);就Ok(36)怎么把别人程序中设计好的对话框放到自己的程序中?用VC打开自己的程序,选择资源视图;然后点FILE-OPEN菜单项,打开设计好的对话框的资源文件(后缀名为。RC),这里注意一定只打开后缀名为。RC的资源文件,然后在VC编辑器的文档区域就会有你刚打开的另一个程序的资源文件中资源的一个树型结构图,然后找到你要复制的对话框资源ID,鼠标左键按住ID号,然后拖放到资源视图中,这个时候你再看看自己程序的资源视图,是不是已经复制过来了。罗嗦了这么多,其实问题的关键是在一个编辑器中同时打开自己的项目和另一个项目的资源文件。.(40)VC里如何仅仅复制一个矩形区域里的代码?我们平时使用鼠标或键盘选择文本时,用的都是行选择,也就是鼠标往下移一行,这整行的内容都被选中,在有些情况下需要使用列选择,比如选择一个矩形块的内容,这在WORD里很容易实现,那么在VC里是否也有这个功能呢?回答是肯定的!毕竟都是一个公司的产品嘛。方法是:首先按下Alt键不放,然后用鼠标定位到你想要选择的文本处,按住鼠标左键不放,将光标拉到待选择的文本结束出,松开鼠标左键即可。如何抛出(throw)由CUserException派生的异常? 当我试图捕获(catch)一个派生类异常时,我得到以下错误error C2039:classCMyException: is not a member of CMyException classCMyException: undeclared identifier IsKindOf: cannot convert parameter 1 from int* to const struct CRuntimeClass* 你必需通过使用DECLARE_DYNAMIC()和IMPLEMENT_DYNAMIC()宏来使你的CMyException类可以动态地创建。CATCH宏希望能够得到关于被抛出类的运行时刻信息。 异常类一定要从CUserException中派生出来吗? 不,CUserException中的User仅仅指用户产生的异常。而把它当作你所能派生的唯一异常是种常见的误解。 如何从HDC建立一个CDC类? 有时Windows API将会给你一个DC句柄,你可以通过它建立一个CDC类。例如:下拉式列表、组合框和按钮。通过hDC你将接收到绘制消息。下面是将HDC转换成你更熟悉的CDC的程序段。你也可以将该技巧用在其他任何MFC类和Windows句柄的转换中。 void MyODList:DrawItem(LPDRAWITEMSTRUCT lpDrawItem) CDC myDC; myDC.Attach(lpDrawItem-hDC); /在此插入其他需要的代码。 /如果你不将句柄分离,它将被删除,从而导致问题。 myDC.Detach(); 另一个方法是调用CDC类的FromHandle方法: CDC * pDC = CDC:FromHandle(lpDrawItem-hDC); 目前还不清楚哪种方法更优越使用FromHandle()的错误也许会更少些,因为它不要求你分离(detach)句柄。 如何从磁盘上读取256色位图文件? 当前,MFC并不支持直接读取和显示DIB文件和BMP文件。然而,有很多样例应用程序能够说明如何完成该项任务。第一个例子是MFC样例程序DIBLOOK。样例MULTDOCS用DIBLOOK提供的相同源代码来读取并显示DIB文件和BMP文件。其他两个VC+中附带的例子是SDK软件包中的DIBVIEW程序和SHOWDIB程序。 如何改变一个视图的大小? 通常,你可以调用函数MoveWindow()来改变窗口的大小。在用MFC库开发的应用程序中, 视图是被框架窗口所围绕的一个子窗口。为了改变一个视图的大小,你可以通过调用函数GetParentFrame()来得到框架窗口的指针,然后调用函数MoveWindow()来改变父窗口的大小。当父框架窗口改变大小时,视图也会自动地改变大小来适应父窗口。 如何改变一个CFormView的大小? 要想详细了解的话,你可以看有关Visual C基础知识的文章Q98598 Using CFormView in SDI and MDI Applications。基本上,在从CFormView类派生出来的类中,你必须覆盖函数OnInitialUpdate()。其他有关建立CFormView的细节问题,可以从该文章中获得。 在类ClikethisView中声明如下函数: virtual void OnInitialUpdate(); 在ClikethisView的代码中,函数如下: void ClikethisView:OnInitialUpdate() /使窗口与主对话框同样大小 CFormView:OnInitialUpdate(); GetParentFrame()-RecalcLayout(); ResizeParentToFit( /*FALSE*/ ); 如何使用一个文档模板的新视图? 在用AppWizard创建的应用程序中,你有两种选择:改变当前视图的派生关系或者建立一个新视图并且在你的MDI程序中同时利用新视图和原先的视图。 为了创建一个新视图,你可以用ClassWizard由CView派生一个新的类。当新类创建以后,利用新视图或修改由AppWizard提供的视图,两者的步骤是相同的。 修改视类的头文件,从而将所有对CView类的引用改名为你所想要的名称。本例中的类由CScrollView派生而来。通常,这个步骤包括对类的改变,视类将由如下方式派生而来: class CMyView : public CScrollView 修改视类的实现文件,从而将所有对CView的引用改名为你所想要的名称。这包括将IMPLEMENT_DYNCREATE那一行的语句改为: IMPLEMENT_DYNCREATE(CMyView, CScrollView) 将BEGIN_MESSAGE_MAP那一行的语句改为: BEGIN_MESSAGE_MAP(CMyView, CScrollView) 并且将其他所有的CView改成CScrollView. 假如你修改的视图是由AppWizard生成的,那么就不需要作更多的修改了。而如果你在创建一个新视图,先在CWinApp:InitInstance()函数中找到对AddDocTemplate()函数的调用。AddDocTemplate()函数的第三个参数是RUNTIME_CLASS(CSomeView),用CMyView来代替CSomeView,就可以将当前视图改为新视图。在MDI应用程序中,你可以增加第二个AddDocTemplate()函数调用来使用多视图类型,将RUNTIME_CLASS(CSomeView)改为RUNTIME_CLASS (CMyView)。 要想获得更多的信息请参阅Q99562中相关文章Switching Views in a Single Document Interface Program 。 如何改变视图的背景色? 你可以通过处理WM_ERASEBKGND消息来改变CView、CFrameWnd或CWnd对象的背景色。请看如下的程序段: BOOL CSampleView:OnEraseBkgnd(CDC* pDC) / 设置所要求背景色的刷子 CBrush backBrush(RGB(255, 128, 128); / 保存旧刷子 CBrush* pOldBrush = pDC-SelectObject(&backBrush); CRect rect; pDC-GetClipBox(&rect); / 擦除所需的区域 pDC-PatBlt(rect.left, rect.top, rect.Width(), rect.Height(), PATCOPY); pDC-SelectObject(pOldBrush); return TRUE; 而我则用如下方法解决这个问题: HBRUSH dlgtest:OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) switch (nCtlColor) case CTLCOLOR_BTN: case CTLCOLOR_STATIC: pDC-SetBkMode(TRANSPARENT); case CTLCOLOR_DLG: CBrush* back_brush; COLORREF color; color = (COLORREF) GetSysColor(COLOR_BTNFACE); back_brush = new CBrush(color); return (HBRUSH) (back_brush-m_hObject); return(CFormView:OnCtlColor(pDC, pWnd, nCtlColor); 如何得到当前视图? 最佳方法是将视图当作一个参数来传递。如果不能这样做,但你确信它是当前激活文档和当前激活视图的话,你也可以得到该视图。具体细节见Visual C+文章Q108587Get Current CDocument or CView from Anywhere。 简单说来,用: (CFrameWnd*) AfxGetApp()-m_pMainWnd)-GetActiveDocument() 和: (CFrameWnd*)(AfxGetApp()-m_pMainWnd)-GetActiveView() 来得到文档和视图。一个好的方法是将它们封装在你的CMyDoc和CMyView类的静态函数中,并且核对它们是否属于正确的RUNTIME_CLASS。然而,假如这个视图不是当前激活视图或者你在运行OLE本地激活,这样将不成功。 如何在一个文档中建立多个视图? CDocTemplate:CreateNewFrame()函数创建MFC MDI应用程序中的文档的附加视图。为了调用该函数,要指定一个指向CDocument对象(指将为之建立视图的文档)的指针和一个指向可从中复制属性的框架窗口的指针。一般情形下,该函数的第二个参数为NULL。 当应用程序调用函数CreateNewFrame()时,该函数就创建一个框架窗口和在该窗口内的视图。框架窗口和它的视图的类型由与CreateNewFrame()函数调用指定的文档相关的文档摸板(CDocTemplate)决定。 Visual C+中的CHKBOOK MFC样例程序也演示了如何为文档建立附加的框架和视图。检查CHKBOOK.CPP文件中的CChkBookApp:OpenDocumentfile()函数。 另一个用函数CreateNewFrame()的例子是MULTVIEW样本程序。 CreateNewFrame()函数建立了一个框架和一个视图,而不仅仅是一个视图。假如CreateNewFrame()函数不能完全符合你的需要,可参考CreateNewFrame()函数的源程序来了解对建立结构和视图所必须的步骤。 如何在MDI程序中得到所有的视图? 你必须用一些文档中没有记载的函数: CDocument:GetFirstViewPosition(); / DOCCORE.CPP CDocument:GetNextView(); / DOCCORE.CPP CMultiDocTemplate:GetFirstDocPosition(); / DOCMULTI.CPP CMultiDocTemplate:GetNextDoc(); / DOCMULTI.CPP 你还需要与CWinApp的成员m_templateList打交道。 注意:在MFC 版本4.0中已改变。现在已经有一个叫CDocManager的类可以帮助你显示所有的视图和文档。请参考MFC Internals获得更详细的信息。 如何建立一个可用鼠标拉动的CScrollView类 在CIS上从MSMFC库下载AUTOSV.LZH。这个程序告诉你如何实现一个辅助消息循环来管理鼠标的活动,并提供了钩挂来对代码进行定制。这是一个免费软件。 一定要用视图/文档结构吗? MFC并不一定要求你使用文档/视图结构。查看HELLO、 MDI和HELLOAPP例子它们就没有用那种结构。大多数MFC特性都可以在非文档/视图应用程序中得到运用。但是当你不用文档 / 视图结构时,你确实会失去一些特性,例如打印预览和许多OLE特性。 如何得到当前文档? 请详细参阅如何得到当前视图?章节。 文档何时被析构? 在SDI程序中,程序退出后文档就被删除。在MDI程序中,与该文档相关的最后一个视图关闭时文档就被删除。为了在SDI和MDI中同时用这个文档,你应该在虚函数DeleteContents()函数中删除该文档的数据,而不是在析构器中。 如何建立多文档? 为了加入对附加文档类型的支持,你可以在CWinApp派生类中创建和注册附加CmultiDocTemplate对象。这种方法已经在MULTDOCS样例程序中得以说明。将一个附加文档类型加入到MFC程序的一般步骤如下: 用AppWizard来创建一个新的文档类和视图类。 用资源编辑器增加新的资源字串来支持新的文档类。要想知道关于文档样板字符串格式的更多内容,请参阅如何理解文档样板字符串。 用资源编辑器增加附加的应用程序图标和菜单资源。注意,这些资源中每一个的ID都必须与在步骤2中创建的文档模板字符串的ID是相同的。这个ID被CmultiDocTemplate类用来识别与附加文档类型相关的资源。 在应用程序的InitInstance()函数中,创建了另一个CMultiDocTemplate对象并且用CWinApp:AddDocTemplate()函数来注册。例如: CMultiDocTemplate* pDocTemplate2 = new CMultiDocTemplate( IDR_DOC2TYPE, RUNTIME_CLASS(CDoc2), RUNTIME_CLASS(CMDIChildWnd),RUNTIME_CLASS(CView2); AddDocTemplate(pDocTemplate2); 最后,将定制的序列化和绘图代码加入到你的新文档和视图类中。 如何得到一个打开文档的列表? 下面的程序段指明如何得到用CDocTemplate对象建立的所有文档的指针列表。 下面的程序段中,CMyApp由CWinApp派生而来。变量m_templateList是一个CPtrList对象,它是CwinApp的成员变量,包含一个所有文档模板指针的列表。文档模板函数GetFirstDocPosition()和GetNextDoc()被用来在文档模板列表中进行迭代来得到每一个文档模板。 void CMyApp:GetDocumentList(CObList * pDocList) ASSERT(pDocList-IsEmpty(); POSITION pos = m_templateList.GetHeadPosition(); while (pos) CDocTemplate* pTemplate = (CDocTemplate*)m_templateList.GetNext(pos); POSITION pos2 = pTemplate-GetFirstDoc

温馨提示

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

评论

0/150

提交评论