VC++学习方法.docx
- 文档编号:24349923
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:17
- 大小:24.49KB
VC++学习方法.docx
《VC++学习方法.docx》由会员分享,可在线阅读,更多相关《VC++学习方法.docx(17页珍藏版)》请在冰豆网上搜索。
VC++学习方法
网上抄来的vc学习笔记之一
2009年04月10日星期五21:
17
VC学习笔记1:
按钮的使能与禁止
用ClassWizard的MemberVariables为按钮定义变量,如:
m_Button1;
则
m_Button1.EnableWindow(true);使按钮处于允许状态
m_Button1.EnableWindow(false);使按钮被禁止,并变灰显示
VC学习笔记2:
控件的隐藏与显示
用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);//显示控件
以上方法常用于动态生成控件,虽说用控件的Create函数可以动态生成控件,但这种控件很不好控制,所以用隐藏、显示方法不失为一种替代手段。
VC学习笔记3:
改变控件的大小和位置
用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);//编辑控件的大小和位置都改变
以上方法也适用于各种窗口。
VC学习笔记4:
什么时候设定视中控件的初始尺寸?
我在CFormView的视中加入了一个编辑控件,在运行时使它充满客户区,当窗口改变大小时它也跟着改变。
改变控件尺寸可以放在OnDraw()函数中,也可放在CalcWindowRect()函数中,当窗口尺寸发生变化时,它们都将被执行,且CalcWindowRect()函数先于OnDraw()函数,下例是在CalcWindowRect()函数中修改控件尺寸。
重载VIEW类的CalcWindowRect函数,把设定控件的尺寸的语句加入这个函数中。
例:
voidCMyEditView:
:
CalcWindowRect(LPRECTlpClientRect,UINTnAdjustType)
{
//TODO:
Addyourspecializedcodehereand/orcallthebaseclass
CFrameWnd*pFrameWnd=GetParentFrame();//获取框架窗口指针
CRectrect;
pFrameWnd->GetClientRect(&rect);//获取客户区尺寸
CWnd*pEditWnd=GetDlgItem(IDC_MYEDIT);//获取编辑控件指针,IDC_MYEDIT为控件ID号
pEditWnd->SetWindowPos(NULL,0,0,rect.right,rect.bottom-50,SWP_NOMOVE|SWP_NOZORDER);//设定控件尺寸,bottom-50是为了让出状态条位置。
CFormView:
:
CalcWindowRect(lpClientRect,nAdjustType);
}
VC学习笔记5:
单选按钮控件(RidioButton)的使用
一、对单选按钮进行分组:
每组的第一个单选按钮设置属性:
Group,Tabstop,Auto;其余按钮设置属性Tabstop,Auto。
如:
Ridio1、Ridio2、Ridio3为一组,Ridio4、Ridio5为一组
设定Ridio1属性:
Group,Tabstop,Auto
设定Ridio2属性:
Tabstop,Auto
设定Ridio3属性:
Tabstop,Auto
设定Ridio4属性:
Group,Tabstop,Auto
设定Ridio5属性:
Tabstop,Auto
二、用ClassWizard为单选控件定义变量,每组只能定义一个。
如:
m_Ridio1、m_Ridio4。
三、用ClassWizard生成各单选按钮的单击消息函数,并加入内容:
voidCWEditView:
:
OnRadio1()
{
m_Ridio1=0;//第一个单选按钮被选中
}
voidCWEditView:
:
OnRadio2()
{
m_Ridio1=1;//第二个单选按钮被选中
}
voidCWEditView:
:
OnRadio3()
{
m_Ridio1=2;//第三个单选按钮被选中
}
voidCWEditView:
:
OnRadio4()
{
m_Ridio4=0;//第四个单选按钮被选中
}
voidCWEditView:
:
OnRadio5()
{
m_Ridio4=1;//第五个单选按钮被选中
}
四、设置默认按钮:
在定义控件变量时,ClassWizard在构造函数中会把变量初值设为-1,只需把它改为其它值即可。
如:
//{{AFX_DATA_INIT(CWEditView)
m_Ridio1=0;//初始时第一个单选按钮被选中
m_Ridio4=0;//初始时第四个单选按钮被选中
//}}AFX_DATA_INIT
VC学习笔记6:
旋转控件(Spin)的使用
当单击旋转控件上的按钮时,相应的编辑控件值会增大或减小。
其设置的一般步骤为:
一、在对话框中放入一个Spin控件和一个编辑控件作为Spin控件的伙伴窗口,
设置Spin控件属性:
Autobuddy、Setbuddyinteger、Arrowkeys
设置文本控件属性:
Number
二、用ClassWizard为Spin控件定义变量m_Spin,为编辑控件定义变量m_Edit,定义时注意要把m_Edit设置为int型。
三、在对话框的OnInitDialog()函数中加入语句:
BOOLCMyDlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
m_Spin.SetBuddy(GetDlgItem(IDC_EDIT1));//设置编辑控件为Spin控件的伙伴窗口
m_Spin.SetRange(0,10);//设置数据范围为0-10
returnTRUE;
}
四、用ClassWizard为编辑控件添加EN_CHANGE消息处理函数,再加入语句:
voidCMyDlg:
:
OnChangeEdit1()
{
m_Edit=m_Spin.GetPos();//获取Spin控件当前值
}
OK!
VC学习笔记7:
程序结束时保存文件问题
在文档-视图结构中,用串行化自动保存文件在各种VC书上都有介绍。
现在的问题是我不使用串行化,而是自己动手保存,当点击窗口的关闭按钮时,如何提示并保存文档。
用ClassWizard在文档类(CxxDoc)中添加函数CanCloseFrame(),再在其中加入保存文件的语句就可以了。
注:
要保存的数据应放在文档类(CxxDoc)或应用程序类(CxxApp)中,不要放在视图类中。
例:
//退出程序
BOOLCEditDoc:
:
CanCloseFrame(CFrameWnd*pFrame)
{
CFilefile;
if(b_Flag)//b_Flag为文档修改标志,在修改文档时将其置为True
{
intt;
t=:
:
MessageBox(NULL,"文字已经改变,要存盘吗?
","警告",
MB_YESNOCANCEL|MB_ICONWARNING);//弹出提示对话框
if(t==0||t==IDCANCEL)
returnfalse;
if(t==IDYES)
{
CStringsFilter="TextFile(*.txt)|*.txt||";
CFileDialogm_Dlg(FALSE,"txt",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,(LPCTSTR)sFilter,NULL);//定制文件对话框
intk=m_Dlg.DoModal();//弹出文件对话框
if(k==IDCANCEL||k==0)
returnfalse;
m_PathName=m_Dlg.GetPathName();//获取选择的文件路径名
file.Open(m_PathName,CFile:
:
modeCreate|CFile:
:
modeWrite);
file.Write(m_Text,m_TextLen);//数据写入文件
file.Close();
}
}
returnCDocument:
:
CanCloseFrame(pFrame);
}
VC学习笔记8:
UpdateData()
对于可以接收数据的控件,如编辑控件来说,UpdateData()函数至关重要。
当控件内容发生变化时,对应的控件变量的值并没有跟着变化,同样,当控件变量值变化时,控件内容也不会跟着变。
UpdateData()函数就是解决这个问题的。
UpdateData(true);把控件内容装入控件变量
UpdateData(false);用控件变量的值更新控件
如:
有编辑控件IDC_EDIT1,对应的变量为字符串m_Edit1,
1、修改变量值并显示在控件中:
m_Edit1=_T("结果为50");
UpdateData(false);
2、读取控件的值到变量中:
用ClassWizard为IDC_EDIT1添加EN_CHANGE消息处理函数,
voidCEditView:
:
OnChangeEdit1()
{
UpdateData(true);
}
查看文章
网上抄来的vc学习笔记之二
2009年04月10日星期五21:
18
VC学习笔记1:
几个指针
为了在视类中能够调用放在其它类中的数据或函数,应该先获得相应类的指针。
1、指向文档类(CxxDoc)的指针:
CxxDoc*pDoc=GetDocument();//文档指针
则用pDoc->xxxx的方法可在视类中访问文档类中的变量和函数。
2、指向应用程序类(CxxApp)的指针:
CxxApp*app=(CxxApp*)AfxGetApp();//应用程序指针
用app->xxxx的方法可在文档类或视类中调用CxxApp中放置的数据了。
我一般把文档和视公用的数据放在CxxApp类中,再用以上方法访问。
3、指向主框架(CMainFrame)的指针:
CFrameWnd*pFrameWnd=GetParentFrame();//获取框架窗口指针
用pFrameWnd->xxxx访问CWnd类的函数。
这种方法多用于获取窗口的位置、大小等操作,用于视类。
4、指向某一控件的指针:
如:
CWnd*pEdit=GetDlgItem(IDC_EDIT1);//获取编辑控件指针
IDC_EDIT1为控件ID号。
这主要是为了能修改控件大小、位置,获取控件风格等。
5、指向状态条的指针:
CStatusBar*pStatus;//状态栏指针
pStatus=(CStatusBar*)(app->m_pMainWnd->GetDescendantWindow(ID_VIEW_STATUS_BAR));
app为上面的应用程序指针。
这主要是为了更改状态栏中显示的内容。
VC学习笔记2:
状态栏:
1、在状态栏中显示提示:
CxxApp*app=(CxxApp*)AfxGetApp();//应用程序指针
CStatusBar*pStatus;//状态栏指针
if(pStatus)
{
pStatus=(CStatusBar*)(app->m_pMainWnd->GetDescendantWindow(ID_VIEW_STATUS_BAR));
pStatus->SetPaneText(0,str);//0为状态栏窗格号,str为显示的字符串
}
2、在状态栏中增加窗格:
下例中增加了三个新窗格:
(1)修改MainFrm.cpp:
staticUINTindicators[]=
{
ID_SEPARATOR,//statuslineindicator
ID_SEPARATOR,//新增窗格1:
放置总字节数
ID_SEPARATOR,//新增窗格2:
半角字数
ID_SEPARATOR,//新增窗格3:
全角字数
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
intCMainFrame:
:
OnCreate(LPCREATESTRUCTlpCreateStruct)
{
if(CFrameWnd:
:
OnCreate(lpCreateStruct)==-1)
return-1;
if(!
m_wndToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_TOP
|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)||
!
m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failedtocreatetoolbar\n");
return-1;//failtocreate
}
if(!
m_wndStatusBar.Create(this)||
!
m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failedtocreatestatusbar\n");
return-1;//failtocreate
}
m_wndStatusBar.SetPaneInfo(1,ID_SEPARATOR,0,95);//设置新增窗格1的宽度
m_wndStatusBar.SetPaneInfo(2,ID_SEPARATOR,0,100);//设置新增窗格2的宽度
m_wndStatusBar.SetPaneInfo(3,ID_SEPARATOR,0,100);//设置新增窗格3的宽度
…………
}
(2)在新窗格中显示内容
以下程序为视类中显示状态信息的部分,
CStatusBar*pStatus=(CStatusBar*)AfxGetApp()->m_pMainWnd->GetDescendantWindow(ID_VIEW_STATUS_BAR);
if(pStatus)
{
CStringstr;
str.Format("字节数:
%d",len);
pStatus->SetPaneText(1,str);//在窗格1显示内容
str.Format("半角字符:
%d",chnum);
pStatus->SetPaneText(2,str);//在窗格2显示内容
str.Format("全角字符:
%d",hannum/2);
pStatus->SetPaneText(3,str);//在窗格3显示内容
}
VC学习笔记3:
设置程序窗口的初始大小:
在应用程序类(CxxAPP)的InitInstance函数中加入:
m_pMainWnd->SetWindowPos(NULL,x,y,Width,Height,SWP_NOMOVE);
Width为窗口宽度,Height为窗口高度
SWP_NOMOVE表示忽略位置(x,y)。
如:
BOOLCDzyApp:
:
InitInstance()
{
AfxEnableControlContainer();
……
//Theoneandonlywindowhasbeeninitialized,soshowandupdateit.
m_pMainWnd->SetWindowPos(NULL,0,0,750,555,SWP_NOMOVE);//设置窗口的初始大小为750*555
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
returnTRUE;
}
VC学习笔记4:
如何让窗口一启动就最大化?
方法一:
将应用程序类(CxxAPP)的InitInstance函数中的
m_pMainWnd->ShowWindow(SW_SHOW);改为
m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED);//让窗口一启动就最大化
例:
BOOLCMyEditApp:
:
InitInstance()
{
…………
m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED);
…………
}
方法二:
在应用程序类(CxxAPP)的InitInstance函数中设定m_nCmdShow的取值.
m_nCmdShow=SW_SHOWMAXIMIZED;//最大化
m_nCmdShow=SW_SHOWMINIMIZED;//最小化
m_nCmdShow=SW_SHOWNORMAL;//正常方式
例:
BOOLCMyEditApp:
:
InitInstance()
{
AfxEnableControlContainer();
m_nCmdShow=SW_SHOWMAXIMIZED;//最大化
//Standardinitialization
//Ifyouarenotusingthesefeaturesandwishtoreducethesize
//ofyourfinalexecutable,youshouldremovefromthefollowing
//thespecificinitializationroutinesyoudonotneed.
#ifdef_AFXDLL
Enable3dControls();//CallthiswhenusingMFCinasharedDLL
#else
Enable3dControlsStatic();//CallthiswhenlinkingtoMFCstatically
#endif
…………
}
VC学习笔记5:
使窗口打开时处于屏幕正中:
在MainFrm.cpp文件的OnCreate函数中加入:
CenterWindow(GetDesktopWindow());
即可。
如:
intCMainFrame:
:
OnCreate(LPCREATESTRUCTlpCreateStruct)
{
if(CFrameWnd:
:
OnCreate(lpCreateStruct)==-1)
return-1;
……
//TODO:
Deletethesethreelinesifyoudon'twantthetoolbarto
//bedockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
CenterWindow(GetDesktopWindow());//使窗口打开时处于屏幕正中
return0;
}
VC学习笔记6:
修改程序窗口标题:
窗口标题一般形式为:
文档标题-程序标题
1、修改文档标题:
文档标题是由工程中相应的文档类所控制的,因此我们可以在文档中利用SetTitle()函数来改变文档标题。
在文档类的OnNewDocument()函数中加入语句:
BOOLCWEditDoc:
:
OnNewDocument()
{
if(!
CDocument:
:
OnNewDocument())
returnFALSE;
//TODO:
addreinitializationcodehere
//(SDIdocumentswillreusethisdocument)
SetTitle("未命名");//设置文档标题
returnTRUE;
}
2、修改程序标题:
在MainFrm.cpp的PreCreateWindow()函数中加入:
BOOLCMainFrame:
:
PreCreateWindow(CREATESTRUCT&cs)
{
if(!
CFrameWnd:
:
PreCreat
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC 学习方法
![提示](https://static.bdocx.com/images/bang_tan.gif)