VC编程小技巧.docx
- 文档编号:4890127
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:18
- 大小:27.25KB
VC编程小技巧.docx
《VC编程小技巧.docx》由会员分享,可在线阅读,更多相关《VC编程小技巧.docx(18页珍藏版)》请在冰豆网上搜索。
VC编程小技巧
窗口篇
让窗口一启动就最大化
把应用程序类(CxxxApp)的InitInstance()函数中的
m_pMainWnd->ShowWindow(SW_SHOW); 改为
m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED);
则窗口一启动就最大化显示。
如何设置窗口的初始尺寸
在将应用程序类(CxxAPP)的InitInstance()函数中加入:
m_pMainWnd->SetWindowPos(NULL,x,y,Width,Height,SWP_NOMOVE);
Width为窗口宽度,Height为窗口高度
SWP_NOMOVE表示忽略位置(x,y)。
如:
BOOL CDzyApp:
:
InitInstance()
{
AfxEnableControlContainer();
……
// The one and only window has been initialized, so show and update it.
m_pMainWnd->SetWindowPos(NULL,0,0,750,555,SWP_NOMOVE);//设置窗口的初始大小为750*555
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
return TRUE;
}
让窗口居中显示
以下两种方法可任选其一:
①在应用程序类(CxxxApp)的InitInstance()函数中加入:
m_pMainWnd->CenterWindow(GetDesktopWindow());
②在主框架类(MainFrm.cpp)的OnCreate()函数中加入:
CenterWindow(GetDesktopWindow());
如:
int CMainFrame:
:
OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd:
:
OnCreate(lpCreateStruct) == -1)
return -1;
……
// TODO:
Delete these three lines if you don't want the toolbar to
// be dockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
CenterWindow( GetDesktopWindow() ); //使窗口打开时处于屏幕正中
return 0;
}
如何修改窗口标题
窗口标题一般形式为:
文档标题-程序标题
1、设置文档标题:
在文档类(CxxxDoc)的OnNewDocument()函数中加入语句:
SetTitle("文档名");
如:
TextEditorDoc.cpp:
BOOL CTextEditorDoc:
:
OnNewDocument()
{
if (!
CDocument:
:
OnNewDocument())
return FALSE;
// TODO:
add reinitialization code here
// (SDI documents will reuse this document)
SetTitle("未命名.txt"); //设置文档标题
return TRUE;
}
2、设置程序标题:
在框架类(CMainFrame)的PreCreateWindow()函数中加入语句:
m_strTitle=_T("程序标题");
如:
MainFrm.cpp:
BOOL CMainFrame:
:
PreCreateWindow(CREATESTRUCT& cs)
{
if( !
CFrameWnd:
:
PreCreateWindow(cs) )
return FALSE;
// TODO:
Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
m_strTitle = _T("文本整理器"); //设置程序标题
return TRUE;
}
以上两点比较适用于视图-文档结构的程序,在新建文档时,系统会自动运行OnNewDocument()函数,在其中可以设置合适的标题。
对于未采用文档的程序可以用下面的方法修改标题:
3、修改窗口标题:
修改窗口标题一般在打开文件函数OnFileOpen()和另存为函数OnFileSaveAs()中进行,可以使用下面的函数:
AfxGetMainWnd()->SetWindowText("文档标题"+"-"+"程序标题");
其中文档标题和程序标题可使用定义过的串变量。
项目篇
如何干净的删除一个类?
1、先删除项目中对应的.h和.cpp文件,(选中后用Delete键删除)
2、保存后退出项目,到文件夹中删除实际的.h和.cpp文件;
3、删除.clw文件;
4、重新进入项目,进行全部重建(rebuildall)。
如何建立一个新类?
从“插入”(Insert)菜单中选择“新建类”(NewClass),在弹出的对话框中选择基类(Baseclass),在Name中输入新类的名字(一般都以C开头)即可。
如果想要建立一个没有基类的自定义类,则在NewClass对话框中把Classtype设置为generic,再输入类名即可。
如何把外来文件添加到项目中?
先把外来文件复制到当前项目的目录下,从“项目”(Project)菜单下选择“添加项目”(AddtoProject)下的“Files”菜单项,从弹出的打开文件对话框中把外来文件打开即可。
如何在一个工作区中打开多个项目?
一般编程者都有这样的经历:
做了一个项目,由于不满意,想从头重做,但又想把旧项目的一些可用内容拷到新项目中来,以免做重复工作,这时就需要在新项目中打开旧项目。
先打开新项目,从“项目”(Project)菜单下选择“插入项目到工作区”(InsertProjectintoWorkspace),从弹出的打开文件对话框中打开旧项目的.asp文件即可。
之后,可以利用“项目”(Project)菜单下的“设置活动项目”(SelectActiveProject)的选项中切换各打开的项目。
注意:
在一个工作区中打开的各项目不能同名。
如何把项目中的文件分类存放?
当我们往项目中添加新类时,它会把源文件放在SourceFiles下,头文件放在HeaderFiles下。
当项目中文件很多时,管理不便,最好添加新节点,把文件分类放置。
右击项目节点树的根节点,选择“NewFolder...”,在弹出的对话框中填入新节点名,则新节点就建立了,用鼠标节点树中的文件拖入新节点,就可以把文件分类了。
以上分类只是在项目的节点树中分类,它不影响文件在磁盘上的位置,所有.cpp文件和.h文件仍在项目的根目录下,最好文件本身也能分类存放在不同文件夹中。
在Windows下,用“新建文件夹”在项目的根目录下建立子文件夹,如DialogClass,把所有对话框类的.cpp文件和.h文件拖入其中。
回到VC下,右键单击项目树中更改了路径的节点,选择“Properties”,在弹出的对话框中修改文件路径,如:
把原路径“.\Dialog1.cpp”改为“.\DialogClass\Dialog1.cpp”。
打开Dialog1.cpp文件,修改它包含的文件路径。
如:
#include"stdafx.h"
#include"PluckBox.h"
#include"Dialog1.h"
改为:
#include"stdafx.h"
#include"..\\PluckBox.h"
#include"Dialog1.h"
打开ClassWizard,它会提示你文件不存在,单击“确定”后,从对话框中用“Browse...”选择文件所在路径,则ClassWizard也可正常使用了。
编辑篇
编辑代码时,跟随提示消失了怎么办?
单击“工具”(Tools)菜单中的“设置”(Options)菜单项,在弹出的Options对话框中选择Editor制表页,把它最下方的四个复选框都选中(Autolistmember、Autotypeinfo、Codecomments、Autoparameterinfo),这样,当用户输入“->”或“.”时,会自动显示跟随提示,减少了输入负担。
对话框篇
如何修改对话框的背景色
在对话框的OnPaint()函数中加入下面语句:
CRectrect;
GetClientRect(&rect); //计算对话框的尺寸
dc.FillSolidRect(&rect,RGB(192,248,202)); //绘制对话框背景色
如何让弹出式对话框具有统一的背景色
在应用程序类CxxxApp的InitInstance()函数中加入下面的语句:
SetDialogBkColor(RGB(192,248,202));
则所有用户定义的弹出式对话框都以RGB(192,248,202)为背景色,就不需要逐个进行设置了。
如何让打开文件对话框能进行多项选择
在定制打开文件对话框时,增加OFN_ALLOWMULTISELECT属性,就可以使打开文件对话框进行多选了。
如:
CFileDialogm_Dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT
|OFN_ALLOWMULTISELECT,NULL,NULL);
之后,用GetStartPosition()函数获取选择的起始文件位置,用GetNextPathName()函数获取各位置上的文件名。
如:
if(m_Dlg.DoModal()==IDOK)
{
POSITIONpos;
pos=m_Dlg.GetStartPosition();
while(pos)
{
m_Path=m_Dlg.GetNextPathName(pos);
…………
}
}
为什么用打开文件对话框选择多个文件到一定数目时,文件没有打开?
CFileDialog为文件列表设置有缓冲区,当选择文件过多时,会造成缓冲区溢出,造成一些文件没有被打开。
可以采用自定义大缓冲区代替系统缓冲区的方法解决。
如:
CFileDialogm_Dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT
|OFN_ALLOWMULTISELECT,NULL,NULL);//定制打开文件对话框
char*pBuf=newchar[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()函数弹出提示对话框。
这个函数原型为:
intMessageBox(LPCTSTRlpszText,LPCTSTRlpsCaption=NULL,UINTnType=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:
第四个按钮为缺省按钮。
例:
提示文件是否存盘:
intt;
t=MessageBox(m_PathName+"的文字已经改变,要存盘吗?
",
"警告",MB_YESNOCANCEL|MB_ICONWARNING);
if(t==0||t==IDCANCEL)
return;
if(t==IDYES)
OnFileSave();
在文档类等其它类中不能使用MFC中的MessageBox()函数,只能使用API函数中的MessageBox()函数:
intMessageBox(HWNDhWnd,LPCTSTRlpszText,LPCTSTRlpCaption,UINTUType);
hWnd:
标识将被创建的消息框的拥有窗口。
如果此参数为NULL,则消息框没有拥有窗口。
后三个参数与视类的MessageBox相同,但没有缺省值,必须设置。
例:
:
:
MessageBox(NULL,m_PathName+"的文字已经改变,要存盘吗?
",
"警告",MB_YESNOCANCEL|MB_ICONWARNING);
调试篇
errorC2146:
syntaxerror:
missing';'beforeidentifier……
如果出现这个错误且错误数目很多,通常并不是缺失了分号引起的,而是忘记了添加某头文件引起的。
最常见的是新加入了对话框,然后用它的类定义了一个对象,再编译出现上面的错误。
解决方法是在引用新类的文件中加入#include"类名.h",再编译,错误消失。
fatalerrorC1010:
unexpectedendoffilewhilelookingforprecompiledheaderdirective
在一个项目中,如果用“New”向工程中添加了一个.cpp文件,编译,出错。
解决方法:
在新建的.cpp文件的开头加入#include"stdafx.h"。
发布篇
Debug模式和Release模式
早就发现用VC编译出来的.exe文件比用TurboC编译出来的文件大了许多,于是就认为VC编译时一定加了很多没用的东西,记得当时还做过把VC自动生成的项目中自认为没用的函数都删掉的傻事。
后来才从网上的文章中了解到还有编译模式一说。
Debug模式是用来调试用的,它生成的执行文件中含有大量调试信息,所以很大;
Release模式生成的执行文件消除了这些调试信息,可用来作为成品发布。
默认情况下是Debug模式,切换方法是在“编译”(Build)菜单中选“设置项目配置”(SetActiveConfigure)。
从弹出的对话框中选择Win32Release模式,然后再重新编译。
这时在工作目录下会多出一个Release目录,其中的exe文件比Debug目录下的那个要小得多。
动态链接库和静态链接库
用VC做好了一个程序,拿到别人那里却不能运行,这也是很多编程者都经历过的,这样的软件只能在安装有VC的机器上运行,也不应拿出去发布。
实际上如果你没有使用ActiveX控件和自定义的动态DLL技术,只需把MFC的动态链接库打包到你的程序里就可以了,也就是使用静态链接库。
设置方法:
从“项目”(Project)菜单下选择“设置”(Settings),在弹出的对话框中的General选项卡下,把“UserMFCinaSharedDLL”改为“UserMFCinaStaticLibrary”,关闭对话框后重新编译即可。
在静态链接库下编译的文件比动态链接库的要大很多,不过,如果使用Release模式编译,一般也就几百K,它就可以在没有安装VC的机器上运行了。
发布VC源代码时,哪些文件可以删除?
源代码是给其他VC爱好者提供参考的,如果把所有文件都打包会很大,而且也没有必要,所以为他人提供源代码时可以删除一些不必要的文件。
①可删除Debug文件夹和Release文件夹;
②原则上还可删除主文件夹中所有图标为
的文件,包括.aps、.ncb、.opt、.plg等文件,它们都能在编译时重建。
但一般.clw不要删除,它可能导致ClassWizard不好用。
控件篇
如何隐藏和显示控件
用CWnd类的函数BOOLShowWindow(intnCmdShow)可以隐藏或显示一个控件。
例1:
CWnd*pWnd;
pWnd=GetDlgItem(IDC_EDIT1); //获取控件指针,IDC_EDIT为控件ID号
pWnd->ShowWindow(SW_HIDE); //隐藏控件
例2:
CWnd*pWnd;
pWnd=GetDlgItem(IDC_EDIT1); //获取控件指针,IDC_EDIT为控件ID号
pWnd->ShowWindow(SW_SHOW); //显示控件
按钮的使能与禁止
用ClassWizard的MemberVariables为按钮定义变量,如:
m_Button1;
则
m_Button1.EnableWindow(true); 使按钮处于允许状态
m_Button1.EnableWindow(false); 使按钮被禁止,并变灰显示
改变控件的大小和位置
用CWnd类的函数MoveWindow()或SetWindowPos()可以改变控件的大小和位置。
voidMoveWindow(intx,inty,intnWidth,intnHeight);
voidMoveWindow(LPCRECTlpRect);
第一种用法需给出控件新的坐标和宽度、高度;
第二种用法给出存放位置的CRect对象;
例:
CWnd*pWnd;
pWnd=GetDlgItem(IDC_EDIT1); //获取控件指针,IDC_EDIT1为控件ID号
pWnd->MoveWindow(CRect(0,0,100,100)); //在窗口左上角显示一个宽100、高100的编辑控件
SetWindowPos()函数使用更灵活,多用于只修改控件位置而大小不变或只修改大小而位置不变的情况:
BOOLSetWindowPos(constCWnd*pWndInsertAfter,intx,inty,intcx,intcy,UINTnFlags);
第一个参数一般设为NULL;
x、y控件位置;cx、cy控件宽度和高度;
nFlags常用取值:
SWP_NOZORDER:
忽略第一个参数;
SWP_NOMOVE:
忽略x、y,维持位置不变;
SWP_NOSIZE:
忽略cx、cy,维持大小不变;
例:
CWnd*pWnd;
pWnd=GetDlgItem(IDC_BUTTON1); //获取控件指针,IDC_BUTTON1为控件ID号
pWnd->SetWindowPos(NULL,50,80,0,0,SWP_NOZORDER|SWP_NOSIZE); //把按钮移到窗口的(50,80)处
pWnd=GetDlgItem(IDC_EDIT1);
pWnd->SetWindowPos(NULL,0,0,100,80,SWP_NOZORDER|SWP_NOMOVE); //把编辑控件的大小设为(100,80),位置不变
pWnd=GetDlgItem(IDC_EDIT1);
pWnd->SetWindowPos(NULL,0,0,100,80,SWP_NOZORDER); //编辑控件的大小和位置都改变
以上方法也适用于各种窗口。
单选按钮控件(RadioButton)的使用
一、对单选按钮进行分组:
每组的第一个单选按钮设置属性:
Group,Tabstop,Auto;其余按钮设置属性Tabstop,Auto。
如:
Radio1、Radio2、Radio3为一组,Radio4、Radio5为一组
设定Radio1属性:
Group,Tabstop,Auto
设定Radio2属性:
Tabstop,Auto
设定Radio3属性:
Tabstop,Auto
设定Radio4属性:
Group,Tabstop,Auto
设定Radio5属性:
Tabstop,Auto
二、用ClassWizard为单选控件定义变量,每组只能定义一个。
如:
m_Radio1、m_Radio4。
三、用ClassWizard生成各单选按钮的单击消息函数,并加入内容:
voidCWEditView:
:
OnRadio1()
{
m_Radio1=0; //第一个单选按钮被选中
}
voidCWEditView:
:
OnRadio2()
{
m_Radio1=1; //第二个单选按钮被选中
}
voidCWEditView:
:
OnRadio3()
{
m_Radio1=2; //第三个单选按钮被选中
}
voidCWEditView:
:
OnRadio4()
{
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC 编程 技巧