现在的位置: 首页 > 综合 > 正文

[FAQ]VC常见问题★强烈推荐

2018年02月08日 ⁄ 综合 ⁄ 共 5279字 ⁄ 字号 评论关闭

 

发信站: BBS 数字潮甬站 (Mon Sep 27 20:01:49 2004), 转信

MSDN和google永远是最好的学习工具,遇见不会或不太清楚的问题时请先去精华区

查找一下相关内容。

[IDE下载和安装]                                                                                                         
1、VC和MSDN的下载
    强烈建议安装英文版!
    
2、安装程序制作工具下载
    InstallShield系列,可以去缘网下载。

3、VC插件的下载
    推荐Visual Assist,其良好的提示功能使开发程序方便很多
    似乎中文版不能使用 Visual Assist,vs没有key,但有破解

[IDE环境使用]                                                                                                           

1、如何彻底删除一个类:
    选择FileView标签把相应的.cpp和.h删除,然后关闭工程,删掉.clw文件,
如果愿意,还可以把没用的.cpp和.h文件从硬盘删除。重新进入工程,按Ctrl+W,
会提示不存在.clw文件,是否重新建立该文件,选确定后,选择全部文件,再按OK。

2、VC的函数提示功能没了,如何使之恢复显示?
    关掉工程,删掉.ncb文件。重新打开工程,一切OK了

3、debug和release的区别,及如何设置
    编译在VC++中有两种模式,一种是Release Build另一种是Debug Build。它们之

间的区别在于,Release Build不对源代码进行调试,不考虑MFC的诊断宏,使用的是MFC

Release库,编译十对应用程序的速度进行优化,而Debug Build则正好相反,它允许对源

代码进行调试,可以定义和使用MFC的诊断宏,采用MFC Debug库,对速度没有优化。所以

我们应该在Debug模式下开发应用程序,然后在Release模式下发布应用程序。在我们的工

程文件夹下会有一个Debug文件夹和一个Release文件夹分别存放输出文件和中间文件。
    在VC中菜单中选择Build->Set Active Configuration,里面可以选择win32

Release或win32 Debug,来设置目前程序的模式为release版本或debug版本

[推荐网站]                                                                                                              

VisualC/MFC开发指南 http://www.vchelp.net
编程天堂无数源码    http://www.codeguru.com
程序员大本营        http://www.csdn.net
VC在线知识库        http://www.vckbase.com
VCCode              http://www.vccode.com
CodeGuru第二        http://www.codeproject.com
Windows 编程杂志    http://www.wdj.com
MSDN在线查找帮助    http://msdn.microsoft.com
系统编程            http://www.sysinternals.com
中文MSDN            http://www.microsoft.com/china/msdn/default.mspx

[编译和链接]                                                                                                            

1、编译:
Q:unexpected end of file while looking for precompiled header directive

A:
(1)使用MFC,未包含stdafx.h

(2)函数或成员函数的"{""}"未匹配

(3)预编译指令未匹配

(4)在编译选项中选择了using precompiled header,而.cpp没有直接或者间接

#incldue 相应的头文件

其实(1)就是(4)的一个特例,只不过一般编写程序的时候很少用到precompiled

header,而MFC程序,哦,其实只要使用AppWizard建的C++工程都会自动使用这个

功能,造成高出错率。

Q:Error spawning c1.exe
A:tool->Option->Directories ,select Executable files,add your executable

filepath,such as :F:/Program Files/Microsoft Visual Studio/VC98/BIN

Q:Cannot open precompiled header file: 'Debug/server.pch'
A: rebuild all,或者不用预编译头文件

2、链接
一般link出错的类型如下:

(1).关于类,比如类中成员函数声明而未实现,或者类的静态成员变量在.cpp文件中

没有声明

(2).使用开发环境中工程类型错误,比如应用console工程的,建了个win
application工程

(3).有些类库的使用需要加载.lib文件,在VC中可以通过#pragma comment(lib,

"lib direction")来解决,或者在project->setting->link->input中填入该lib文
件的路径和名字
(4).变量定义冲突,解决方法一般为在.h中声明该变量,而在.cpp文件中定义该变量

(5).有些code generation需为mulitthread,比如多线程CreateThread函数,在

project->setting->C/C++->code generation中将single thread改为MT(具体看
要求);或者与加载的dll or lib的code generation冲突,具体可查询必要的资料。

