VC小技巧汇总之对话框技巧
这篇文章主要介绍了VC小技巧汇总之对话框技巧,非常实用!对于进行VC开发有一定的参考借鉴价值,需要的朋友可以参考下
本文搜集汇总了VC中关于对话框常用的一些技巧,对于进行VC开发由于一定的参考借鉴价值。
1.如何修改对话框的背景色:
在对话框的OnPaint()函数中加入下面语句:
1
2
3
|
CRect rect;
GetClientRect(&rect); //计算对话框的尺寸
dc.FillSolidRect(&rect,RGB(192,248,202)); //绘制对话框背景色
|
3.如何让打开文件对话框能进行多项选择:
在定制打开文件对话框时,增加OFN_ALLOWMULTISELECT属性,就可以使打开文件对话框进行多选了。
如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
CFileDialog m_Dlg( TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT
| OFN_ALLOWMULTISELECT, NULL, NULL );
之后,用GetStartPosition()函数获取选择的起始文件位置,用GetNextPathName()函数获取各位置上的文件名。
如:
if ( m_Dlg.DoModal() == IDOK )
{
POSITION pos;
pos = m_Dlg.GetStartPosition();
while ( pos )
{
m_Path = m_Dlg.GetNextPathName(pos);
…………
}
}
|
4.为什么用打开文件对话框选择多个文件到一定数目时,文件没有打开?
CFileDialog为文件列表设置有缓冲区,当选择文件过多时,会造成缓冲区溢出,造成一些文件没有被打开。可以采用自定义大缓冲区代替系统缓冲区的方法解决。
如:
1
2
3
4
5
6
7
8
|
CFileDialog m_Dlg( TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT
| OFN_ALLOWMULTISELECT, NULL, NULL ); //定制打开文件对话框
char * pBuf = new char [20480]; //申请缓冲区
m_Dlg.m_ofn.nMaxFile = 20480; //让pBuf代替CFileDialog缓冲区
m_Dlg.m_ofn.lpstrFile = pBuf;
m_Dlg.m_ofn.lpstrFile[0] = NULL;
…………
delete []pBuf; //回收缓冲区
|
5.提示对话框(MessageBox)
在视类和对话框类中可使用MFC函数中用的MessageBox()函数弹出提示对话框。这个函数原型为:
1
|
int MessageBox( LPCTSTR lpszText, LPCTSTR lpsCaption=NULL, UINT nType=MB_OK);
|
参数:
lpszText 显示的字符串
lpsCaption 对话框的标题
nType 风格,可为如下值的组合:
指定下列标志中的一个来显示消息框中的按钮,标志的含义如下。
MB_ABORTRETRYIGNORE:消息框含有三个按钮:Abort,Retry和Ignore。
MB_OK:消息框含有一个按钮:OK。这是缺省值。
MB_OKCANCEL:消息框含有两个按钮:OK和Cancel。
MB_RETRYCANCEL:消息框含有两个按钮:Retry和Cancel。
MB_YESNO:消息框含有两个按钮:Yes和No。
MB_YESNOCANCEL:消息框含有三个按钮:Yes,No和Cancel。
指定下列标志中的一个来显示消息框中的图标:标志的含义如下。
MB_ICONEXCLAMATION:
MB_ICONWARNING:一个惊叹号出现在消息框。
MB_ICONINFORMATION:
MB_ICONASTERISK:一个圆圈中小写字母i组成的图标出现在消息框。
MB_ICONOUESTION:一个问题标记图标出现在消息框。
MB_ICONSTOP:
MB_ICONERROR:
MB_ICONHAND:一个停止消息图标出现在消息框。
指定下列标志中的一个来指定缺省的按钮:标志的含义如下。
MB_DEFBUTTON1:第一个按钮为缺省按钮。如果MB_DEFBUTTON2,MB_DEFBUTTON3,MB_DEFBUTTON4没有被指定,则MB_DEFBUTTON1为缺省值。
MB_DEFBUTTON2;第二个按钮为缺省按钮。
MB_DEFBUTTON3:第三个按钮为缺省按钮。
MB_DEFBUTTON4:第四个按钮为缺省按钮。
例:提示文件是否存盘:
1
2
3
4
5
6
|
int t;
t=MessageBox(m_PathName+ "的文字已经改变,要存盘吗?" , "警告" ,MB_YESNOCANCEL | MB_ICONWARNING);
if (t==0 || t==IDCANCEL)
return ;
if (t==IDYES)
OnFileSave();
|
在文档类等其它类中不能使用MFC中的MessageBox()函数,只能使用API函数中的MessageBox()函数:
1
|
int MessageBox( HWND hWnd, LPCTSTR lpszText, LPCTSTR lpCaption, UINT UType);
|
hWnd:标识将被创建的消息框的拥有窗口。如果此参数为NULL,则消息框没有拥有窗口。
后三个参数与视类的MessageBox相同,但没有缺省值,必须设置。
例:
本文搜集汇总VC的5则小技巧,非常实用,对于VC程序设计有很好的参考借鉴价值,详情如下:
1.如何获取程序所在的路径
也就是获取你这个程序本身所在的路径。
在应用程序类CxxApp的头文件中定义一个变量CString m_exePath;用来放置程序的路径名,在应用程序类CxxApp的InitInstance()函数中加入如下语句:
1
2
3
4
5
6
7
8
9
10
11
|
TCHAR m_Path[MAX_PATH];
GetModuleFileName( NULL, m_Path, MAX_PATH ); //获取程序路径(包括程序名)
int i = 0, j;
while ( m_Path[i]!=0 )
{
if ( m_Path[i]=='\' )
j = i;
i++;
}
m_Path[j+1] = '' ;
m_exePath.Format( "%s" , m_Path ); //分离路径名(去掉程序名)
|
这段程序执行后,字符串变量m_exePath中放置的就是程序所在路径,其中不包括程序名。
获取程序的位置有什么用呢?
(1)打开与应用程序在一起放置的数据文件:
如果你运行程序过程中使用过打开文件对话框打开过其它路径下的文件,这时系统的默认路径就发生了改变,有可能使你原定的数据文件打不开了,如果采用以下方法就可以没问题了:
1
2
|
CFile file;
file.Open( m_exePath+ "数据文件名" , CFile::modeRead );
|
(2)放置程序运行中的临时文件:
同样,当系统的默认路径发生改变后,程序中生成的临时文件就会放得到处都是,成了一个个垃圾文件,采用以下方法可使临时文件只放在程序所在路径下:
1
2
3
|
CFile file;
file.Open( m_exePath+ "临时文件名" , CFile::modeCreate | CFile::modeWrite );
……
|
程序结束时,用下面的方法删除临时文件:
1
|
CFile::Remove( m_exePath+ "临时文件名" );
|
2.如何在你的程序中执行其它程序
在自己的程序中调用其它程序的方法有好几种,这里我介绍我用过的两种:
(1)WinExec()函数:
一般用法:
1
|
WinExec(m_PathName,SW_SHOWNORMAL);
|
m_PathName为执行程序的路径名,必须为可执行文件。
如:
1
|
WinExec( "C:\Program Files\Internet Explorer\iexplore.exe" ,SW_SHOWNORMAL); //为打开IE浏览器
|
(2)ShellExecute()函数:
一般用法:
1
|
ShellExecute(NULL,NULL,m_PathName,NULL,_T( "c:\temp" ),SW_SHOWNORMAL);
|
m_PathName为打开的程序路径名;
_T("c:\temp")为工作目录;
与WinExec()不同的是ShellExecute()函数也可以打开非可执行文件,比如你指定的文件为.txt,结果会打开记事本装入该文件。我用这种方法调用自己制作的帮助文件(.chm)效果很好。
3.如果不使用串行化,如何在程序结束时保存文件?
在文档-视图结构中,用串行化自动保存文件在各种VC书上都有介绍。现在的问题是我不使用串行化,而是自己动手保存,当点击窗口的关闭按钮时,如何提示并保存文档。
用ClassWizard在文档类(CxxDoc)中添加函数CanCloseFrame(),再在其中加入保存文件的语句就可以了。
例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
//退出程序
BOOL CEditDoc::CanCloseFrame(CFrameWnd* pFrame)
{
CFile file;
if (b_Flag) //b_Flag为文档修改标志,在修改文档时将其置为True
{
int t;
t=::MessageBox(NULL, "文字已经改变,要存盘吗?" , "警告" ,
MB_YESNOCANCEL | MB_ICONWARNING); //弹出提示对话框
if (t==0 || t==IDCANCEL)
return false ;
if (t==IDYES)
{
CString sFilter= "Text File(*.txt)|*.txt||" ;
CFileDialog m_Dlg(FALSE, "txt" ,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,( LPCTSTR )sFilter,NULL); //定制文件对话框
int k=m_Dlg.DoModal(); //弹出文件对话框
if (k==IDCANCEL || k==0)
return false ;
m_PathName=m_Dlg.GetPathName(); //获取选择的文件路径名
file.Open(m_PathName,CFile::modeCreate | CFile::modeWrite);
file.Write(m_Text,m_TextLen); //数据写入文件
file.Close();
}
}
return CDocument::CanCloseFrame(pFrame);
}
|
这样当你单击窗口上的关闭按钮时,如果数据已修改了,就会弹出一个提示保存数据的对话框,提示你保存数据。
程序中的b_Flag是数据修改标志,应该在修改数据时进行设置,m_Text是准备保存的数据,放在文档内。
4.POSITION怎么用?
POSITION类型数据用于表征各种列表中元素的位置,它类似于数组的下标,但又有所不同。主要区别是:
我们不能访问POSITION型数据的值,也不能对POSITION数据型数据进行加减、比较等运算。
用POSITION型数据访问列表时,都是采用迭代法,一般格式为:
1
2
3
4
5
6
|
POSITION pos; //定义pos型变量
pos = GetHeadPosition(); //获取列表起始元素位置
while ( pos )
{
x = GetNext(pos); //获取pos处的列表值,同时修改pos为下一个元素位置
}
|
GetNext()就是一种迭代,其格式为:
1
|
TYPE GetNext(POSITION& rPosition);
|
首先,它返回当前pos位置处的元素;再就是把pos值修改为下一个元素位置。这样循环时,可依次取得列表中各元素的值;当到达列表尾时,pos为NULL,循环结束。
所以使用POSITION型数据时,你不要试图用加减等操作去修改它,只能用GetNext()(向后迭代)或GetPrev()(向前迭代)反复迭代来修改它的值。
如果你想直接到达指定值,还可以用Find()函数或FindIndex()函数获得指定值的POSITION值。
1
2
|
POSITION Find(TYPE Value); //用于在列表中查找值为Value的元素的POSITION值;
POSITION FindIndex( int nIndex); //用于获取列表中第nIndex个元素的POSITION值,nIndex从0开始。
|
如:
1
2
|
pos = FindIndex(5); //求列表中第5个元素的位置
x = GetNext(pos); //读取元素的值
|
总之,POSITION类型在多种涉及列表的类中提供,不同的类提供的函数有所不同,但用法都是类似的。
5.如何从完整的文件路径中分离文件名和路径名?
从路径中分离文件名:
1
2
3
4
5
6
7
8
9
|
CString GetFileName(CString pathname)
{
for ( int i=pathname.GetLength()-1; i>=0; i-- )
{
if ( pathname[i]=='\' )
break ;
}
return pathname.Mid( i+1 );
}
|
从路径中分离路径名(去除文件名):
1
2
3
4
5
6
7
8
9
10
11
|
CString GetPath(CString pathname)
{
int i = 0, j;
while ( i<pathname.GetLength() )
{
if ( pathname[i]=='\' )
j = i;
i++;
}
return pathname.Left( j+1 );
}
|
http://www.jb51.net/article/52459.htm
VC小技巧汇总之对话框技巧相关推荐
- lodop打印不显示页码_Excel|13个Excel打印技巧汇总,打印技巧大全
打印技巧是工作必备,无需理由! 很多时候大家得不到想要的打印效果,偶尔打印一两张表格,会出现各种状况:标题行不见了?打印范围错了?页眉页脚不对? 打印一个内容,总得弄出一堆草稿纸纸张来之不易,且打且珍 ...
- VC小技巧(三)视图
VC小技巧(三)视图 1. 如何得到视图指针 [ 问题提出] 现在你有一个多线程的Demo, 你想在多线程里处理视图指针里的函数, 我们给这个函数起个名字:Put(); 该如何实现呢? // 有两种方 ...
- 电脑知识 小技巧汇总
小技巧汇总 我综合了网上的有关软件应用的小巧和自己的几个,希望对大家有用,如果你有更好的请跟帖子大家共分享!有关注册表修改的,请先备份注册表! 1. 影音文件在xp中无法删除 很多情况下是因为预览功能 ...
- JAVASCRIPT常用20种小技巧汇总
1.TEXTAREA自适应文字行数的多少 2.脚本永不出错 <script LANGUAGE="javascript"> </script> 3.ENTER ...
- VC显示\关闭\销毁模态与非模态对话框技巧
VC显示,关闭,销毁模态与非模态对话框技巧 显示对话框 显示模式对话框 CDialogDemo dlg; dlg.DoModal(); 显示非模式对话框 CDialogDemo *dlg=new CD ...
- oracle ebs form 计算 汇总公式,Oracle+EBS+Form开发小技巧汇总
oracle form开发的技巧 content Oracle EBS Form开发小技巧汇总 ..................................... 2 Form中Block的重 ...
- php语言常见小知识汇总及发送电子邮件方法和技巧总结[图]
一.php语言常见小知识汇总:快速掌握php就差这一步[图] PHP语言一直是互联网绕不开的语言,同时改语言在互联网编程中占据着重要的地位,几乎所有的互联网方面的小程序都可以通过php语言来完成.因此 ...
- Excel 电子表格运用技巧汇总
Excel 电子表格运用技巧汇总 Leo @ 2005-4-25 13:53 Excel XP的八则快速输入技巧 如果我们在用Excel XP处理庞大的数据信息时,不注意讲究技巧和方法的话,很可能会花 ...
- js word 预览_干货!Word办公软件日常使用技巧汇总
word作为公司必备的操作软件,是每一位职场人士必不可少的文档编辑软件,但是很少有人能把word的功能完全挖掘出来. 本期小编为大家整理了一篇word办公软件日常使用技巧汇总,告诉大家word最实用的 ...
最新文章
- IPv6地址分类及表示方法
- 【Vegas2006】自我介绍for校青春风采大赛
- [wikioi]多源最短路
- 高低层特征融合【转载】
- c#读取dwg零件表_C# 读取CAD文件缩略图(DWG文件)
- 编写自己的tomcat, 并运行tomcat源码于eclipse中
- python 和 的区别_Python中is和==的区别
- 软件设计师教程第5版.PDF.高清
- Android Studio百度地图开发:如何注册和获取百度地图开发密钥?
- 高等数学(第七版)同济大学 习题1-7 个人解答
- 北大慕课(郭炜):程序设计与算法(一)编程题答案(全)
- 如何通过IP共享文件
- 一只小白,在学习delphi.感觉很吃力。。
- android分辨率 尺寸 dpi换算
- 打造智慧城市首选智慧步道
- 中国计算机协会(CCF)
- 魔兽世界运营时间线timeLine(2004-2014)
- 奇兔recovery卡刷教程_vivo X6(双4G)刷Recovery教程
- 聊一聊 vscode 的代码格式化
- 车路协同V2X调研分析