对VC编程中常见的问题的一些总结与分析_第1页
对VC编程中常见的问题的一些总结与分析_第2页
对VC编程中常见的问题的一些总结与分析_第3页
对VC编程中常见的问题的一些总结与分析_第4页
对VC编程中常见的问题的一些总结与分析_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

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

文档简介

对 VC 中常见的问题的一些总结与分析 1 如何自定义消息如何自定义消息 1 手工定义消息 可以这么写 define WM MY MESSAGE WM USER 100 MS 推荐的至少是 WM USER 100 2 写消息处理函数 用 WPARAM LPARAM 返回 LRESULT LRESULT CMainFrame OnMyMessage WPARAM wparam LPARAM lParam temp 目录 Use GetTempPath 加入你的处理函数 irectory 10 如何限制窗口的大小如何限制窗口的大小 也就是 FixedDialog 形式 Windows 发送 WM GETMAXMININFO 消息来跟踪 响应它 在 OnGetMAXMININFO 中写代码 11 如何使窗口不可见 如何使窗口不可见 很简单 用 SW HIDE 隐藏窗口 可以结合 FindWindow ShowWindow 控制 2 如何通过代码获得应用程序主窗口的指针如何通过代码获得应用程序主窗口的指针 主窗口的指针保存在 CWinThread m pMainWnd 中 调用 AfxGetMainWnd 实现 AfxGetMainWnd ShowWindow SW SHOWMAXMIZED 使程序最大化 2 确定应用程序的路径确定应用程序的路径 Use GetModuleFileName 获得应用程序的路径 然后去掉可执行文件名 Example TCHAR exeFullPath MAX PATH MAX PATH 在 API 中定义了吧 好象是 128 GetModuleFileName NULL exeFullPath MAX PATH 3 如何在程序中获得其他程序的图标如何在程序中获得其他程序的图标 两种方法 1 SDK 函数 SHGetFileInfo 或使用 ExtractIcon 获得图标资源的 handle 2 SDK 函数 SHGetFileInfo 获得有关文件的很多信息 如大小图标 属性 类型等 Example 1 在程序窗口左上角显示 NotePad 图标 void CSampleView OnDraw CDC pDC if SHGetFileInfo T c pwin95 notepad exe 0 要做的事 AfxGetApp EndWaitCursor 72 我在我在 MDI 框架中有个框架中有个 form 视窗 它有个取消按钮 我需要当用户按取消按钮时可关视窗 它有个取消按钮 我需要当用户按取消按钮时可关 闭闭 form 视窗 我应该如何关闭该文档视窗 我应该如何关闭该文档 调用 OnCloseDocument 函数 73 如何访问桌面窗口如何访问桌面窗口 静态函数 CWnd GetDesktopWindow 返回桌面窗口的指针 下例说明了 MFC 函数 CFrameWnd BeginModalStae 是如何使用该函数进入内部窗口列表的 void CFrameWnd BeginModalState first count all windows that need to be disabled UINT nCount 0 HWND hWnd GetWindow GetDesktopWindow GW CHILD while hWnd NULL if IsWindowEnabled hwnd RGB 函数接收三个 0 255 数值 一个代表红色 一个代表绿色 一个代表蓝色 在上面的例 子中 红色和蓝色值都为 0 所以在该颜色中没有红色和蓝色 绿色为最大值 255 所以该颜 色为绿色 0 0 0 为黑色 255 255 255 为白色 另一种初始化 COLORREF 的方法如下所示 CColorDialog colorDialog COLORREF color if colorDialog DoModal IDOK color colorDialog GetColor 这段代码使用了 MFC 中的颜色对话框 它需要文件 75 AppWizard 所产生的所产生的 STDAFX 文件是干什么用的文件是干什么用的 它主要是协助产生预编译头文件的 通常你是不需要修改它的 76 我在我的程序中是了我在我的程序中是了 CDWordArray 我向它添加了约 我向它添加了约 10 000 个整数 这使得它个整数 这使得它 变得非常非常慢 为什么会这么糟变得非常非常慢 为什么会这么糟 CDWordArray 是很好用的 只是因为你没有指定数组的最大尺寸 因此 当你添加新元素时 该类会从堆中重新分配空间 不幸的是 该类会在每次插入新元素时都为数组重新分配空间 如果你向它添加了很多新元素 所有这些分配和复制数组的操作会就会使它变慢 解决该问题 的方法是 你可以使用 SetSize 函数的第二个参数来改变这种重新分配的频率 例如 如果你 把该参数设置为 500 则每次数组空间超出时它才重新分配并添加 500 个新空间 而不是 1 个 这样一来 你就可以不用重新分配而添加了另外 499 个元素空间 这也会大大提高程序 的运行速度 77 我该如何改变我该如何改变 MDI 框架窗口的子窗口的大小以使在窗口以一定的大小打开框架窗口的子窗口的大小以使在窗口以一定的大小打开 在视中的 OnInitialUpdate 函数中调用 GetParentFrame 函数 GetParentFrame 会返回一 指向一保存有该视的框架窗口的指针 然后调用在框架窗口上调用 MoveWindow 78 在我的程序的某些部分 我可以调用在我的程序的某些部分 我可以调用 MessageBox 函数来建立一个信息对话框 例函数来建立一个信息对话框 例 如在视类中 但是 在其它部分我却不能 如文档类中 为什么 我怎样才能在我的应用程序如在视类中 但是 在其它部分我却不能 如文档类中 为什么 我怎样才能在我的应用程序 类中建立一个信息对话框 类中建立一个信息对话框 MessageBox 函数来自 CWnd 类 所以你只能在从 CWnd 继承的类 如 CView 中调用它 但是 MFC 也提供了 AfxMessageBox 函数 你可以在任何地方调用它 79 我需要在我的程序中设置全局变量 以使文档中的所有类都能访问 我应该吧它放到哪我需要在我的程序中设置全局变量 以使文档中的所有类都能访问 我应该吧它放到哪 儿儿 把该变量放到该应用程序类的头文件中的 attribute 处 然后 在程序的任何地方 你都可以 用下面的方法来访问该变量 CMyApp app CMyApp AfxGetApp app MyGlobalVariable 80 我听说我听说 MFC 可以发现内存漏洞 我怎样使用该特性可以发现内存漏洞 我怎样使用该特性 如果你在 Debug 菜单中的 Go 选项 不是 Project 菜单中的 Execute 选项 来运行你的应用程 序 MFC 应该在程序终止时报告内存漏洞 如果没有 那么试试运行 MFC Tracer 工具程序 在 VC 程序组中 并启动跟踪 然后返回应用程序 81 我怎样才能在我的应用程序中循环浏览已经打开的文档我怎样才能在我的应用程序中循环浏览已经打开的文档 使用 CDocTemplate 中未公开的 GetFirstDocPosition 和 GetNextDoc 函数 82 才能在我的应用程序中循环浏览已经打开的视才能在我的应用程序中循环浏览已经打开的视 使用 CDocument 中未公开的 GetFirstViewPosition 和 GetNextView 函数 83 函数函数 PreCreateWindow 是干什么用的是干什么用的 PreCreateWindow 允许你在调用 CreateWindow 之前来改变窗口属性 84 该怎样防止该怎样防止 MFC 在窗口标题栏上把文档名预置成应用程序名在窗口标题栏上把文档名预置成应用程序名 在 PreCreateWindow 函数中删除 FWS PREFIXTITLE 标志的窗口样式 cs style 85 我应该怎样防止我应该怎样防止 MFC 在窗口标题栏上添加文档名在窗口标题栏上添加文档名 在 PreCreateWindow 函数中删除 FWS ADDTOTITLE 标志的窗口样式 cs style 86 我应该如何改变视窗口的大小我应该如何改变视窗口的大小 因为视窗口实际上是框架窗口的子窗口 所以你必须改变框架窗口的大小 而不是改变视窗口 使用 CView 类中的 GetParentFrame 函数获得指向框架窗口的指针 然后调用 MoveWindow 函数来改变框架的大小 这会使变尺寸的视充满框架窗口 87 我有一无模式对话框 我怎样才能在窗口退出时删除我有一无模式对话框 我怎样才能在窗口退出时删除 CDialog 对象对象 把 delete this 加到 PostNcDestroy 中 这主要用在需要自动删除对象的场合 88 为什么把为什么把 delete this 放在放在 PostNcDestroy 中而不是中而不是 OnNcDestroy OnNcDestroy 只被已建立的窗口调用 如果建立窗口失败 如 PreCreateWindow 则没有 窗口处来发送 WM NCDESTROY 消息 PostNcDestroy 是在对象窗口被完全删除 在 OnNcDestroy 后 甚至在窗口建立失败之后调用的 89 File 菜单中的菜单中的 MRU 列表是从哪儿来的 列表中的名字放在哪儿了 我怎样才能改变列表是从哪儿来的 列表中的名字放在哪儿了 我怎样才能改变 列表中项目的最大值 列表中项目的最大值 在应用程序类的 InitInstance 函数中对 LoadStdProfileSettings 的调用中 该调用接受一个 参数 在缺省情况下如果没有传递值则为 4 MRU 文件名是从 INI 文件中调用的 如果你有 带有 ID FILE MRU FILE1 的 ID 的菜单选项 它会为调入的 MRU 列表所替换 如果你改变 传递给 LoadStdProfileSettings 的数值 最大为 16 则你就改变了所装如文件名的最大值 90 我在菜单中添加了新的项 但是 当我选该项时 在状态栏上没有出现任何提示信息 我在菜单中添加了新的项 但是 当我选该项时 在状态栏上没有出现任何提示信息 为什么为什么 打开资源文件中的菜单模板 打开新菜单选项的属性对话框 在对话框的底部的 Prompt 编辑 框中 你可以如下指定状态栏上的提示信息和工具栏上的提示信息 如果你已经建立的工具栏按 钮 Status bar string nFlying tag 91 我怎样才能在应用程序的缺省系统菜单中加上一些东西我怎样才能在应用程序的缺省系统菜单中加上一些东西 系统菜单与其它菜单类似 你可以添加或删除项目 这需要使用 CMenu 类的成员函数 下面 的代码在你的系统菜单后面添加一个新菜单项 CMenu sysmenu sysmenu m pMainWnd GetSystemMenu FALSE sysmenu AppendMenu MF STRING 1000 xxx 参见 MFC 帮助文件中的 CMenu 类 92 我建立了一个对话框 但是当我显示该对话框时 第一个编辑框总是不能获得焦点 我我建立了一个对话框 但是当我显示该对话框时 第一个编辑框总是不能获得焦点 我 必须单击它来使它获得焦点 我怎样才能使第一个编辑框在对话框打开时就获得焦点必须单击它来使它获得焦点 我怎样才能使第一个编辑框在对话框打开时就获得焦点 打开资源编辑器中的对话框模板 在 Layout 菜单中选择 Tab Order 选项 按你的需求单击 对话框中的控制来重新排列这些控制的 tab 顺序 93 我怎样才能使一个窗口具有我怎样才能使一个窗口具有 always on top 特性特性 在调用 OnFileNew 后 在你的 InitInstance 函数中加上下面的代码 m pMainWnd SetWindowPos 94 我要为我的我要为我的 form view 添加文档模板 我先建立了对话框模板 然后使用添加文档模板 我先建立了对话框模板 然后使用 ClassWizard 建立了基于建立了基于 CFormView 的新类 它也是从的新类 它也是从 CDocument 继承来的 我还继承来的 我还 建立了相应的资源并在建立了相应的资源并在 InitInstance 中添加了新的文档模板 但是 当我试图运行该程序时 中添加了新的文档模板 但是 当我试图运行该程序时 出现了出现了 Assertion 信息 为什么信息 为什么 form 的对话框模板需要些特殊设置以便可用于 CFromView 确保这些设置的最简单方法是使 用 AppWizard 来建立 CFormView 应用程序 并查看 AppWizard 所建立的对话框模板所选 择的 Styles Properties 你会发现该对话框模板具有下列样式 没有标题栏 不可见和 Child 把你的 form view 的对话框属性变成这样就可以了 95 我在一对话框中有一列表框 我需要我在一对话框中有一列表框 我需要 tabbed 列表框中的项目 但是 当我处理含有列表框中的项目 但是 当我处理含有 tab 字符字符 用用 AddString 添加的添加的 的列表项时 的列表项时 tab 被显示成小黑块而没有展开 哪儿出错了被显示成小黑块而没有展开 哪儿出错了 在对话框模版中 打开列表框的属性 确保选择了 Use Tabstops 样式 然后 确保在对话 框类中 OnInitDialog 函数中调用 SetTabStops 96 我建立了一个应用程序 并使用了我建立了一个应用程序 并使用了 CRecordset 类 但是 当我运行该程序时 它试类 但是 当我运行该程序时 它试 图要访问数据库 并给出图要访问数据库 并给出 Internal Application Error 对话框 我应该怎样做对话框 我应该怎样做 通常情况下 当你的程序中向数据库发送信息的 SQL 语句出现问题时才出现该对话框 例如 参见下面的例子 set m strFilter ZipCode 27111 如果 ZipCode 列被定义为字符串时不会出现问题 如果定义为 long 则会出现 Internal Application Error 对话框 这是由于类型不匹配的缘故 如果你删除 27111 的单引号 则不 会出现问题 当你看到 Internal Application Error 时 最好检查一下试图要发送给数据库 的 SQL 语句 97 我用我用 ClassWizard 建立了一个类 但是 我把名字取错了 我想把它从项目中删除 建立了一个类 但是 我把名字取错了 我想把它从项目中删除 应该如何做应该如何做 在 ClassWizard 对话框关闭后 用文件管理器删除新类的 H 和 CPP 文件 然后打开 ClassWizard 它会提示丢失了两个文件 并询问你该如何做 你可以选择从项目中删除这两 个问的按钮 98 当我打开应用程序中的窗口时 我要传递该窗口的矩形尺寸 该矩形指定了窗口的外围 大小 但是当我调用 GetClientRect 时 所得到的尺寸要比所希望的值要小 因为工具栏和窗 口边框的缘故 有其它方法来计算窗口的尺寸吗 参见 CWnd CalcWindowRect 99 我在文档类中设置了一个整型变量 但是 当我试图把该变量写入我在文档类中设置了一个整型变量 但是 当我试图把该变量写入 Serialize 函数中函数中 的的 archive 文件中时 出现了类型错误 而文档中的其它变量没有问题 为什么文件中时 出现了类型错误 而文档中的其它变量没有问题 为什么 archive 类只重载某些类型的 和 GetMenuString 0 szText MAX PATH MF BYPOSITION 然后 获得菜单项文本的高度 HFONT hFontOld HDC hDC hDC GetDC NULL hFontOld HFONT SelectObject hDC hFontMenu GetTextExtentPoint32 hDC szText lstrlen szText SelectObject hDC hFontOld ReleaseDC NULL hDC 此时 size cy 即为高度 size cx 为宽度 你可以给菜单加上自定义的高度和宽度 通过比 较 我发现宽度为 4 比较合适 101 改变改变 LVIS SELECTED 的状态颜色的状态颜色 我想将 CListCtrl 项和 CTreeCtrl 项在 LVIS SELECTED 状态时的颜色变灰 方法一 查找函数 CustomDraw 它是 IE4 提供的公共控制 允许有你自己的代码 方法二 生成一个 draw 控件 然后在 DrawItem 中处理文本颜色 102 如何只存储文档的某一部分如何只存储文档的某一部分 我只想存储文档的某一部分 能否象使用文件一样使用文档 也就是有定位函数 将每个 CArchive 类设置为 CFile 类的派生类 这样你就能使用 Seek 等成员函数 103 保存工具条菜单有保存工具条菜单有 bug 吗吗 使用浮动菜单条时 SaveBarState 和 LoadBarState 出现了问题 如果菜单是浮动的 重起应用 程序时它会出现在左上角 而它固定在屏幕其它位置时 下一次启动就会出现在该位置 这是什么 原因 你试试这个 PToolBar Create this ID MYTOOLBAR 你的工具条需要包括 id 而不是象默认的工具条那样 104 Tip of the day 的的 bug 我创建了一个简单的 mdi 应用程序 使用 BSF 自定义的文档扩展名 作为它的文档我保存一个 foo bsf 文档后 可以在资源管理器中双击该文件打开 mdi 应用程序同时打开 foo bsf 文档 但 当我给 mdi 应用程序加上 a tip of the day 组件之后 从资源管理器中双击 foo bsf 后 就会给 我一个警告 ASSERT IsWindow m hWnd 然后 mdi 应用程序就死那了 当从 dde 启动应用程序 例如 双击相关文档 时 Tip of the Day 是有 bug 的 你可以看看函 数 ShowTipAtStartup 它在 InitInstance 中调用 可以看到 tip of the day 作为一个模式 对话框显示 在处理其它消息时它一直进行消息循环你可心修改 ShowTipAtStartup 使其从 dde 启动时不出现 tip of the day void CTipOfApp ShowTipAtStartup void CG This function added by Tip of the Day component CCommandLineInfo cmdInfo ParseCommandLine cmdInfo if cmdInfo m bShowSplash if dlg m bStartup dlg DoModal 如果还有其它 bug 你可以设定 cmdInfo m nShellCommand 的过滤 105 如何可以让我的程序可以显示在其它的窗口上面如何可以让我的程序可以显示在其它的窗口上面 让用户选择 总是在最上面 最好是在系统菜单里加入一个选项 可以通过修改 WM SYSCOMMAND 消息来发送用户的选择 菜单的命令标识 id 会作为一个参数传给 OnSysCommand 要定义标识 id 将如下代码加入到 CMainFrame CPP 中 define WM ALWAYSONTOP WM USER 1 将 总在最上面 的菜单项加入到系统菜单中 将如下代码加入到函数 CMainFrame OnCreate 中 CMenu pSysMenu GetSystemMenu FALSE pSysMenu AppendMenu MF SEPARATOR pSysMenu AppendMenu MF STRING WM ALWAYSONTOP 使用 ClassWizard 加入对 WM SYSCOMMAND 消息的处理 你应该改变消息过滤器 使用系 统可以处理这个消息 void CMainFrame OnSysCommand UINT nID LPARAM lParam switch nID case WM ALWAYSONTOP if GetExStyle GetSystemMenu FALSE CheckMenuItem WM ALWAYSONTOP MF UNCHECKED else SetWindowPos GetSystemMenu FALSE CheckMenuItem WM ALWAYSONTOP MF CHECKED break default CFrameWnd OnSysCommand nID lParam 106 如何控制窗口框架的最大最小尺寸如何控制窗口框架的最大最小尺寸 要控制一个框架的的最大最小尺寸 你需要做两件事情 在 CFrameWnd 的继承类中处理消息 WM GETMINMAXINFO 结构 MINMAXINFO 设置了整个窗口类的限制 因此记住要考虑工具 条 卷动条等等的大小 最大最小尺寸的象素点 示例 define MINX 200 define MINY 300 define MAXX 300 define MAXY 400 void CMyFrameWnd OnGetMinMaxInfo MINMAXINFO FAR lpMMI CRect rectWindow GetWindowRect CRect rectClient GetClientRect get offset of toolbars scrollbars etc int nWidthOffset rectWindow Width

温馨提示

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

评论

0/150

提交评论