这篇文章主要介绍了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