回 帖 发 新 帖 刷新版面

主题:对VC++一些常见问题的整理(提问前请看)

这个帖子也是从网上拿来的,只希望提问问题时能先看看本帖,也许你的问题在这里会得到解决。

(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__WSAStartup@8

在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\....\MSDev98\help\Msdev.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)如何得到程序中其它类的指针(例如框架类,视类,文档类等等)?

请看此贴:   http://www.programfan.com/club/showbbs.asp?id=184835  


(21)为什么创建类的时候我不能直接生成从CDialogBar派生的类?

ClassVizard的确没有提供这个功能,要从没有提供的类派生类的时候只能通过手动修改来完成

(22)我用classwizard 给静态文本框加变量时,为什么里面没有它的ID??

因为所有的静态文本控件的ID都被默认为了IDC_STATIC,你只需要修改这个ID号就可以了

(23)获得各种目录信息
Windows目录: Use "GetWindowsDirectory"
Windows下的system目录: Use "GetSystemDirectory"
temp目录: 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.chs\afxprint.rc" // printing/print preview resources 

添加下一行: 

#include "l.chs\afxdb.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键不放,然后用鼠标定位到你想要选择的文本处,按住鼠标左键不放,将光标拉到待选择的文本结束出,松开鼠标左键即可。
(41)

回复列表 (共27个回复)

沙发

顶,好贴

板凳

这么好的东西收藏了.没人看真的是很可惜呀.

3 楼

我会继续添加.....
(37) 如何创建固定大小的窗口?
在基于非对话框的程序里,通常的窗口总是能够改变其大小的,但我想让用户不能够改变窗口的大小,最简单的方法如何做?

很简单,你在主框架类的PreCreateWindow设置一下就OK了:
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
 if( !CFrameWnd::PreCreateWindow(cs) )
  return FALSE;
 // TODO: Modify the Window class or styles here by modifying
 //  the CREATESTRUCT cs

         cs.style &= ~WS_SIZEBOX;//一句话即可;

 return TRUE;
}  

(38)怎么让窗口随鼠标拖动而跟着移动?

我们知道在标题栏拖动鼠标窗口会跟着一起移动,但在窗口客户区内拖动鼠标窗口是不会跟着移动的(除非你在程序里做了一些小动作^_^),或许你马上会想到:响应WM_MOUSEMOVE时用MoveWindow或者SetWindowPos来移动窗口不就OK了嘛,是真的吗?其实这种方法是不可取的!要知道,你不得不花“大量”的时间来计算机窗口移动后的位置,这种问题不应该由你来做而应该让Windows自己来完成,Windows确实也能够做得到!只要你发送一条消息给指定的窗口一切就OK:
case WM_LBUTTONDOWN:
  ....
 if(!IsZoomed(hwnd)) //窗口最大化移动就没什么意思了^_^,先判断一下
 {
   SendMessage(hwnd,WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(LOWORD(lParam),HIWORD(lParam)));
  
 }
.......

4 楼

好,我顶顶要顶一下

5 楼

好帖,顶一下

6 楼

很有用,谢谢

7 楼


真的很不错,以后要陆续增加!!

8 楼

大家认为有好的也可以添加进来啊(最好原创)

9 楼

Good,收了。lz辛苦啦!

10 楼

提议非常好!大家都来添加,这毕竟是自己经历的,有很深的体会和理解。

我来回复

您尚未登录,请登录后再回复。点此登录或注册