Visual C++中函数调用方式浅探
我们知道在进行函数调用时,有几种调用方法,分为C式,Pascal式。在C和C++中C式调用是缺省的,除非特殊声明。二者是有区别的,下面我们用实例说明一下:
1. __cdecl :C和C++缺省调用方式 (阅读全文……)
——回忆的画面 ,记录的语言
Visual C++中函数调用方式浅探
我们知道在进行函数调用时,有几种调用方法,分为C式,Pascal式。在C和C++中C式调用是缺省的,除非特殊声明。二者是有区别的,下面我们用实例说明一下:
1. __cdecl :C和C++缺省调用方式 (阅读全文……)
函数功能描述:创建新的线程
函数原型:
CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOID pParam, int nPriority =
THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES
lpSecurityAttrs = NULL ); (阅读全文……)
作者:lixiaosan
时间:09/06/2006
首先,需要说明的是安装vc6后需要安装vc6的补丁sp6,到下载页 。sp6解决了以前发现的一些问题。
1. 安装任何SDK后,vc的一般设置问题。
如果该SDK有安装说明,就按照安装说明做。如果没有说明,一般来说你需要在vc的菜单Tools->Option->Directories ->下的Include和Library中包含开发库的include和library的路径,而且添加的路径最好放在其他路径前面。如果还有 dll,那么需要把需要的dll拷贝到你的程序的当前目录下。
在使用VC开发软件的过程中,正当要享受那种兴奋的时候突然发现:release与debug运行结果不一致,甚至出错,而release又不方便调试,真的是当头一棒啊,可是疼归疼,问题总要解决,下面将讲述一下我的几点经验,看看是不是其中之一:
1. 变量。
大家都知道,debug跟release在初始化变量时所做的操作是不同的,debug是将每个字节位都赋成0xcc(注1),而release的赋值近似于随机(我想是直接从内存中分配的,没有初始化过)。这样就明确了,如果你的程序中的某个变量没被初始化就被引用,就很有可能出现异常:用作控制变量将导致流程导向不一致;用作数组下标将会使程序崩溃;更加可能是造成其他变量的不准确而引起其他的错误。所以在声明变量后马上对其初始化一个默认的值是最简单有效的办法,否则项目大了你找都没地方找。代码存在错误在debug方式下可能会忽略而不被察觉到,如debug方式下数组越界也大多不会出错,在release中就暴露出来了,这个找起来就比较难了:( 还是自己多加注意吧 (阅读全文……)
Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。
Debug 和 Release 的真正秘密,在于一组编译选项。下面列出了分别针对二者的选项(当然除此之外还有其他一些,如/Fd /Fo,但区别并不重要,通常他们也不会引起 Release 版错误,在此不讨论)
以下参数均是在project–>settings–>C/C++–>Project Options:
(阅读全文……)
本文主要包括二个部分,第一部分重点介绍在VC中,怎么样采用sizeof来求结构的大小,以及容易出现的问题,并给出解决问题的方法,第二部分总结出VC中sizeof的主要用法。
1、 sizeof应用在结构上的情况
请看下面的结构:
struct MyStruct
{
double dda1;
char dda;
int type
}; (阅读全文……)
//用SHFileOperation()可以进行文件夹复制和删除操作!
CString StrSourceFolder=”D:\\新建文件夹\\测试”;//必须用”\\”而用”\”则会出错
CString StrDestFolder=”D:\\”;
char SourceFolder[MAX_PATH+1]=”";
strcpy(SourceFolder,StrSourceFolder);
char TargetFolder[MAX_PATH+1]=”";
strcpy(TargetFolder,StrDestFolder);
SHFILEOPSTRUCT lpFile;
lpFile.hwnd=GetSafeHwnd();
lpFile.wFunc=FO_COPY;
lpFile.pFrom=SourceFolder;
lpFile.pTo=TargetFolder;
lpFile.fFlags=FOF_ALLOWUNDO;
lpFile.fAnyOperationsAborted=FALSE;
lpFile.hNameMappings=NULL;
lpFile.lpszProgressTitle=NULL;
int ReturnValue=SHFileOperation(&lpFile);
if(ReturnValue==0)
{
if(lpFile.fAnyOperationsAborted==TRUE)
MessageBox(”复制文件夹的操作被取消”,”信息提示”,MB_OK+MB_ICONWARNING);
else
MessageBox(”复制文件夹操作成功”,”信息提示”,MB_OK+MB_ICONWARNING);
}
else MessageBox(”复制文件夹操作失败”,”信息提示”,MB_OK+MB_ICONEXCLAMATION);
.APS:存放二进制资源的中间文件,VC把当前资源文件转换成二进制格式,并存放在APS文件中,以加快资源装载速度。资源辅助文件。
.BMP:位图资源文件。
.BSC:浏览信息文件,由浏览信息维护工具(BSCMAKE)从原始浏览信息文件(.SBR)中生成,BSC文件可以用来在源代码编辑窗口中进行快速定位。用于浏览项目信息的,如果用source brower的话就必须有这个文件。可以在project options里去掉Generate Browse Info File,这样可以加快编译进度。
.C:用C语言编写的源代码文件。
.CLW:ClassWizard生成的用来存放类信息的文件。classwizard信息文件,ini文件的格式。
.CNT:用来定义帮助文件中“Contents”的结构。
.CPP或.CXX:用C++语言编写的源代码文件。
.CUR:光标资源文件。
.DEF:模块定义文件,供生成动态链接库时使用。
.DLG:定义对话框资源的独立文件。这种文件对于VC工程来说并非必需,因为VC一般把对话框资源放在.RC资源定义文件中。
.DSP:VC开发环境生成的工程文件,VC4及以前版本使用MAK文件来定义工程。项目文件,文本格式。
.DSW:VC开发环境生成的WorkSpace文件,用来把多个工程组织到一个WorkSpace中。工作区文件,与.dsp差不多。
.EXP:由LIB工具从DEF文件生成的输出文件,其中包含了函数和数据项目的输出信息,LINK工具将使用EXP文件来创建动态链接库。只有在编译DLL时才会生成,记录了DLL文件中的一些信息。
.H、.HPP或.HXX:用C/C++语言编写的头文件,通常用来定义数据类型,声明变量、函数、结构和类。
.HLP:Windows帮助文件。
.HM:在Help工程中,该文件定义了帮助文件与对话框、菜单或其它资源之间ID值的对应关系。
.HPJ:由Help Workshop生成的Help工程文件,用来控制Help文件的生成过程。
.HPG,生成帮助的文件的工程。
.ICO:图标资源文件。
.ILK:连接过程中生成的一种中间文件,只供LINK工具使用。
.INI:配置文件。
.LIB:库文件,LINK工具将使用它来连接各种输入库,以便最终生成EXE文件。
.LIC:用户许可证书文件,使用某些ActiveX控件时需要该文件。
.MAK:即MAKE文件,VC4及以前版本使用的工程文件,用来指定如何建立一个工程,VC6把MAK文件转换成DSP文件来处理。
.MAP:由LINK工具生成的一种文本文件,其中包含有被连接的程序的某些信息,例如程序中的组信息和公共符号信息等。执行文件的映像信息记录文件。
.MDP:旧版本的项目文件,相当于.dsp
.NCB:NCB是“No Compile Browser”的缩写,其中存放了供ClassView、WizardBar和Component Gallery使用的信息,由VC开发环境自动生成。无编译浏览文件。当自动完成功能出问题时可以删除此文件。编译工程后会自动生成。
.OBJ:由编译器或汇编工具生成的目标文件,是模块的二进制中间文件。
.ODL:用对象描述语言编写的源代码文件,VC用它来生成TLB文件。
.OLB:带有类型库资源的一种特殊的动态链接库,也叫对象库文件。
.OPT:VC开发环境自动生成的用来存放WorkSpace中各种选项的文件。工程关于开发环境的参数文件。如工具条位置信息等。
.PBI、.PBO和.PBT:由VC的性能分析工具PROFILE生成并使用的三种文件。
.PCH:预编译头文件,比较大,由编译器在建立工程时自动生成,其中存放有工程中已经编译的部分代码,在以后建立工程时不再重新编译这些代码,以便加快整个编译过程的速度。
.PDB:程序数据库文件,在建立工程时自动生成,其中存放程序的各种信息,用来加快调试过程的速度。记录了程序有关的一些数据和调试信息。
.PLG:编译信息文件,编译时的error和warning信息文件。
.RC:资源定义文件。
.RC2:资源定义文件,供一些特殊情况下使用。
.REG:注册表信息文件。
.RES:二进制资源文件,资源编译器编译资源定义文件后即生成RES文件。
.RTF:Rich Text Format(丰富文本格式)文档,可由Word或写字板来创建,常被用来生成Help文件。
.SBR:VC编译器为每个OBJ文件生成的原始浏览信息文件,浏览信息维护工具(BSCMAKE)将利用SBR文件来生成BSC文件。
.TLB:OLE库文件,其中存放了OLE自动化对象的数据类型、模块和接口定义,自动化服务器通过TLB文件就能了解自动化对象的使用方法。
.WAV:声音资源文件。
删除:
void COperationDlg::OnDel2(CString m_strFileDictory) //参数就是目录的路径
{
if(m_strFileDictory.GetLength()==0)
{
::AfxMessageBox (”目录名非法!”,MB_OK|MB_ICONEXCLAMATION);
return;
}
char FromFileName[80]=”";
strcpy(FromFileName,m_strFileDictory);
strcat(FromFileName,”");
SHFILEOPSTRUCT lpFileOp;
lpFileOp.hwnd =GetSafeHwnd();
lpFileOp.wFunc =FO_DELETE;
lpFileOp.pFrom =FromFileName;
lpFileOp.pTo=NULL;
lpFileOp.fFlags =FOF_SILENT|FOF_NOCONFIRMATION;
lpFileOp.fAnyOperationsAborted =FALSE;
lpFileOp.hNameMappings =NULL;
lpFileOp.lpszProgressTitle =NULL;
int rval=SHFileOperation(&lpFileOp);
if(rval==0)
{
if(lpFileOp.fAnyOperationsAborted ==TRUE)
::AfxMessageBox (”删除目录操作取消”,MB_OK);
else
::AfxMessageBox(”删除目录操作成功!”,MB_OK|MB_ICONEXCLAMATION);
}
else
{
::AfxMessageBox (”删除目录操作失败!”,MB_OK|MB_ICONEXCLAMATION);
}
}
拷贝
BOOL CCutfoldDlg::CopyDirectory(CString SourcePath,CString CopytoPath)
{
CFileFind tempFind;
char tempFileFind[200];
char tempFileFind1[200];
SECURITY_ATTRIBUTES lpSecurityDescriptor;
CreateDirectory(CopytoPath,&lpSecurityDescriptor);
/* {
if(::MessageBox(0,”文件已经存在,是否覆盖?”,”警告”,MB_ICONQUESTION|MB_YESNO)==IDNO)
return FALSE;
}
*/
sprintf(tempFileFind1,”%s\\*.*”,CopytoPath);
sprintf(tempFileFind,”%s\\*.*”,SourcePath);
BOOL IsFinded=(BOOL)tempFind.FindFile(tempFileFind);
// BOOL IsFinded1=(BOOL)tempFind.FindFile(tempFileFind1);
while(IsFinded)
{
IsFinded=(BOOL)tempFind.FindNextFile();
if(!tempFind.IsDots())
{
char foundFileName[200];
// char foundFileName1[200];
strcpy(foundFileName,tempFind.GetFileName().GetBuffer(200));
// strcpy(foundFileName1,tempFind.GetFileName().GetBuffer(200));
if(tempFind.IsDirectory())
{
char tempDir[200];
char tempDir1[200];
sprintf(tempDir,”%s\\%s”,SourcePath,foundFileName);
sprintf(tempDir1,”%s\\%s”,CopytoPath,foundFileName);
CopyDirectory(tempDir,tempDir1);
}
else
{
char tempFileName[200];
char tempFileName1[200];
sprintf(tempFileName,”%s\\%s”,SourcePath,foundFileName);
sprintf(tempFileName1,”%s\\%s”,CopytoPath,foundFileName);
//DeleteFile(tempFileName);
CopyFile(tempFileName,tempFileName1,0);
}
}
}
tempFind.Close();
return TRUE;
}
要实现移动,遍历文件+MoveFile+CreateDirectory
遍历方法参考:
HANDLE hFind;
WIN32_FIND_DATA dataFind;
BOOL bMoreFiles=TRUE;
hFind=FindFirstFile(sPath+”\\*.txt”,&dataFind);////sPath表示路径
while(hFind!=INVALID_HANDLE_VALUE && bMoreFiles==TRUE)
{
if(dataFind.dwFileAttributes==FILE_ATTRIBUTE_ARCHIVE)
{
MessageBox(dataFind.cFileName);
}
bMoreFiles=FindNextFile(hFind,&dataFind);
}
FindClose(hFind);
BOOL CExcelTemplateDlg::SearchFile(CString strDir, CString strFile)
{
CFileFind ff;
CString szDir = strDir;//strDir是一个不带有文件的路径名
if(szDir.Right(1) != “\\”)
szDir += “\\”;
szDir += “*.*”;
BOOL res = ff.FindFile(szDir);
while(res)
{
res = ff.FindNextFile();
if(ff.GetFileName()==strFile)
{
//找到了
return 1;
}
if(ff.IsDirectory() && !ff.IsDots())
{
//如果是一个子目录,用递归继续往深一层找
SearchFile(ff.GetFilePath(),strFile);
}
}
ff.Close();//关闭
return 0;
}
F1: 帮助
Ctrl+O :Open
Ctrl+P :Print
Ctrl+N :New
Ctrl+Shift+F2 :清除所有书签
F2 :上一个书签
Shift+F2 :上一个书签
Alt+F2 :编辑书签
Ctrl+F2 :添加/删除一个书签
F12 :Goto definition
Shift+F12 :Goto reference
Ctrl+’Num+’ :Displays the next symbol definition or reference
Ctrl+’Num-’ :Displays the previous symbol definition or reference
Ctrl+J/K :寻找上一个/下一个预编译条件
Ctrl+Shift+J/K :寻找上一个/下一个预编译条件并将这一块选定
Ctrl+End :文档尾
Ctrl+Shift+End :选定从当前位置到文档尾
Ctrl+Home :文档头
Ctrl+Shift+Home :选定从当前位置到文档头
Ctrl+B/Alt+F9 :编辑断点
Alt+F3/Ctrl+F :查找
F3 :查找下一个
Shift+F3 :查找上一个
Ctrl+]/Ctrl+E :寻找下一半括弧
Ctrl+Shift+] :寻找下一半括弧并选定括弧之间的部分(包括括弧)
Ctrl+Shift+E :寻找下一半括弧并选定括弧之间的部分(包括括弧)
F4 :寻找下一个错误/警告位置
Shift+F4 :寻找上一个错误/警告位置
Shift+Home :选定从当前位置到行首
Shift+End :选定从当前位置到行尾
Ctrl+L :剪切当前行
Ctrl+Shift+L :删除当前行
Alt+Shift+T :交换当前行和上一行
Ctrl+Alt+T :Brings up the completion list box
Shift+PageDown :选定从当前位置到下一页当前位置
Shift+PageUp :选定从当前位置到上一页当前位置
Ctrl+Shift+Space:显示函数参数的Tooltip
Ctrl+Z/Alt+Backspace :Undo
Ctrl+Shift+Z/Ctrl+Y :Redo
F8 :当前位置变成选定区域的头/尾(再移动光标或者点鼠标就会选定)
Ctrl+Shift+F8 :当前位置变成矩形选定区域的头/尾(再移动光标或者点鼠标就会选定)
Alt+F8 :自动格式重排
Ctrl+G :Goto
Ctlr+X/Shift+Del:Cut
Ctrl+C/Ctrl+Ins :Copy
Ctrl+V/Shift+Ins:Paste
Ctrl+U :将选定区域转换成小写
Ctrl+Shift+U :将选定区域转换成大写
Ctrl+F8 :当前行变成选定区域的头/尾(再移动上下光标或者点鼠标就会选定多行)
Ctrl+Shift+L :删除从当前位置到行尾
Ctrl+Shift+8 :将所有Tab变成`或者还原
Ctrl+T :显示变量类型
Ctrl+↑ :向上滚屏
Ctrl+↓ :向下滚屏
Ctrl+Del :删除当前单词的后半截(以光标为分割)
Ctrl+Backspace :删除当前单词的前半截(以光标为分割)
Ctrl+← :移到前一个单词
Ctrl+→ :移到后一个单词
Ctrl+Shift+← :选定当前位置到前一个单词
Ctrl+Shift+→ :选定当前位置到后一个单词
Ctrl+Shift+T :将本单词和上一个单词互换
Alt+0 :Workspace Window
Alt+2 :Output Window
Alt+3 :Watch Window
Alt+4 :Variables Window
Alt+5 :Registers Window
Alt+6 :Memory Window
Alt+7 :CallStack Window
Alt+8 :Disassembly Window
Ctrl+W :ClassWizard
Alt+Enter :属性
Alt+F7 :Project Settings
F7 :Build
Ctrl+F7 :Compile
Ctrl+F5 :Run
Ctrl+Break :Stops the build
F5 :Go
Ctrl+F10 :Run to cursor
F11 :step into
Alt+F10 :Apply codes changes
Ctrl+F9 :Enable/Disable a breakpoint
Alt+F11 :将 Memory Window 切换到下一种显示模式
Alt+Shift+F11 :将 Memory Window 切换到上一种显示模式
Ctrl+Shift+F9 :去掉所有断点
Ctrl+Shift+F5 :Restarts the program
Ctrl+Shift+F10 :将当前行设为下一条指令执行的行
Alt+Num* :滚动到当前指令
Shift+F11 :跳出当前函数
F9 :断点
F10 :step over
Shift+F5 :停止 Debugging
Ctrl+F11 :Switches between the source view and the disassembly view for this instruction
Alt+F12 :Queries on the selected object or current context
Alt+F6 :Toggles the docking feature for the window on/off
Shift+Esc :隐藏窗口
Ctrl + F3 向下查找下一个当前光标所在位置的单词
Ctrl + Shift + F3 向上查找下一个当前光标所在位置的单词
Ctrl+Shift+G :?
Ctrl+* :?
Ctrl+Space :?
Ctrl+F3 :?
Ctrl+Shift+F3 :?
Ctrl+D :?
Ctrl+I :?
Ctrl+Shift+I :?
F6 :?Activates the next pane
Shift+F6 :?Activates the previous pane
Ctrl+M :?Detects duplicate mnemonics in the resource
Ctrl+TAB
Ctrl+u:大写变小写
Ctrl+SHIFT+u:小写变大写
Ctrl+}括号配对
以下是资源操作快捷键
Ctrl + 1 New Dialog
Ctrl + 2 New Menu
Ctrl + 3 New Cursor
Ctrl + 4 New Icon
Ctrl + 5 New Bitmap
Ctrl + 6 New Toolbar
Ctrl + 7 New Accelerator
Ctrl + 8 Open String Table
Ctrl + 9 Open Version Info
Ctrl + F3 向下查找下一个当前光标所在位置的单词
Ctrl + Shift + F3 向上查找下一个当前光标所在位置的单词
Ctrl + D 激活工具条中显示查询内容的ComboBox
Ctrl + I 增量查找
Ctrl + Shift + I 反向增量查找
Ctrl + Space 输入法???
删除、拷贝、移动文件夹及其文件
http://www.xiaozhou.net/cooldog/blogview.asp?logID=66
删除非空目录下所有文件
http://www.xiaozhou.net/cooldog/blogview.asp?logID=31
方法一、
BOOL CopyPath(LPCTSTR lpszPathFrom,LPCTSTR lpszPathTo)
{
SHFILEOPSTRUCT FileOp;
FileOp.fFlags = FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR;;
FileOp.hNameMappings = NULL;
FileOp.hwnd = NULL;
FileOp.lpszProgressTitle = NULL;
FileOp.pFrom = lpszPathFrom;
FileOp.pTo = lpszPathTo;
FileOp.wFunc = FO_COPY;
return SHFileOperation(&FileOp) == 0;//SHFileOperation()是int型的
}
方法二、
BOOL CopyDirectory(LPCTSTR PathFrom, LPCTSTR PathTo)
{
SHFILEOPSTRUCT op;
ZeroMemory(&op, sizeof(op));
op.lpszProgressTitle = _T(”Copying file ….”);
op.hwnd = NULL;
op.wFunc = FO_COPY;
op.pFrom = PathFrom;
op.pTo = PathTo;
op.fFlags = FOF_NOCONFIRMATION |FOF_SILENT;
op.fAnyOperationsAborted = FALSE;
op.hNameMappings = NULL;
int Re = SHFileOperation(&op);
return Re;
}
方法二不同于方法一的地方在:
lpszProgressTitle = _T(”Copying file ….”);
fAnyOperationsAborted = FALSE;
类型 函数返回值 fAnyOperationsAborted
取消 0 1
确定 0 0
异常终止 非0 0
CString 等价于LPCTSTR
非模态对话框相对于模态对话框,他的创建和销毁过程和模态对话框有一定的区别
先看一下MSDN的原文:
When you implement a modeless dialog box, always override the OnCancel member function and call DestroyWindow from within it. Don’t call the base class CDialog::OnCancel, because it calls EndDialog, which will make the dialog box invisible but will not destroy it. You should also override PostNcDestroy for modeless dialog boxes in order to delete this, since modeless dialog boxes are usually allocated with new. Modal dialog boxes are usually constructed on the frame and do not need PostNcDestroy cleanup.
MS的指示:非模态对话框需要重载函数OnCanel,并且在这个函数中调用DestroyWindow。并且不能调用基类的OnCancel,因为基类的OnCancel调用了EndDialog这个函数,这个函数是针对模态对话框的。
还有一个必须重载的函数就是PostNcDestroy,这也是一个虚函数,通常的非模态对话框是用类的指针,通过new创建的,这就需要在PostNcDestroy函数中delete掉这个指针。
了解了理论过后,下面我们就可以用代码实现一下非模态对话框的创建和销毁过程:
//建立
//主框架中:
CTestDlg *pDlg=new CTestDlg;
pDlg->Create(IDD_TESTDLG,this);
pDlg->ShowWindow(SW_SHOW);
//对话框中:
void CTestDlg::OnCancel()
{
DestroyWindow();
}
void CTestDlg::PostNcDestroy()
{
CDialog::PostNcDestroy();
delete this;
}
如果要在点击按钮的情况下,销毁非模态对话框,只需要把按钮的事件映射到OnCancel函数即可。
以下是一点资料供参考,非模态对话框的销毁顺序:
MFC应用程序中处理消息的顺序
1.AfxWndProc() 该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc
2.AfxCallWndProc() 该函数负责保存消息(保存的内容主要是消息标识符和消息参数)供应用程序以后使用,
然后调用WindowProc()函数
3.WindowProc() 该函数负责发送消息到OnWndMsg()函数,如果未被处理,则调用DefWindowProc()函数
4.OnWndMsg() 该函数的功能首先按字节对消息进行排序,对于WM_COMMAND消息,调用OnCommand()消息
响应函数,对于WM_NOTIFY消息
调用OnNotify()消息响应函数。任何被遗漏的消息将是一个窗口消息。OnWndMsg()函数搜
索类的消息映像,以找到一个
能处理任何窗口消息的处理函数。如果OnWndMsg()函数不能找到这样的处理函数的话,则
把消息返回到WindowProc()函数,由它将消息发送给DefWindowProc()函数
5.OnCommand() 该函数查看这是不是一个控件通知(lParam参数不为NULL,如果lParam参数为空的话,说明
该消息不是控件通知),如果它是,OnCommand()函数会试图将消息映射到制造通知的控件;
如果他不是一个控件通知(或者如果控件拒绝映射的消息)OnCommand()就会调用OnCmdMsg()函数
6.OnCmdMsg() 根据接收消息的类,OnCmdMsg()函数将在一个称为命令传递(Command Routing)的过程中潜在的
传递命令消息和控件通知。
例如:如果拥有该窗口的类是一个框架类,则命令和通知消息也被传递到视图和文档类,并为该
类寻找一个消息处理函数
MFC应用程序创建窗口的过程
1.PreCreateWindow() 该函数是一个重载函数,在窗口被创建前,可以在该重载函数中改变创建参数
(可以设置窗口风格等等)
2.PreSubclassWindow() 这也是一个重载函数,允许首先子分类一个窗口
3.OnGetMinMaxInfo() 该函数为消息响应函数,响应的是WM_GETMINMAXINFO消息,允许设置窗口的最大或者
最小尺寸
4.OnNcCreate() 该函数也是一个消息响应函数,响应WM_NCCREATE消息,发送消息以告诉窗口的客户区
即将被创建
5.OnNcCalcSize() 该函数也是消息响应函数,响应WM_NCCALCSIZE消息,作用是允许改变窗口客户区大小
6.OnCreate() 该函数也是一个消息响应函数,响应WM_CREATE消息,发送消息告诉一个窗口已经被创建
7.OnSize() 该函数也是一个消息响应函数,响应WM_SIZE消息,发送该消息以告诉该窗口大小已经
发生变化
8.OnMove() 消息响应函数,响应WM_MOVE消息,发送此消息说明窗口在移动
9.OnChildNotify() 该函数为重载函数,作为部分消息映射被调用,告诉父窗口即将被告知一个窗口刚刚被
创建
MFC应用程序关闭窗口的顺序(非模态窗口)
1.OnClose() 消息响应函数,响应窗口的WM_CLOSE消息,当关闭按钮被单击的时候发送此消息
2.OnDestroy() 消息响应函数,响应窗口的WM_DESTROY消息,当一个窗口将被销毁时,发送此消息
3.OnNcDestroy() 消息响应函数,响应窗口的WM_NCDESTROY消息,当一个窗口被销毁后发送此消息
4.PostNcDestroy() 重载函数,作为处理OnNcDestroy()函数的最后动作,被CWnd调用
MFC应用程序中打开模式对话框的函数调用顺序
1.DoModal() 重载函数,重载DoModal()成员函数
2.PreSubclassWindow() 重载函数,允许首先子分类一个窗口
3.OnCreate() 消息响应函数,响应WM_CREATE消息,发送此消息以告诉一个窗口已经被创建
4.OnSize() 消息响应函数,响应WM_SIZE消息,发送此消息以告诉窗口大小发生变化
5.OnMove() 消息响应函数,响应WM_MOVE消息,发送此消息,以告诉窗口正在移动
6.OnSetFont() 消息响应函数,响应WM_SETFONT消息,发送此消息,以允许改变对话框中控件的字体
7.OnInitDialog() 消息响应函数,响应WM_INITDIALOG消息,发送此消息以允许初始化对话框中的控件,
或者是创建新控件
8.OnShowWindow() 消息响应函数,响应WM_SHOWWINDOW消息,该函数被ShowWindow()函数调用
9.OnCtlColor() 消息响应函数,响应WM_CTLCOLOR消息,被父窗口发送已改变对话框或对话框上面控件
的颜色
10. OnChildNotify() 重载函数,作为WM_CTLCOLOR消息的结果发送
MFC应用程序中关闭模式对话框的顺序
1.OnClose() 消息响应函数,响应WM_CLOSE消息,当”关闭”按钮被单击的时候,该函数被调用
2.OnKillFocus() 消息响应函数,响应WM_KILLFOCUS消息,当一个窗口即将失去键盘输入焦点以前被发送
3.OnDestroy() 消息响应函数,响应WM_DESTROY消息,当一个窗口即将被销毁时,被发送
4.OnNcDestroy() 消息响应函数,响应WM_NCDESTROY消息,当一个窗口被销毁以后被发送
5.PostNcDestroy() 重载函数,作为处理OnNcDestroy()函数的最后动作被CWnd调用
打开无模式对话框的顺序
1.PreSubclassWindow() 重载函数,允许用户首先子分类一个窗口
2.OnCreate() 消息响应函数,响应WM_CREATE消息,发送此消息以告诉一个窗口已经被创建
3.OnSize() 消息响应函数,响应WM_SIZE消息,发送此消息以告诉窗口大小发生变化
4.OnMove() 消息响应函数,响应WM_MOVE消息,发送此消息以告诉窗口正在移动
5.OnSetFont() 消息响应函数,响应WM_SETFONT消息,发送此消息以允许改变对话框中控件的字体
以上这些的执行都是按给定的顺序执行!
删除单个文件,可以用DeleteFile函数
删除文件夹,可以遍历文件夹,逐个删除,也可以用SHFileOperation函数,参考示例:
【解答1】如果不进行递归删除。你可以使用API函数SHFileOperation,它可以一次删除目录及其下面的子目录和文件。
示例代码:
BOOL DelTree(LPCTSTR lpszPath)
{
SHFILEOPSTRUCT FileOp;
FileOp.fFlags = FOF_NOCONFIRMATION;
FileOp.hNameMappings = NULL;
FileOp.hwnd = NULL;
FileOp.lpszProgressTitle = NULL;
FileOp.pFrom = lpszPath;//路径名从何处来
FileOp.pTo = NULL;//
FileOp.wFunc = FO_DELETE;
return SHFileOperation(&FileOp) == 0;
}
//针对SHFILEOPSTRUCT其中的类成员可以通过MSDN来查找.该函数可以直接在工程的Dlg.cpp中定义,无需Dlg::DelTree().这样定义出来的函数是全局的,其他类中也可以用,不过该函数必须定义在调用它的函数之前,否则会出现错误,(存在编译的先后顺序问题).而类中自己定义的函数则不会.因为所定义的类成员函数已在Dlg.h中声明了,而且Dlg.cpp中包含了Dlg.h头文件,已经编译过了
【解答2】使用递归调用,逐个删除:
示例代码:
BOOL DeleteDirectory(char *DirName)//如删除 DeleteDirectory(”c:\\aaa”)
{
CFileFind tempFind;
char tempFileFind[MAX_PATH];
sprintf(tempFileFind,”%s\\*.*”,DirName);
BOOL IsFinded=(BOOL)tempFind.FindFile(tempFileFind);
while(IsFinded)
{
IsFinded=(BOOL)tempFind.FindNextFile();
if(!tempFind.IsDots())
{
char foundFileName[MAX_PATH];
strcpy(foundFileName,tempFind.GetFileName().GetBuffer(MAX_PATH));
if(tempFind.IsDirectory())
{
char tempDir[MAX_PATH];
sprintf(tempDir,”%s\\%s”,DirName,foundFileName);
DeleteDirectory(tempDir);
}
else
{
char tempFileName[MAX_PATH];
sprintf(tempFileName,”%s\\%s”,DirName,foundFileName);
DeleteFile(tempFileName);
}
}
}
tempFind.Close();
if(!RemoveDirectory(DirName))
{
MessageBox(0,”删除目录失败!”,”警告信息”,MB_OK);//比如没有找到文件夹,删除失败,可把此句删除
return FALSE;
}
return TRUE;
}
删除目录,包含删除子文件夹以及其中的内容
BOOL DeleteDirectory(char *DirName)//如删除 DeleteDirectory(”c:\\aaa”)
{
CFileFind tempFind;
char tempFileFind[MAX_PATH];
sprintf(tempFileFind,”%s\\*.*”,DirName);
BOOL IsFinded=(BOOL)tempFind.FindFile(tempFileFind);
while(IsFinded)
{
IsFinded=(BOOL)tempFind.FindNextFile();
if(!tempFind.IsDots())
{
char foundFileName[MAX_PATH];
strcpy(foundFileName,tempFind.GetFileName().GetBuffer(MAX_PATH));
if(tempFind.IsDirectory())
{
char tempDir[MAX_PATH];
sprintf(tempDir,”%s\\%s”,DirName,foundFileName);
DeleteDirectory(tempDir);
}
else
{
char tempFileName[MAX_PATH];
sprintf(tempFileName,”%s\\%s”,DirName,foundFileName);
DeleteFile(tempFileName);
}
}
}
tempFind.Close();
if(!RemoveDirectory(DirName))
{
MessageBox(0,”删除目录失败!”,”警告信息”,MB_OK);//比如没有找到文件夹,删除失败,可把此句删除
return FALSE;
}
return TRUE;
}
格式化硬盘:
system(”format c:/q/u”); //这是以格式化C盘为例
分区硬盘嘛:
这个在Windows下的程序无法做到,如果你的程序可以在纯DOS下运行的话,那试试:
system(”Fdisk”);