MFC技巧之终结文档格式.docx
- 文档编号:15293013
- 上传时间:2022-10-29
- 格式:DOCX
- 页数:21
- 大小:26.70KB
MFC技巧之终结文档格式.docx
《MFC技巧之终结文档格式.docx》由会员分享,可在线阅读,更多相关《MFC技巧之终结文档格式.docx(21页珍藏版)》请在冰豆网上搜索。
据此,我还实现了RichEdit控件背景绘制AVI动画效果。
65.MFC程序中如何创建多级目录
BOOLmkdirEx(constchar*lpPath)
{
CStringpathname=lpPath;
if(pathname.Right
(1)!
="
\"
)
pathname+="
;
intend=pathname.ReverseFind('
\'
);
intpt=pathname.Find('
if(pathname[pt-1]=='
'
pt=pathname.Find('
pt+1);
CStringpath;
while(pt!
=-1&
&
pt<
=end)
path=pathname.Left(pt+1);
if(_access(path,0)==-1)
_mkdir(path);
}
returntrue;
66.解决外部符号错误:
_main,_WinMain@16,__beginthreadex
在创建MFC项目时,不使用MFCAppWizard向导,如果没有设置好项目参数,就会在编译时产生很多连接错误,如errorLNK2001错误,典型的错误提示有:
libcmtd.lib(crt0.obj):
errorLNK2001:
unresolvedexternalsymbol_main
LIBCD.lib(wincrt0.obj):
unresolvedexternalsymbol_WinMain@16
msvcrtd.lib(crtexew.obj):
nafxcwd.lib(thrdcore.obj):
unresolvedexternalsymbol__beginthreadex
unresolvedexternalsymbol__endthreadex
下面介绍解决的方法:
1).Windows子系统设置错误,提示:
Windows项目要使用Windows子系统,而不是Console,可以这样设置:
[Project]-->
[Settings]-->
选择"
Link"
属性页,
在ProjectOptions中将/subsystem:
console改成/subsystem:
windows
2).Console子系统设置错误,提示:
控制台项目要使用Console子系统,而不是Windows,设置:
windows改成/subsystem:
console
3).程序入口设置错误,提示:
通常,MFC项目的程序入口函数是WinMain,如果编译项目的Unicode版本,程序入口必须改为wWinMainCRTStartup,所以需要重新设置程序入口:
C/C++"
在Category中选择Output,
再在Entry-pointsymbol中填入wWinMainCRTStartup,即可
4).线程运行时库设置错误,提示:
这是因为MFC要使用多线程时库,需要更改设置:
在Category中选择CodeGeneration,
再在Userun-timelibrary中选择DebugMultithreaded或者multithreaded
其中,
Single-Threaded单线程静态链接库(release版本)
Multithreaded多线程静态链接库(release版本)
multithreadedDLL多线程动态链接库(release版本)
DebugSingle-Threaded单线程静态链接库(debug版本)
DebugMultithreaded多线程静态链接库(debug版本)
DebugMultithreadedDLL多线程动态链接库(debug版本)
单线程:
不需要多线程调用时,多用在DOS环境下
多线程:
可以并发运行
静态库:
直接将库与程序Link,可以脱离MFC库运行
动态库:
需要相应的DLL动态库,程序才能运行
release版本:
正式发布时使用
debug版本:
调试阶段使用
67.创建包含多个子目录的目录
voidCreateAllDirectories(CStringstrDir)
//removeending/ifexists
if(strDir.Right
(1)=="
\\"
strDir=strDir.Left(strDir.GetLength()-1);
//basecase...ifdirectoryexists
if(GetFileAttributes(strDir)!
=-1)
return;
//recursivecall,onelessdirectory
intnFound=strDir.ReverseFind('
\\'
CreateAllDirectories(strDir.Left(nFound));
//actualwork
CreateDirectory(strDir,NULL);
68.ReverseFind()
#include<
STDIO.H>
AFX.H>
intmain()
CStrings;
s.Format("
abcdefghijk"
intnPos=s.ReverseFind('
a'
printf("
nPosis%d\n"
nPos);
return0;
其中,'
对应的nPos是0,'
h'
对应的nPos是7,以此类推。
但是:
s.ReverseFind('
)和s.Find('
)的结果是一样的。
问题是:
ReverseFind()和Find()有什么区别呢:
对于ReverseFind(),查找顺序是从后往前,找到后的nPos是按前后顺序排列的。
而Find()是从前往后查的,找到后的nPos也是按前后顺序排列的。
69.MDI中如何只屏蔽掉子框架的右上角的关闭按钮
intCChildFrame:
OnCreate(LPCREATESTRUCTlpCreateStruct)
if(CMDIChildWnd:
OnCreate(lpCreateStruct)==-1)
return-1;
CMenu*pSysMenu=GetSystemMenu(FALSE);
pSysMenu->
EnableMenuItem(SC_CLOSE,MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
70.程序如何删除自己
/////////////////////////////////////////////////
intWINAPIWinMain(HINSTANCEh,HINSTANCEb,LPSTRpsz,intn){
//IsthistheOriginalEXEorthecloneEXE?
//Ifthecommand-line1argument,thisistheOriginalEXE
//Ifthecommand-line>
1argument,thisisthecloneEXE
if(__argc==1){
//OriginalEXE:
SpawncloneEXEtodeletethisEXE
//CopythisEXEcutableimageintotheuser'
stempdirectory
TCHARszPathOrig[_MAX_PATH],szPathClone[_MAX_PATH];
GetModuleFileName(NULL,szPathOrig,_MAX_PATH);
GetTempPath(_MAX_PATH,szPathClone);
GetTempFileName(szPathClone,__TEXT("
Del"
),0,szPathClone);
CopyFile(szPathOrig,szPathClone,FALSE);
//***注意了***:
//OpenthecloneEXEusingFILE_FLAG_DELETE_ON_CLOSE
HANDLEhfile=CreateFile(szPathClone,0,FILE_SHARE_READ,NULL,OPEN_EXISTI
NG,FILE_FLAG_DELETE_ON_CLOSE,NULL);
//SpawnthecloneEXEpassingitourEXE'
sprocesshandle
//andthefullpathnametotheOriginalEXEfile.
TCH
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MFC 技巧 终结