对话框

来源:互联网 发布:腾讯微博数据集 编辑:程序博客网 时间:2024/05/09 13:49

 

对话框
如何修改对话框的背景色
在对话框的OnPaint()函数中加入下面语句:
CRect rect;
GetClientRect(&rect); //计算对话框的尺寸
dc.FillSolidRect(&rect,RGB(192,248,202)); //绘制对话框背景色

如何让弹出式对话框具有统一的背景色
在应用程序类CxxxApp的InitInstance()函数中加入下面的语句:
SetDialogBkColor( RGB(192,248,202) );
则所有用户定义的弹出式对话框都以RGB(192,248,202)为背景色,就不需要逐个进行设置了。


如何让打开文件对话框能进行多项选择
在定制打开文件对话框时,增加OFN_ALLOWMULTISELECT属性,就可以使打开文件对话框进行多选了。
如:
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);
…………
}
}

为什么用打开文件对话框选择多个文件到一定数目时,文件没有打开?
CFileDialog为文件列表设置有缓冲区,当选择文件过多时,会造成缓冲区溢出,造成一些文件没有被打开。可以采用自定义大缓冲区代替系统缓冲区的方法解决。
如:
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; //回收缓冲区

提示对话框(MessageBox)
在视类和对话框类中可使用MFC函数中用的MessageBox()函数弹出提示对话框。这个函数原型为:
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:第四个按钮为缺省按钮。
例:提示文件是否存盘:
int t;
t=MessageBox(m_PathName+"的文字已经改变,要存盘吗?",
"警告",MB_YESNOCANCEL | MB_ICONWARNING);
if(t==0 || t==IDCANCEL)
return;
if(t==IDYES)
OnFileSave();
在文档类等其它类中不能使用MFC中的MessageBox()函数,只能使用API函数中的MessageBox()函数:
int MessageBox(HWND hWnd,LPCTSTR lpszText,LPCTSTR lpCaption,UINT UType);
hWnd:标识将被创建的消息框的拥有窗口。如果此参数为NULL,则消息框没有拥有窗口。
后三个参数与视类的MessageBox相同,但没有缺省值,必须设置。
例:::MessageBox(NULL,m_PathName+"的文字已经改变,要存盘吗?",
"警告",MB_YESNOCANCEL | MB_ICONWARNING);
调试
error C2146: syntax error : missing ';' before identifier ……
如果出现这个错误且错误数目很多,通常并不是缺失了分号引起的,而是忘记了添加某头文件引起的。
最常见的是新加入了对话框,然后用它的类定义了一个对象,再编译出现上面的错误。
解决方法是在引用新类的文件中加入#include "类名.h",再编译,错误消失。

fatal error C1010: unexpected end of file while looking for precompiled header directive
在一个项目中,如果用“New”向工程中添加了一个.cpp文件,编译,出错。
解决方法:
  1) 在新建的.cpp文件的开头加入#include "stdafx.h"。
  2) 可以使用右键点击项目工程中的该cpp文件,选择setting,在c/c++栏,选择PreCompiled headers,然后设置第一选项,选择不使用预编译头,解决这个问题。发布
Debug模式和Release模式
早就发现用VC编译出来的.exe文件比用Turbo C编译出来的文件大了许多,于是就认为VC编译时一定加了很多没用的东西,记得当时还做过把VC自动生成的项目中自认为没用的函数都删掉的傻事。后来才从网上的文章中了解到还有编译模式一说。
Debug模式是用来调试用的,它生成的执行文件中含有大量调试信息,所以很大;
Release模式生成的执行文件消除了这些调试信息,可用来作为成品发布。
默 认情况下是Debug模式,切换方法是在“编译”(Build)菜单中选“设置项目配置”(Set Active Configure)。从弹出的对话框中选择Win32 Release模式,然后再重新编译。这时在工作目录下会多出一个Release目录,其中的exe文件比Debug目录下的那个要小得多。
动态链接库和静态链接库
用VC 做好了一个程序,拿到别人那里却不能运行,这也是很多编程者都经历过的,这样的软件只能在安装有VC的机器上运行,也不应拿出去发布。实际上如果你没有使 用ActiveX控件和自定义的动态DLL技术,只需把MFC的动态链接库打包到你的程序里就可以了,也就是使用静态链接库。
设置方法:从“项目”(Project)菜单下选择“设置” (Settings),在弹出的对话框中的General选项卡下,把“User MFC in a Shared DLL”改为“User MFC in a Static Library”,关闭对话框后重新编译即可。
在静态链接库下编译的文件比动态链接库的要大很多,不过,如果使用Release模式编译,一般也就几百K,它就可以在没有安装VC的机器上运行了。