其实在VC中出现link错误都有个错误码,可以查询MSDN来了解该错误的阐述,

[编程相关]                                                                                                              

1、CEdit等相关窗体的设置标题,设置字体
    设置窗体文本使用CWnd::SetWindowText()函数,比如对于一个CEdit,就使用
CEdit::SetWindowText(str);对于CStatic等的窗体也一样。
    设置字体:对于CEdit等控件,有一个SetFont()函数,这个函数能设置该窗体的

字体,使用SetFont(&font)函数时,要保证传进去的参数font在窗体生存期间都存在,一

般情况下,我们把font设为一个类的成员变量。

2、设置背景透明的字体
    使用CDC::SetBkMode(TRANSPARENT)可以保证写出来的字体背景为透明,即不会

在文字输出的时候留下难看的白色等背景。

3、怎样创建透明画刷
    CBrush::CreateBrushIndirect(NULL_BRUSH),这样建立的画刷在画矩形或圆时

就不会填充内部的区域了。

4、CView的OnDraw问题:使视图无效后就没有图形了
    要有数据保存的,每次都应该在OnDraw里把那些数据重新表现出来

5、得到文档类,视图类,应用程序对象以及MainFrame类的指针
    得到应用程序对象的指针:AfxGetApp();
    对于单文档:
    在MainFrame里得到Doc的指针:CMainFrame::GetActiveDocument();
    在View里得到Doc的指针:CView::GetDocument();
    得到MainFrame的指针:CMainFrame* pFrame=(CMainFrame*)AfxGetMainWnd();
    然后再用pFrame做想做的任何事。
    对于多文档:
    在MainFrame里等到Doc的指针:
    CFrameWnd* pActiveFrame=GetActiveFrame();
    CDocument* pDoc=pActiveFrame->GetActiveDocument();
    注意不能直接使用CMainFrame()->GetActiveDocument(),不然会发现得到的是

空指针。

6、如何灰掉按钮
    得到这个按钮的指针后,调用EnableWindow(FALSE)就可以了

7、如何防止重画闪烁
    如果每一次都是对整个画面进行填充的话,可以试试处理WM_ERASEBKGROUND
消息,在CWnd::OnEraseBkGround()函数里,不要调用基类,直接return TRUE好了。
如果是小区域更新,可以使用InvalidataRect(rect)函数,其中rect指定了更新的区域。

另外还有一种方法是使用内存DC,先将图画在内存DC中,然后画在屏幕上,具体方法可以

网上查一下。

8、如何建立无模式对话框
    示例如下:
    CMyDlg* pDlg=new CMyDlg;
    pDlg->Create(CMyDlg::IDD);
    pDlg->ShowWindow(SW_SHOW);
    这样一个无模式对话框就建好并显示出来了。
    为了在窗口退出时自动删除该对象,可以把delete this加到PostNcDestroy函数

中。

9、如何在程序中调用其它应用程序
    WinExec,CreateProcess,ShellExcute
    最简单的是使用ShellExecute()函数。
    比如:
   ShellExecute(handle, "open", path_to_folder, NULL, NULL, SW_SHOWNORMAL);

[界面开发]                                                                                                              

1、界面开发工具及下载地:
    以前对界面这一块讨论的较少,整理了一下精华区,详见x-4-13

2、不用界面库在XP下实现XP风格
    使用manifest文件,在精华区有,详见x-4-13,文件命名为

yourApplicationName.exe.manifest

[其它]                                                                                                                  

1、常见数据类型之间的转换
例如:
    char数组或char*到CString的转换
        有char型的数组char buffer[row][col],将它转换成CString类型的
    CString str=CString((char*)buffer,row*col);

    CStirng与string的转换
    string转化为CString:
        string s;
        s="hello";
        CString str(s.c_str());

    int,long,float,double 等转换为CString

    int i=1;
    CString s;
    s.Format("%d",i);
    类似printf的格式化写法

    CString 转换为int,float,double等类型
    请参见atoi,atof,atol 等函数

2、CSocket ,CAsyncSock 调用Create()函数失败

    请先在CXXXApp::InitInstance里面调用AfxSocketInit函数 

 

更多技术文章请参看施昌权的个人网站: http://www.joyvc.cn

 

 

抱歉!评论已关闭.