1.状态栏上显示时间
void CMainFrame::OnUpdateTime(CCmdUI* pCmdUI)
{
CTime timeCur=CTime::GetCurrentTime();
char szOut[20];
sprintf( szOut,"%02d:%02d:%02d",timeCur.GetHour(),timeCur.GetMinute(),timeCur.GetSecond());
pCmdUI->SetText(szOut);
}
CTime time;//构建了一个CTime对象time
time=CTime::GetCurrentTime();//获得当前的系统时间
CString s=time.Format("%H:%M:%S");//返回一个按时:分:秒的格式表示的字符串
2. 更新时间窗格显示的正文
//SetPaneText的第一个参数是窗格的索引,对于某一个窗格ID,可调用CStatusBar::CommandToIndex来获得索引。
m_wndStatusBar.SetPaneText(m_wndStatusBar.CommandToIndex(ID_INDICATOR_CLOCK),s);
CFrameWnd::OnTimer(nIDEvent);
-----------------------------------------------------------------------------------------
3. 生成和销除一个静态对话框
void CYourView::OnOpenDlg(void)
{
/*假设IDD_TEST_DLG为已经定义的对话框资源的ID号*/
CTestDlg *dlg=new CTestDlg;
dlg->Create(IDD_TEST_DLG,NULL);
dlg->ShowWindows(SW_SHOW);
/*不要调用 delete dlg;*/
}
void CTestDlg1::OnOK()
{
CDialog::OnOK();
DestroyWindow();
}
void CTestDlg1::OnCancel()
{
CDialog::OnCancel();
DestroyWindow();
}
void CTestDlg1::OnDestroy()
{
CDialog::OnDestroy();
AfxMessageBox("call delete this");
delete this;
}
-----------------------------------------------------------------------------------------
4.GetDlgItem 返回对话框控件句柄
=======================
((CComboBox *)GetDlgItem(IDC_COMBO_TYPE))->AddString("开关状态");
((CComboBox *)GetDlgItem(IDC_COMBO_TYPE))->AddString("开关状态抽查");
((CComboBox *)GetDlgItem(IDC_COMBO_TYPE))->SetCurSel(0);
((CComboBox *)GetDlgItem(IDC_COMBO_TYPE))->AddString("开关状态抽查");
((CComboBox *)GetDlgItem(IDC_COMBO_TYPE))->SetCurSel(0);
-----------------------------------------------------------------------------------------
5. 如何进行文件操作
=======================
取得文件名
打开文件
移动文件指针
读写文件
关闭文件
取得文件名
{
CString FilePathName;
CFileDialog dlg(TRUE);///TRUE为OPEN对话框,FALSE为SAVE AS对话框
if(dlg.DoModal()==IDOK)
FilePathName=dlg.GetPathName();
}
相关信息:CFileDialog 用于取文件名的几个成员函数:
假如选择的文件是C:\WINDOWS\TEST.EXE
则:
(1)GetPathName();取文件名全称,包括完整路径。取回C:\WINDOWS\TEST.EXE
(2)GetFileTitle();取文件全名:TEST.EXE
(3)GetFileName();取回TEST
(4)GetFileExt();取扩展名EXE
打开文件
CFile file("C:\HELLO.TXT",CFile::modeRead);///只读方式打开
///CFile::modeRead可改为 CFile::modeWrite(只写),CFile::modeReadWrite(读写),CFile::modeCreate(新建)
例子:
{
CFile file;
file.Open("C:\HELLO.TXT",CFile::modeCreate|Cfile::modeWrite);
...
...
}
移动文件指针
file.Seek(100,CFile::begin);///从文件头开始往下移动100字节
file.Seek(-50,CFile::end);///从文件末尾往上移动50字节
file.Seek(-30,CFile::current);///从当前位置往上移动30字节
file.SeekToBegin();///移到文件头
file.SeekToEnd();///移到文件尾
读写文件
读文件:
char buffer[1000];
file.Read(buffer,1000);
写文件:
CString string("这个世界只有偏执狂才能成功");
file.Write(string,8);
关闭文件
file.Close();
-----------------------------------------------------------------------------------------
6. CWnd::IsDlgButtonChecked函数,
=======================
用来判断单选按钮或检查框是否被选择,该函数的声明为
UINT IsDlgButtonChecked(int nIDButton) const;
参数nIDButton为按钮的ID。若按钮被选择,则函数返回1,否则返回0,若按钮处于不确定状态,则返回值为2。
7. CWnd::GetDlgItem函数,
=======================
用来获得指向某一控件的指针,该函数的声明为
CWnd* GetDlgItem(int nID) const;
参数nID为控件的ID。该函数返回一个指定控件的CWnd对象指针,通过该指针,程序可以对控件进行控制。
8. CWnd::EnableWindow函数,
=======================
该函数使窗口允许或禁止,禁止的窗口呈灰色显示,不能接收键盘和鼠标的输入。该函数的声明是
BOOL EnableWindow( BOOL bEnable = TRUE );
若参数bEnable的值为TRUE,则窗口被允许,若bEnable的值为FALSE,则窗口被禁止。
9. CListBox::SetCurSel和CComboBox::SetCurSel函数功能类似,
=======================
用来使列表中的某一项被选中,选中的项呈高亮度显示。函数的声明是
int SetCurSel(int nSelect);
参数nSelect指定了新选项的索引,第一项的索引值为0,
若nSelect的值为-1,那么函数将清除以前的选择,使列表处于未选择状态。
-----------------------------------------------------------------------------------------
10. 用来管理对话框控件的CWnd成员函数
=======================
函数名
功能
CheckDlgButton
选中或不选中按钮控件。
CheckRadioButton
选择一个指定的单选按钮并使同组内的其它单选按钮不被选择。
DlgDirList
往一个列表框中添加文件、目录或驱动器的列表。
DlgDirListComboBox
往一个组合框中的列表框内添加文件、目录或驱动器的列表。
DlgDirSelect
从一个列表框中获得当前选择的文件、目录或驱动器。
DlgDirSelectBomboBox
从一个组合框中获得当前选择的文件、目录或驱动器。
GetCheckedRadioButton
返回指定的单选按钮组中被选择的单选按钮的ID。
GetDlgItem
返回一个指向一给定的控件的临时对象的指针。
GetDlgItemInt
返回在一个指定的控件中由正文表示的数字值。
GetDlgItemText
获得在一个控件内显示的正文。
GetNextDlgGroupItem
返回一个指向一组控件内的下一个或上一个控件的临时对象的指针。
GetNextDlgTabItem
返回下一个tab顺序的控件的临时对象的指针。
IsDlgButtonChecked
返回一个按钮控件的状态。
SendDlgItemMessage
把一个消息传送给一个控件。
SetDlgItemInt
将一个整数转换为正文,并将此正文赋给控件。
SetDlgItemText
设置一个控件显示的正文。
-----------------------------------------------------------------------------------------
11.公用对话框类
=======================
CColorDialog
选择颜色
CFileDialog
选择文件名,用于打开和保存文件
CFindReplaceDialog
正文查找和替换
CFontDialog
选择字体
CPrintDialog
打印和打印设置
-----------------------------------------------------------------------------------------
12. 常用于控件的CWnd成员函数
=======================
函数名
用途
ShowWindow
调用ShowWindow(SW_SHOW)显示窗口,调用ShowWindow(SW_HIDE)则隐藏窗口.
EnableWindow
调用EnableWindow(TRUE)允许窗口,调用EnableWindow(FALSE)则禁止窗口.
一个禁止的窗口呈灰色显示且不能接受用户输入.
DestroyWindow
删除窗口.
MoveWindow
改变窗口的位置和尺寸.
SetFocus
使窗口具有输入焦点.
m_MyEdit.ShowWindow(SW_HIDE);
13. 访问控件的方法
=======================
控件是一种交互的工具,应用程序需要通过某种方法来访问控件以对其进行查询和设置.
访问控件有四种方法:
法一:利用对话框的数据交换功能访问控件.
--------------------------------------
这种方法适用于自动创建的控件.先用ClassWizard为对话框类加入与控件对应的数据成员变量,
然后在适当的时侯调用UpdateData,就可以实现对话框和控件的数据交换.这种方法只能交换数据,
不能对控件进行全面的查询和设置,而且该方法不是针对某个控件,而是针对所有参与数据交换的控件.
另外,对于新型的Win32控件,不能用ClassWizard创建数据成员变量.因此,该方法有较大的局限性.
法二:通过控件对象来访问控件.
--------------------------------------
控件对象对控件进行了封装,它拥有功能齐全的成员函数,用来查询和设置控件的各种属性.
通过控件对象来访问控件无疑是最能发挥控件功能的一种方法,
但这要求程序必需创建控件对象并使该对象与某一控件相连.
对于自动创建的控件,可利用ClassWizard方便地创建与控件对应的控件对象.
对于手工创建的控件,因为控件本身就是通过控件对象创建的,所以不存在这一问题.
法三:利用CWnd类的一些用于管理控件的成员函数来访问控件.
--------------------------------------
只要向这些函数提供控件的ID,就可以对该控件进行访问.
使用这些函数的好处是无需创建控件对象,就可以对控件的某些常用属性进行查询和设置.
该方法对自动和手工创建的控件均适用.
法四:用CWnd::GetDlgItem访问控件.
--------------------------------------
该函数根据参数说明的控件ID,返回指定控件的一个CWnd型指针,
程序可以把该指针强制转换成相应的控件类指针,然后通过该指针来访问控件.
该方法对自动和手工创建的控件均适用.其实该方法与通过控件对象来访问控件的方法在本质上是一样的.
(CEdit*)GetDlgItem(IDC_EDIT1) =
--------------------------------------------------------------------------------------
14. 视图
======
视图类从CView派生,它是数据的用户窗口
如果文档需要卷滚,需要从CScrollView派生出视图类。
如果希望视图按一个对话框模板资源来布置用户界面,可以从CFormView派生。
--------------------------------------------------------------------------------------
15. 设备上下文
======
MFC中与GDI有关的类
为了支持GDI绘图,MFC提供了两种重要的类:设备上下文类,用于设置绘图属性和绘制图形;
绘图对象类,封装了各种GDI绘图对象,包括画笔、刷子、字体、位图、调色板和区域。
设备上下文类
设备上下文类包括CDC和它的派生类CClientDC、CPaintDC、CWindowDC、CMetaFileDC。
CDC是设备上下文类的基类,除了一般的窗口显示外,还用于基于桌面的全屏幕绘制和非屏幕显示的打印机输出。
CDC类封装了所有图形输出函数,包括矢量、光栅和文本输出。
CClientDC(客户区设备上下文)
用于客户区的输出,它在构造函数中封装了GetDC(),在析构函数中封装了ReleaseDC()函数。
一般在响应非窗口重画消息(如键盘输入时绘制文本、鼠标绘图)绘图时要用到它。
用法是:
CClientDC dc(this);//this一般指向本窗口或当前活动视图
//利用dc输出文本,如果是在CScrollView中使用,还要注意调用OnPrepareDC(&dc)调整设备上下文的坐标。
dc.TextOut(10,10,str,str.GetLength());
CPaintDC用于响应窗口重绘消息(WM_PAINT)是的绘图输出。
CPaintDC在构造函数中调用BeginPaint()取得设备上下文,在析构函数中调用EndPaint()释放设备上下文。
EndPaint()除了释放设备上下文外,还负责从消息队列中清除WM_PAINT消息。
因此,在处理窗口重画时,必须使用CPaintDC,否则WM_PAINT消息无法从消息队列中清除,
将引起不断的窗口重画。CPaintDC也只能用在WM_PAINT消息处理之中。
CWindowDC用于窗口客户区和非客户区(包括窗口边框、标题栏、控制按钮等)的绘制。
除非要自己绘制窗口边框和按钮(如一些CD播放程序等),否则一般不用它。
CMetaFileDC专门用于图元文件的绘制。
图元文件记录一组GDI命令,可以通过这一组GDI命令重建图形输出。
使用CMetaFileDC时,所有的图形输出命令会自动记录到一个与CMetaFileDC相关的图元文件中
--------------------------------------------------------------------------------------
/16 .绘图工具栏的显示与隐藏
void CMainFrame::OnViewToolbar1()
{
// TODO: Add your command handler code here
m_wndToolBar1.ShowWindow(m_wndToolBar1.IsWindowVisible()? SW_HIDE:SW_SHOW);
RecalcLayout();//窗口重新布局
}
//检查工具栏按钮是否被选中
void CMainFrame::OnUpdateViewToolbar1(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(m_wndToolBar1.IsWindowVisible());
}
--------------------------------------------------------------------------------------
17. 创建一个状态栏需要以下几个步骤:
构建一个CStatusBar对象。
调用CStatusBar::Create创建状态栏窗口。
调用CStatusBar::SetIndicators函数分配窗格,并将状态栏的每一个窗格与一个字符串ID相联系。
--------------------------------------------------------------------------------------
18. 位图
======
CBitmap bitmap;//生成一个对象
CDC dcMemory;
bitmap.LoadBitmap(IDB_BITMAP1);//加载
dcMemory.CreateCompatibleDC(pDC);//为位图创建一个特殊的内存设备环境。
dcMemory.SelectObject(&bitmap);
pDC->BitBlt(100,100,54,96,&dcMemory,0,0,SRCCOPY);
-------------------------------------------------------------------------------
19. 颜色对话框的使用
============
注:
m_ncolor保存当前选择的颜色
void CCommandDialogView::OnTestColor()
{
// TODO: Add your command handler code here
CColorDialog dlg(this->m_color);
if (dlg.DoModal()==IDOK)
{
this->m_color=dlg.GetColor();
}
}
-----------------------------------------------------------------------------------
20. 设备环境与位图
==========
(1)DC(Device Context),有的称之为设备上下文,有的称之为设备环境,还有的称之为设备描述表。
DC比较像一组绘图工具,有画布(绘图表面)、画笔、画刷、调色板等。
MFC中CDC是设备环境类的基类直接由CObject派生。
(2)"设备DC"和"内存DC"
"设备DC"通常代表显示器和打印机等物理设备,它的绘图表面可以是显示器的屏幕或打印机中的纸张。
"内存DC"隐藏在内存中,不可显示,而且通常要向内存DC中选入位图来作为内存DC的绘图表面,
这个绘图表面我们也是看不到的。但向内存DC所发的绘图命令与发往窗口DC与打印机DC的命令基本上是相同的。
通过virtual BOOL CDC::CreateCompatibleDC(CDC* pDC)来创建"内存DC"。
(3)DC中GDI对象的选入与分离,以画刷为例
方法1:
CDC dc;
CBrush* pOldBrush = dc.SelectObject(&newBrush);
......
dc.SelectObject(pOldBrush);//恢复旧对象
方法2:
CDC dc;
dc.SelectObject(&newBrush);
......
dc.SelectStrockObject(BLACK_BRUSH)//用系统存储的对象来替换
(4)设备相关位图(DDB)的编程
DDB很少存于磁盘上,应用程序是在内存中创建与处理DDB的。
因为DDB不含调色板,其颜色由显示它的设备(通常是屏幕)决定,所以DDB是设备相关的。
在使用DDB过程中要遵循以下几个步骤:
◎创建一个CBitmap对象。
CBitmap m_pBitmap;
◎使用与当前设备环境相兼容的位图初始化CBitmap对象。
CClientDC dc(this);//当前设备环境(或称设备DC)
m_bitmap.CreateCompatibleBitmap(&dc,800,600);
◎创建与当前设备DC相兼容的内存DC。
CClientDC dc(this);//当前设备环境(或称设备DC)
CDC mdc;//内存DC
mdc.CreateCompatibleDC(&dc);//创建与当前设备DC相容的内存DC
◎将位图选取到内存DC中。
CBitmap* pOldBmp = mdc.SelectObject(&this->m_bitmap);//将位图选进内存DC
将位图选取到内存DC后,位图就变成了内存DC的绘图表面。
通常,用户首先需要完成的工作就是要将位图清除为一种颜色,做法如下:
CRect rect(0,0,799,699);
CBrush* pWhiteBrush = new CBrush(RGB(255,255,255));//新建白色刷子
mdc.FillRect(&rect,pWhiteBrush);
mdc.SelectObject(pOldBmp);//分离出已选入的GDI对象(这里是位图)
delete pWhiteBrush;//释放内存
◎通过内存DC在位图上绘图。
mdc.TextOut(0,0,"可以通过内存DC在位图上画图了");
mdc.Ellipse(10,10,100,100);
mdc.Rectangle(10,10,100,100);
......
◎将位图显示到显示设备上(可以说是一个图片拷贝过程)。
void CBitmapView::OnDraw(CDC* pDC)
{
CBitmapDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CDC mdc;
mdc.CreateCompatibleDC(pDC);
CBitmap* pOldBmp = mdc.SelectObject(&this->m_bitmap);
pDC->BitBlt(0,0,800,600,&mdc,0,0,SRCCOPY);//位图拷贝(有关该函数参看MSDN)
mdc.SelectObject(pOldBmp);//分离出已选入的GDI对象
}
-----------------------------------------------------------------------------------
用CWinApp的LoadStandardCursor函数获取使用系统内部已准备好的鼠标光标的句柄,如十字、箭头等:
m_HCross = AfxGetApp()->LoadStandardCursor(IDC_CROSS);
m_HArrow = AfxGetApp()->LoadStandardCursor(IDC_Arrow);
-----------------------------------------------------------------------------------
21、如何实现双缓冲
首先给出实现的程序,然后再解释,同样是在OnDraw(CDC *pDC)中:
CDC MemDC; //首先定义一个显示设备对象
CBitmap MemBitmap;//定义一个位图对象
//随后建立与屏幕显示兼容的内存显示设备
MemDC.CreateCompatibleDC(NULL);
//这时还不能绘图,因为没有地方画 ^_^
//下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小
MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight);
//将位图选入到内存显示设备中
//只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
//先用背景色将位图清除干净,这里我用的是白色作为背景
//你也可以用自己应该用的颜色
MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255));
//绘图
MemDC.MoveTo(......);
MemDC.LineTo(......);
//将内存中的图拷贝到屏幕上进行显示
pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);
//绘图完成后的清理
MemBitmap.DeleteObject();
MemDC.DeleteDC();
禁止系统擦掉原来的图象
可以重载OnEraseBkgnd()函数,让其直接返回TRUE就可以了。如
BOOL CMyWin::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
//return CWnd::OnEraseBkgnd(pDC);//把系统原来的这条语句注释掉。
}
22 引用头文件的区别
用 #include 格式来引用标准库的头文件(编译器将从标准库目录开始搜索)。
用 #include "filename.h" 格式来引用非标准库的头文件(编译器将从用户的工作目录开始搜索)。
-----------------------------------------------------
23 预编译头文件
所谓头文件预编译,就是把一个工程(Project)中使用的一些MFC标准头文件(如Windows.H、Afxwin.H)预先编译,
以后该工程编译时,不再编译这部分头文件,仅仅使用预编译的结果。这样可以加快编译速度,节省时间。
-----------------------------------------------------
24 MFC是C++类库,程序员就是通过使用、继承和扩展适当的类来实现特定的目的。
例如,继承时,应用程序特定的事件由程序员的派生类来处理,不感兴趣的由基类处理。
实现这种功能的基础是C++对继承的支持,对虚拟函数的支持,以及MFC实现的消息映射机制。
------------------------------------------------------
25 数据字典
创建数据字典,数据字典是对系统用到的所有数据项和结构的定义,以确保开发人员使用统一的数据定义。
在需求阶段,数据字典至少应定义客户数据项以确保客户与开发小组是使用一致的定义和术语。
分析和设计工具通常包括数据字典组件。
------------------------------------------------------
26 系统分析与设计:
系统分析:
理解并详细说明信息系统应该做什么的过程。
系统设计:
详细说明信息系统的许多组件在物理上是怎样实施的过程。
系统分析员:
使用信息技术的商业专业人员,利用分析与设计技术解决商业问题。
项目:
一个有始有终计划的任务,它产生预先确定的结果或产品。
系统开发生命周期(SDLC):
一种系统开发的方法,由计划,分析,设计,实施和支持五个阶段组成。
计划阶段:
规划项目范围并出项目计划。
分析阶段:
分析活动就是要全面了解商业需求,分析的重点是需求,而不是任何特定计算机技术。
设计活动:
就是定义一个新系统的体系结构和构造以满足那些需求。在设计阶段,分析员开始构思一个计算机系统解决方案。
实施阶段:
实施是实际建立,测试和安装信息系统。
-----------------------------------------------------
27 ERP
Enterprise Resource Planning 企业资源计划
----------------------------------------------------
28 内存分配与指针
int a=10;//定义一个整型变量
int *p;//定义一个指向整型的指针
p=&a;//a的内存地址付给p
*p=10;
指针的主作用是管理和操作动态分配的内存。
静态与动态内存分配的两个主要区别是:
1.静态对象是有名字的变量,我们直接对其进行操作。而动态对象是没有名字的变量,我们通过指针间接地对它进行操作。
2.静态对象的分配与释放由编译器自动处理。程序员需要理解这一点,但不需要做任何事情,相反,动态对象的分配与释放,必须由程序员显式地管理,相对来说比较容易出错,它通过New和Delete两个表达式完成。
分配特定类型的单个对象:
int *pint=new int(1024);
分配了一个没有名字的int类型的对象,对象的初始化为1024,然后,表达式返回对象在内存中的地址。
接着,这个地址被用来初始化指针对象pint。
动态分配的内存,惟一的访问方式是通过指针间接地访问。
delete pint;//删除单个对象。
分配特定类型和维数的数组。
int *pia=new int[4];
分配了一个含有四个整数元素的数组。返回指针只有一个,即首个元素的地址。
delete [] pia;//删除一个对象数组。
如果忘了删除动态分配的内存,程序会在结束时出现内存泄漏(memory leak)问题
-------------------------------------------------------
29 const 与 #define的比较
C++ 语言可以用const来定义常量,也可以用 #define来定义常量。但是前者比后者有更多的优点:
(1) const常量有数据类型,而宏常量没有数据类型。
编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,
并且在字符替换可能会产生意料不到的错误(边际效应)。
(2) 有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。
【规则】在C++ 程序中只使用const常量而不使用宏常量,即const常量完全取代宏常量。
30 常量定义规则
【规则】需要对外公开的常量放在头文件中,不需要对外公开的常量放在定义文件的头部。
为便于管理,可以把不同模块的常量集中存放在一个公共的头文件中。
【规则】如果某一常量与其它常量密切相关,应在定义中包含这种关系,而不应给出一些孤立的值
--------------------------------------------------------
31 C++内置基本数据类型
1字(word) = 4字节(byte)
1字节(byte) = 8位(bit)
1字(word) = 4字节(byte) = 32位(bit)
字符型char:
-----------
通常用来表示单个字符或小整数。用一个字节来表示。
整型int;短整型short;长整型long;
------------------------------
分别代表不同长度的整数值。int表示一个字。 short表示半个字;long表示两个字。
(在Win32中int和long通常长度相同)
浮点型float;双精度double;长双精度long double;
32 字符串
String str1;
if (!str1.size());//判断字符串是否为空
if(str1.empty());//判断字符串是否为空
string str2(str1);//用一个string对象初始化另一个string对象
str2=str1;//拷贝一个字符串
string str3=str1+str2;//两个字符串连接起来形成第三个字符串
str1+=str2;//将str2追加到str1后面
在C++中=是赋值运算,而==是等于运算符
------------------------------------------------------------------------
33 const
用const定义一个常量
以下作法是错误的,因为它试图将一个非const指针指向一个const(常量)对象
const double a=9.06;
double *ptr=&a;
以下作法是正确的:
const double a=9.06;
const double *ptr=&a;
被定义为常量指针的指针本身不是常量,我们可以重新给它赋值,使它指向不同的对象,
但是我们不能通过它来修改它所指向的对象。
(非常量针可以)如下所示是错误的:
例1:
const double *ptr=0;//定义一个常量指针
const double a=9.06;
ptr=&a;//指针指向一个常量
*ptr=1.00;//错误,不能通过一个常量指针来修改它所指向的对象
例2:
const double *ptr=0;//定义一个常量指针
double a=9.06;
ptr=&a;//指针指向一个常量
*ptr=1.00;//错误,不能通过一个常量指针来修改它所指向的对象,虽然它所指向对象不是常量。
小结:
const对象的地址只能赋给指向const对象的指针,指向const对象的指针可以被赋以非const对象的地址.
通过上面我们可以得到以下结论:
1.不能用一个非常量指针指向一个常量对象
2.可以用一个常量指针指向一个非常量对象
2.不能用一个常量指针修改它所指向的对象,无论它指向的是常量对象,还是非常量对象
引用(reference)
引用又称别名,通过引用可以间接地操作对象。
使用方式类似指针,但又与指针不同,引用已经定义,就不能再指向其它对象。
引用定义和初始化:
int a=1000;
int &ra=a;//ra就是引用
注:要了解有关引用的相关内容,可以参考:http://lijinshui.blogchina.com/blog/article_75070.408840.html
---------------------------------------------------------------------------------------------
34 extern 变量声明
带extern的变量说明是变量的声明,不是变量的定义。
extern int n;//说明n在其它地方己经定义过,在这里只是声明一下。
35 static静态全局变量
在全局变量前加static,使该变量只在这个源文件中可用,称之为全局静态变量。
静态全局变量对组成该程序的其他源文件是无效的。
使用静态全局变量的好处:
1.不必担心其它文件使用这个名字,该名字在源文件中唯一的。
2.源文件的变量不能被其它源文件所用,不能被其他源文件所修改,保证变量的值是可靠的。
36 static静态函数
函数的声明和定义默认情况下在整个程序中是extern的,
如果想让一个函数只在一个源文件中可用,需在前函数声明前加static,使其变成一个静态函数。
-----------------------------------------------------------------------------------------------
37 内联函数inline
内联函数可称为内嵌函数,它主要是解决程序的运行效率。
编译器看到inline后,为该函数创建一段代码,以便在后面每次碰到该函数的调用都用相应的一段代码来替换。
从而为程序减少了频繁调用函数所消耗的效率,也提高了程序的可读性。
38 重载函数overloaded
在同一作用域中声明两个同名不同参数的函数,称函数重载。
-------------------------------------------------------------------
39 模板
模板按用途分为函数模板和类模板。
模板把函数或类中的数据类型作为参数设计函数和类,
这样设计的函数和类还不是一个完全的函数和类,只有经过参数实例化,变为一个类型参数具体的函数,才能完成函数的功能。
模板的作用
模板可以实现逻辑相同而数据类型不同的程序代码的复制。
----------------------------------------------------------------------
40 MFC
基类
大多数M F C类是从三个基类( Base Class )派生的: CObject、CCmdTarget和CWnd。
CCmdTarget派生于CObject类,而CWnd于CCmdTarget类。
从CObject派生的类,具有在运行时获得对象大小和名字的能力;
从CCmdTarget派生的类,能够处理命令消息;从CWnd派生的类,能控制它们自己的窗口。
CObject
CObject类本身提供的功能较少,主要工作由六个伴生宏( companion macros )完成。
Object和这些宏一起,允许CObject的派生类在运行时获取类名和对象大小,创建一个类对
象而不必知道类名,以及允许从文件设备中存取一个类的实例而不必知道类名。
CCmdTarget
由CCmdTarget派生的类,可以接收和处理来自应用程序菜单或工具栏的命令消息。
CWnd
CWnd的成员函数封装了Windows API中负责维护和创建窗口的函数。
CWnd是从CCmdTarget派生的,因此,也能接收和处理命令消息。
应用程序、框架、文档和视图类
使用Developer Studio的AppWizard(应用程序向导)创建M F C应用程序时,应用程序从四个
基类派生:
CWinApp 是应用程序的"应用程序类",负责初始化和运行应用程序。
CFrameWnd 是应用程序的"框架类",负责显示和搜寻用户命令。
CDocument 是应用程序的"文档类",负责装载和维护文档。文档可以是从文档到网络设备设置的任何内容。
Cview 是应用程序的"视图类",负责为文档提供一个或多个视图。
-----------------------------------------------------------------------------------------
41 什么是CMM?
CMM(Capability Maturity Model),英文直译的意思是"能力成熟度模型"。
由卡内基.梅隆大学的软件工程协会(Software Engineering Institute, 简称SEI) 提出并完善,
目的是通过一个合理的体系模型来对软件组织开发能力进行合理有效的评估,
帮助软件组织在模型实施的过程中提高软件过程管理能力,
降低软件系统开发风险,在预定的项目周期和预算内开发出高质量的软件产品。
-----------------------------------------------------------------------------------------
42 判断一个点是否在矩形内
CRect有一个成员函数 PtInRect,用来测试一个点是否落在矩形内。
CPoint point;
CRect m_rect(0,0,200,200);
if(m_rect.PtInRect(point)){
//如果当前点在矩形内,则执行此行代码。
}
注意:这种判断只适应于设备坐标系。
43 判断一个点是否在椭圆内
CPoint point;
CRect m_rect;
CRgn rgn;
rgn.CreateElliipticRgnIndirect(m_rect);
if (rgn.PtInRegion(point)){
//............
}
---------------------------------------------------------------------------------------
44 OnInitialUpdate()
OnInitialUpdate()函数是视图创建后框架调用的第一个函数,
框架在调用OnDraw()之前调用,所以在此函数中设置滚动视图的尺寸和映射模式最合适地方。
如下所示:
void CMoveView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
CSize sizeTotal(1024, 1025); // 8-by-10.5 inches
CSize sizePage(sizeTotal.cx / 2, sizeTotal.cy / 2);
CSize sizeLine(sizeTotal.cx / 50, sizeTotal.cy / 50);
SetScrollSizes(MM_LOENGLISH, sizeTotal, sizePage, sizeLine);
}
--------------------------------------------------------------------------------------------------
45 在对话框中进行消息映射
利用对话框的一个好处是可以利用ClassWizard对对话框中各个控件产生的消息进行映射,ClassWizrd可以列出各种控件可以使用的消息,并能自动产生代码。在本节中我们以一个例子来讲解如何在对话框中对子窗口消息进行映射同时还讲解如何对对话框中的子窗口进行初始化。
首先我们产生编辑好一个对话框,在对话框中使用的控件和ID号如下: ID 类型
IDC_RADIO_TEST_1 圆形按钮
IDC_RADIO_TEST_2 圆形按钮
IDC_BUTTON_TEST 按钮
IDC_CHECK_TEST 检查按钮
IDC_TREE_TEST 树形控件
IDC_LIST_CTRL List Ctrl
IDC_TAB_CTRL Tab Ctrl
IDC_LIST_TEST 列表框
IDC_COMBO_TEST 组合框
IDC_EDIT_TEST 输入框
首先我们需要在对话框的OnInitDialog()函数中对各个控件进行初始化,
这里我们使用CWnd* GetDlgItem( int nID )来通过ID号得到子窗口指针。
--类似的函数还有
UINT GetDlgItemInt( int nID, BOOL* lpTrans = NULL, BOOL bSigned = TRUE ) 通过ID号得到子窗口中输入的数字;
int GetDlgItemText( int nID, CString& rString ) 通过ID号得到子窗口中输入的文字
代码如下:
BOOL CMy54_s1Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
/*添加初始化代码*/
//初始化输入框
((CEdit*)GetDlgItem(IDC_EDIT_TEST))->SetWindowText("this is a edit box");
//初始化列表框
CListBox* pListB=(CListBox*)GetDlgItem(IDC_LIST_TEST);
pListB->AddString("item 1");
pListB->AddString("item 2");
pListB->AddString("item 3");
//初始化组合框
CComboBox* pCB=(CComboBox*)GetDlgItem(IDC_COMBO_TEST);
pCB->AddString("item 1");
pCB->AddString("item 2");
pCB->AddString("item 3");
//初始化Tab Ctrl
CTabCtrl* pTab=(CTabCtrl*)GetDlgItem(IDC_TAB_TEST);
pTab->InsertItem(0,"Tab Page1");
pTab->InsertItem(1,"Tab Page2");
pTab->InsertItem(2,"Tab Page3");
//初始化ListCtrl
CListCtrl* pList=(CListCtrl*)GetDlgItem(IDC_LIST_CTRL);
pList->InsertColumn(0,"Column 1",LVCFMT_LEFT,100);
pList->InsertItem(0,"Item 1");
pList->InsertItem(1,"Item 2");
pList->InsertItem(2,"Item 3");
//初始化TreeCtrl
CTreeCtrl* pTree=(CTreeCtrl*)GetDlgItem(IDC_TREE_TEST);
pTree->InsertItem("Node1",0,0);
HTREEITEM hNode=pTree->InsertItem("Node2",0,0);
pTree->InsertItem("Node2-1",0,0,hNode);
pTree->InsertItem("Node2-2",0,0,hNode);
pTree->Expand(hNode,TVE_EXPAND);
return TRUE; // return TRUE unless you set the focus to a control
}
下面简单介绍一下WinAPI对INI文件的读写
一.将信息写入.INI文件中.
1.所用的WINAPI函数原型为:
BOOL WritePrivateProfileString(
LPCTSTR lpAppName,
LPCTSTR lpKeyName,
LPCTSTR lpString,
LPCTSTR lpFileName
);
其中各参数的意义:
LPCTSTR lpAppName 是INI文件中的一个字段名.
LPCTSTR lpKeyName 是lpAppName下的一个键名,通俗讲就是变量名.
LPCTSTR lpString 是键值,也就是变量的值,不过必须为LPCTSTR型或CString型的.
LPCTSTR lpFileName 是完整的INI文件名.
2.具体使用方法:设现有一名学生,需把他的姓名和年龄写入 c:\stud\student.ini 文件中.
CString strName,strTemp;
int nAge;
strName="张三";
nAge=12;
::WritePrivateProfileString("StudentInfo","Name",strName,"c:\\stud\\student.ini");
此时c:\stud\student.ini文件中的内容如下:
[StudentInfo]
Name=张三
3.要将学生的年龄保存下来,只需将整型的值变为字符型即可:
strTemp.Format("%d",nAge);
::WritePrivateProfileString("StudentInfo","Age",strTemp,"c:\\stud\\student.ini");
二.将信息从INI文件中读入程序中的变量.
1.所用的WINAPI函数原型为:
DWORD GetPrivateProfileString(
LPCTSTR lpAppName,
LPCTSTR lpKeyName,
LPCTSTR lpDefault,
LPTSTR lpReturnedString,
DWORD nSize,
LPCTSTR lpFileName
);
其中各参数的意义:
前二个参数与 WritePrivateProfileString中的意义一样.
lpDefault : 如果INI文件中没有前两个参数指定的字段名或键名,则将此值赋给变量.
lpReturnedString : 接收INI文件中的值的CString对象,即目的缓存器.
nSize : 目的缓存器的大小.
lpFileName : 是完整的INI文件名.
2.具体使用方法:现要将上一步中写入的学生的信息读入程序中.
CString strStudName;
int nStudAge;
GetPrivateProfileString("StudentInfo","Name","默认姓名",strStudName.GetBuffer(MAX_PATH),MAX_PATH,"c:\\stud\\student.ini");
执行后 strStudName 的值为:"张三",若前两个参数有误,其值为:"默认姓名".
3.读入整型值要用另一个WINAPI函数:
UINT GetPrivateProfileInt(
LPCTSTR lpAppName,
LPCTSTR lpKeyName,
INT nDefault,
LPCTSTR lpFileName
);
这里的参数意义与上相同.使用方法如下:
nStudAge=GetPrivateProfileInt("StudentInfo","Age",10,"c:\\stud\\student.ini");
三.循环写入多个值,设现有一程序,要将最近使用的几个文件名保存下来,具体程序如下:
1.写入:
CString strTemp,strTempA;
int i;
int nCount=6; //共有6个文件名需要保存
for(i=0;i<nCount;i++) {
strTemp.Format("%d",i);
strTempA=文件名; //文件名可以从数组,列表框等处取得.
::WritePrivateProfileString("UseFileName","FileName"+strTemp,strTempA,"c:\\usefile\\usefile.ini");
}
strTemp.Format("%d",nCount);
::WritePrivateProfileString("FileCount","Count",strTemp,"c:\\usefile\\usefile.ini");
//将文件总数写入,以便读出.
2.读出:
nCount=::GetPrivateProfileInt("FileCount","Count",0,"c:\\usefile\\usefile.ini");
for(i=0;i<nCount;i++) {
strTemp.Format("%d",i);
strTemp="FileName"+strTemp;
::GetPrivateProfileString("CurrentIni",strTemp,"default.fil", strTempA.GetBuffer(MAX_PATH),MAX_PATH,"c:\\usefile\\usefile.ini");
//使用strTempA中的内容.
}
补充四点:
1.INI文件的路径必须完整,文件名前面的各级目录必须存在,否则写入不成功,该函数返回 FALSE 值.
2.文件名的路径中必须为 \\ ,因为在VC++中, \\ 才表示一个 \ .
3.也可将INI文件放在程序所在目录,此时 lpFileName 参数为: ".\\student.ini".
4.从网页中粘贴源代码时,最好先粘贴至记事本中,再往VC中粘贴,否则易造成编译错误.
---------------------------------------------------------------------------------------------------
设置对话框内控件的Text
SetDlgItemText(IDC_STATIC_LISTVIEW1, strItem);
得到对话框内控件的Text
GetDlgItemText()
----------------------------------------------------------------------------------------------
得到系统当前时间
----------------
法一:
CTime time;
time=CTime::GetCurrentTime();
CString s=time.Format("%H:%M:%S");
法二:
SYSTEMTIME st;
GetLocalTime(&st);
CString str_temp;
str_temp.Format("%u/%u/%u %u:%u:%u\n",st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond);
------------------------------------------------------------------------------------------------
字符串转换为数字
使用atol将字符串转换为常整数,另外还有atof等相关函数。也可以使用sscanf函数进行
数字转换为字符串
你可以利用CString的Format函数将数字转换为字符串,如:
CString s;
s.Format("%ld", lValue);
问:
在vc中,有个类型转换 _T()是什么意思?字符串转换成什么类型。最好能举个例子。
答:
Windows使用两种字符集ANSI和UNICODE,前者就是通常使用的单字节方式,但这种方式处理象中文这样的双字节字符不方便,容易出现半个汉字的情况。而后者是双字节方式,方便处理双字节字符。Windows NT的所有与字符有关的函数都提供两种方式的版本,而Windows 9x只支持ANSI方式。_T一般同字常数相关,如_T("Hello")。如果你编译一个程序为ANSI方式,_T实际不起任何作用。而如果编译一个程序为UNICODE方式,则编译器会把"Hello"字符串以UNICODE方式保存。_T和_L的区别在于,_L不管你是以什么方式编译,一律以以UNICODE方式保存。
----------------------------------------------------------------------------------------------
数学运算函数库
Ceil
计算大于指定数的最小整数。
语法: int ceil(float number);
返回值: 整数
函数种类: 数学运算
内容说明
本函数用来计算比浮点参数 number 大的最小整数。
-------------------------------------------------------------------------------------------
如何将CString类型的变量赋给char*类型的变量?
使用CString::GetBuffer函数。例子:
char *p;
CString str("hello");
p=str.GetBuffer(str.GetLength());
网络
TCP/IP协议实际上就是在物理网上的一组完整的网络协议。其中TCP是提供传输层服务,而IP则是提供网络层服务
----------------------------------------------------------
隐藏对话框
this->ShowWindow(SW_HIDE);
-----------------------------------------------------------
得到当前所在的目录:
char szPath[MAX_PATH] = {0};
CString strPath;
GetCurrentDirectory(MAX_PATH,szPath);
strPath=szPath;
char str1[100];
char str2[100];
GetWindowsDirectory(str1,100);
GetCurrentDirectory(100,str2);
MessageBox(str1);
AfxMessageBox(str2);
-------------------------------------------------------------------------------------------------
CStringArray:
用来表示可变长度的字符串数组。数组中每一个元素为CString对象的实例。下面介绍几个成员函数:
Add 增加CString
RemoveAt 删除指定位置CString对象
RemoveAll 删除数组中所有CString对象
GetAt 得到指定位置的CString对象
SetAt 修改指定位置的CString对象
InsertAt 在某一位置插入CString对象
---------------------------------------------------------------------------------------------
怎样在EDIT1控件中输入回车后,显示"ok",并移到指定的EDIT2中(另一个)在对框中(DIALOG)
如何在控件里响应左右键消息
BOOL CMydilog::PreTranslateMessage(MSG* pMsg)
{
if(GetFocus()==GetDlgItem(IDC_EDIT1))//判断焦点在不在框内
{
if(pMsg->message==WM_KEDOWN)
{
if(pMsg->wParam==VK_RETRUN)
{
MessageBox("OK");
GetDltItem(ID_EDIT2)->SetFocus(TRUE);
....
}
}
}
}
---------------------------------------------------------------------------------------
字符串+字符串
LPTSTR StrCat(LPTSTR psz1,LPCTSTR psz2);
char str1[100]={"Hello"};
strcat(str1,"lijins");
则str1="Hellolijins";
字符串复制
LPTSTR StrCpy(LPTSTR psz1,LPCTSTR psz2);
char str2[100]={0};
char str3[100]={"Hello World"};
strcpy(str2,str3);
则str2="Hello World";
字符串比较
int stricmp( const char *string1, const char *string2 );
char str1[50]={"lijinshui"};
char str2[50]={"lijins"};
int n=stricmp(str1,str2);
则:n>0;
--------------------------------------------------------------------------------------
SDI有一个对话框,对话框怎样才能得到文档类的指针?
CMainFrame* pFrame = (CMainFrame*)(AfxGetApp()->m_pMainWnd);
CMyDoc* pDoc = (CMyDoc*)(pFrame->GetActiveDocument());
--------------------------------------------------------------------------------------
问:
我想在判断d盘上是否存在目录download,如果不存在则建立download,如果存在则删除它,应该怎样作呢?还有怎样删除download下的所有文件?我的盘上有目录msdn和文件soft.txt,我准备把它们考到download下,怎样考啊?
答:用如下的程序:
CString filePath = "d:\\download";
DWORD dwAttr = GetFileAttributes(filePath);
if(dwAttr==-1||(dwAttr&FILE_ATTRIBUTE_DIRECTORY)==0)//目录不存在
{
if ( !CreateDirectory(filePath, NULL) )
{
AfxMessageBox("不能创建目录");
return;
}
}
---------
CreateDirectory
RemoveDirectory
--------
"我的盘上有目录msdn和文件soft.txt,我准备把它们考到download下"
You can use CopyFile() or MoveFile() function to do this, learn how to use those functions by MSDN.
-------------------------------------------------------------------------------------------------
如何精确的将浮点数转换为对应的字符串
转换时利用%n.mf的格式进行格式化,n为总位数,m为小数的位数
或者用double的形式.
str.Format("%5.1f",n);//保留一位
CString strF;
strF.Format("%.1f", f);//保留一位
首先你就不应该用float,这类精度比较高的东东的话,你用该用double,double就没问题了,你的转化精度不是问题,问题在于strF.Format("%f", f);中f隐式转化成double的过程