四、设置默认按钮:
在定义控件变量时,ClassWizard在构造函数中会把变量初值设为-1,只需把它改为其它值即可。
如:
//{{AFX_DATA_INIT(CWEditView)
m_Ridio1 = 0; //初始时第一个单选按钮被选中
m_Ridio4 = 0; //初始时第四个单选按钮被选中
//}}AFX_DATA_INIT
旋转控件(Spin)的使用
当单击旋转控件上的按钮时,相应的编辑控件值会增大或减小。其设置的一般步骤为:
一、在对话框中放入一个Spin控件和一个编辑控件作为Spin控件的伙伴窗口
设置Spin控件属性:Auto buddy、Set buddy integer、Arrow keys
设置文本控件属性:Number
二、用ClassWizard为Spin控件定义变量m_Spin,为编辑控件定义变量m_Edit,定义时注意要把m_Edit设置为int型。
三、在对话框的OnInitDialog()函数中加入语句:
BOOL CMyDlg::OnInitDialog()
{
CDialog::OnInitDialog();

m_Spin.SetBuddy( GetDlgItem( IDC_EDIT1 ) ); //设置编辑控件为Spin控件的伙伴窗口
m_Spin.SetRange( 0, 10 ); //设置数据范围为0-10
return TRUE;
}
四、用ClassWizard为编辑控件添加EN_CHANGE消息处理函数,再加入语句:
void CMyDlg::OnChangeEdit1()
{
m_Edit = m_Spin.GetPos(); //获取Spin控件当前值
}

UpdateData()
对于可以接收数据的控件,如编辑控件来说,UpdateData()函数至关重要。当控件内容发生变化时,对应的控件变量的值并没有跟着变化,同样,当控件变量值变化时,控件内容也不会跟着变。
UpdateData()函数就是解决这个问题的。
UpdateData(true); 把控件内容装入控件变量
UpdateData(false); 用控件变量的值更新控件
如:有编辑控件IDC_EDIT1,对应的变量为字符串m_Edit1,
1、修改变量值并显示在控件中:
m_Edit1 = _T("结果为50");
UpdateData(false);
2、读取控件的值到变量中:
用ClassWizard为IDC_EDIT1添加EN_CHANGE消息处理函数,这个函数在编辑控件内容发生变化时执行。
void CEditView::OnChangeEdit1()
{
UpdateData(true); //更新变量值
}
其它
如何获取程序所在的路径
也就是获取你这个程序本身所在的路径。
在应用程序类CxxApp的头文件中定义一个变量CString m_exePath;用来放置程序的路径名,在应用程序类CxxApp的InitInstance()函数中加入如下语句:
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] = '/0';
m_exePath.Format( "%s", m_Path ); //分离路径名(去掉程序名)
这段程序执行后,字符串变量m_exePath中放置的就是程序所在路径,其中不包括程序名。
获取程序的位置有什么用呢?
1、打开与应用程序在一起放置的数据文件:
如果你运行程序过程中使用过打开文件对话框打开过其它路径下的文件,这时系统的默认路径就发生了改变,有可能使你原定的数据文件打不开了,如果采用以下方法就可以没问题了:
CFile file;
file.Open( m_exePath+"数据文件名", CFile::modeRead );
2、放置程序运行中的临时文件:
同样,当系统的默认路径发生改变后,程序中生成的临时文件就会放得到处都是,成了一个个垃圾文件,采用以下方法可使临时文件只放在程序所在路径下:
CFile file;
file.Open( m_exePath+"临时文件名", CFile::modeCreate | CFile::modeWrite );
……
程序结束时,用下面的方法删除临时文件:
CFile::Remove( m_exePath+"临时文件名" );

原创粉丝点击