VC技术内幕笔记14-17

原创 2007年09月26日 13:21:00

第十七章:读和写文档--MDI应用程序


1, MFC库中CMDIFrameWnd类封装了主框架窗口和MDI客户窗口所有的函数(包含了所有Windows MDI消息的消息控制函数),因而完全可以管理它的子窗口(由CMDIChildWnd类对象来表示的)。

2,MDI应用程序中,任何时候只有一个子窗口处于活动状态。MDI应用程序只有以个 菜单和工具栏,其上的所有的命令都被传递到当前活动子窗口中。主窗口的标题栏中显示活动窗口的文档文件名。

3,MDI应用程序在启动次序上和SDI程序大部分相同。MDI中被派生类中重载的InitInstance函数与SDI有所不同。(具体的不同跟踪下代码或见362页啊,我就不抄了)

4,MDI应用程序实质:一个MDI应用程序可以使用多个文档类型,并允许同时存在不止一个的文档对象。
比较:
SDI中:
 CSingleDocTemplate* pDocTemplate;
 pDocTemplate = new CSingleDocTemplate(
  IDR_MAINFRAME,
  RUNTIME_CLASS(CStudentDoc),
  RUNTIME_CLASS(CMainFrame),       // main SDI frame window
  RUNTIME_CLASS(CStudentView));
 AddDocTemplate(pDocTemplate);

MDI中:
 CMultiDocTemplate* pDocTemplate;
 pDocTemplate = new CMultiDocTemplate(
  IDR_EX17ATYPE,
  RUNTIME_CLASS(CStudentDoc),
  RUNTIME_CLASS(CChildFrame), // custom MDI child frame
  RUNTIME_CLASS(CStudentView));
 AddDocTemplate(pDocTemplate);
//MDI中AddDocTemplate(pDocTemplate)的调用使得MDI应用程序能够支持多个子窗口,而每个子窗口都与一个文档对象和一个视图对象相连接。若干个子窗口(及其相应的视图对象)也可能与一个文档对象相连接。
//MDI动态的创建CChildFrame对象。

5,SDI只能有一个框架窗口类和一个框架窗口对象(CMainFrame:CFrameWnd);MDI应用程序有两个框架窗口类,并且可以有多个框架对象,即:
CMainFrame:CMDIFrameWnd  只有一个对应对象        有菜单和控制栏   无视图
CChildFrame:CMDIChildWnd 每个子窗口对应一个对象  无菜单和控制栏   有视图
对象的创建:CMainFrame对象在应用程序类的InitInstance函数中(即CMainFrame* pMainFrame = new CMainFrame;);CChildFrame对象是当新的子窗口被打开时,由应用程序框架来创建(MDI中InitInstance函数中ProcessShellCommand的调用用以创建子框架)。

6,MDI的InitInstance函数将CWinApp::m_pMainWnd设置成指向应用程序的主框架窗口指针。因而任何时候可以通过AfxGetApp函数来访问m_pMainWnd。

7,一个MDI程序包含两个独立的字符串资源,分别由IDR_MAINFRAME和IDR_EX17ATYPE(视具体的项目变化)来标识的。(详细见P361-362)

8,创建新文档 和 为现有的文档创建新视图(参见362页,很多条款也不抄了)

9,MDI应用程序每次当文档文件从磁盘中载入的时候,都会构造新的文档对象,并且当子窗口被关闭的时候,相应的文档对象被删除。(问题:如果多个子窗口与同一个文档对象相连接,那当一个子窗口被关闭,关联的文档对象会不会同时被删除呢?)

10,SDI中不支持多次AddDocTemplate调用(SDI中在应用程序生存周期内,文档对象、视图对象、框架对象只被创建一次),而MDI中却是通过多次调用AddDocTemplate来支持多个文档模板,每个模板可制定不同的文档类、视图类以及MDI子框架类的组合。


(注:本章笔记有点粗糙,实例也只看了看没跟踪多少代码,以后找个好实例再补上,时间关系,笔记暂停了些时日,见谅哦)
/////////////////////////


你可以通过这个链接引用该篇文章:http://npuwanglei.bokee.com/tb.b?diaryId=11642364

VC 技术内幕(第四版)笔记(第16章)

分类:VC学习

第十六章:读和写文档--SDI应用程序


一,序列化:

1,序列化:对象可以被持续,即当程序退出时候它们被存盘,当程序重启时候它们又可被恢复,对象这种存盘和恢复处理过程称之为序列化。
注意:MFC库中,不能利用序列化来代替数据库管理系统。与文档相关的所有对象只能在某个单独的磁盘文件中进行顺序读写,而不支持对象在磁盘文件中随机读写。

2,磁盘文件和归档(Archives):
1)在MFC库中,磁盘文件是通过CFile类的对象来表示的。
2)如果应用程序不直接利用磁盘I/O,而只依赖于序列化处理过程,则可以避免直接使用CFile对象。
3)在serialize函数(序列化函数)与CFile对象之间,还有一个归档对象(CArchive类对象),归档对象为CFile对象缓存数据,同时还保存一个内部标记,用来标示归档存档(写盘)还是载入(读盘)。
4)每次只能有一个活动的归档与文件相连。应用程序框架会很好管理CFile对象及CArchive对象的创建,为CFile对象打开相应的磁盘文件,并且将相应的归档对象与文件对象相连。
5)关系图:
持续文档对象 <--> Serialize <--> CArchive对象 <--> CFile对象 <--> 磁盘
6)当用户选择了File Open或File Save命令时,应用程序框架自动调用Serialize函数。

3,使类可序列化:
1)可序列化的类必须直接或间接从CObject派生,并且在类声明中,必须包括DECLARE_SERIAL宏调用,在类的实现文件中必须包括IMPLEMENT_SERIAL宏调用。
2)编写Serialize函数。
如:
// example for CObject::Serialize
void CAge::Serialize( CArchive& ar )
 {
 CObject::Serialize( ar );
     if( ar.IsStoring() )//IsStoring来判断当前归档是被用来存入还是被用来载入的。
     ar << m_years;
     else
     ar >> m_years;
 }
注意一:插入运算符对值重载,析取运算符对应用重载,有时必须强制转换才能适应编译器:
如:m_nType是枚举类型,则:ar>>(int&)m_nType;ar<<(int)m_nType;
注意二:插入和析取运算符并不适用于CObject派生类内嵌对象。
3)大多数序列化函数都需要调用基类的Serialize函数(一般在第一行调用,如CStudent是从CPerson派生,那么CStudent中Serialize函数第一行就应该为CPerson::Serialize(ar);)。CObject类Serialize是虚函数并且没做任何工作,因而2)中类子中没调用CObject::Serialize函数。
4)对于CObject派生类的内嵌对象中的Serialize函数中总是需要直接调用内嵌对象的Serialize函数。

4,使集合序列化:
1)所有的集合类都是从CObject类派生,并且在集合类声明中都包含有DECLARE_SERIAL宏调用,应此可以调用集合类的Serialize成员函数,方便使集合序列化。
2)如调用了由一组对象组成的COblist集合的Serialize函数,则COblist集合中每个对象的Serialize函数会被依次调用。
3)如果集合中包含了指向不同类对象的指针,则所有的类名都被相应地存储到归档中,以便所有的对象在被创建时都能够调用相应类的构造函数。
4)如果包容对象(如文档)中包含了一个内嵌集合,则被装入的数据会被追加进现存集合中。(因此有必要在载入前对现存的集合清空。通常由DeleteContents函数完成。)
5)当CObject指针集合被从归档中载入时,集合中的每个对象会被按如下步骤处理:
×指定对象的类。
×为每一个对象分配堆存储空间。
×将对象数据载入到新申请的内存中。
×将新对象的指针存进集合中。
6)当用户选择了File菜单的Save或Open菜单项,应用程序框架随即会创建CArchive对象(以及内部的CFile对象),然后再调用文档类的Serialize函数,并且将CArchive对象的引用传递给它。然后派生文档类的Serialize函数会对每一个非临时数据成员进行序列化。


二,SDI应用程序:

1,SDI MFC应用程序的具体启动步骤:
1)Windows将程序装入内存。
2)构造全局对象theApp。(当程序被载入时候,所有的全局对象都会立刻被创建。)
3)Windows调用全局函数WinMain。
4)WinMain自动搜索CWinApp派生类的唯一实例。
5)WinMain调用theApp的InitInstance函数,该函数在派生应用程序中被重载。
6)被重载的InitInstance函数启动文档的载入以及主框架和视图窗口的显示处理过程。
7)WinMain调用theApp的Run成员函数,启动窗口消息和命令消息的分发处理过程。
还可以对其它的CWinApp成员函数进行重载。当应用程序被中止,且所有窗口被关闭后,ExitInstance函数被调用。

2,派生的应用程序类InitInstance函数中可以看到这样代码:
CSingleDocTemplate* pDocTemplate;
 pDocTemplate = new CSingleDocTemplate(
  IDR_MAINFRAME,
  RUNTIME_CLASS(CMy15aDoc),
  RUNTIME_CLASS(CMainFrame),       // main SDI frame window
  RUNTIME_CLASS(CMy15aView));
 AddDocTemplate(pDocTemplate);
通过这组代码将程序类,文档类,视图窗口类以及主框架类建立类之间的相互关系(注意这里是类之间相互关系)。
(即通过AddDocTemplate调用将所有的应用程序元素联系在一起)
说明:
1)应用程序对象在模板被创建之前已经存在,但此时文档,视图,以及框架对象还没有被创建。应用程序框架在以后需要的时候会通过动态创建这些对象,这里是通过适用RUNTIME_CLASS来实现的。
2)P338页两个图:类之间关系图 和 对象之间关系图 这里掠过,找电子版看看。
3)IDR_MAINFRAME 是用来标示字符串表资源的。IDR_MAINFRAME 所标示的字符串被分成一些以"/n"结尾的子字符串。当应用程序执行时候,这些子字符串会在各种地方出现。
在RC文件StringTable中可以找到IDR_MAINFRAME串,串的具体对应关系参看P339页。

3,SDI文档多视图两种技术:提供菜单项供用户选择视图,将多视图安排在切分窗口中。

4,创建空文档……CWinApp::OnFileNew函数
应用程序类的在调用了AddDocTemplate函数之后,通过CWinApp::ProcessShellCommand函数间接调用了CWinApp成员函数OnFileNew完成以下工作:
1)构造文档对象,但并不从磁盘中读取数据。
2)构造主框架对象,并创建主框架窗口,但并不对其显示。主框架窗口包括IDR_MAINFRAME菜单,工具栏和状态栏。
3)构造视图对象,并创建视图窗口,但并不对它进行显示。
4)建立文档,主框架和视图对象之间的相互联系(注意这里是对象之间联系)
5)调用文档对象的OnNewDocument虚成员函数。它会调用DeleteContents虚函数。
6)调用视图对象的CView::OnInitiaUpdate虚成员函数。
7)调用框架对象的CFrameWnd::ActivateFrame虚成员函数,以便显示出具有菜单,视图窗口和控制栏的主框架窗口。
说明:上面一些函数是通过框架间接调用。

在SDI应用程序中,文档,主框架以及视图对象都仅被创建一次,并且将存在于程序的整个运行过程中。
CWinApp::OnFileNew函数被InitInstance函数所调用,当用户选择了File New 菜单项的时候也调用(此时不需要再构造文档框架视图对象,而是利用现存的完成上述后三个步骤)。
注意:OnFileNew函数总是要调用DeleteContents函数,以便将文档清空。

5,CDocument::OnNewDocument
如果SDI应用程序不重新使用相同的文档对象,则也就没必要使用OnNewDocument函数(因为可以在文档类构造函数中完成所有的文档初始化工作)。但一般还是得(必须)对OnNewDocument函数进行重载,以便每次用户选择File New或File Open时候,都能利用它来初始化文档对象。
说明:
一般,在构造函数里尽量少的做一些工作,构造函数做的工作越少,失败的机会就越小。象CDocument::OnNewDocument和CView::OnInitialUpdate这样的函数是完成初始化工作的好地方。

6,连接File Open与系列化代码………OnFileOpen函数
当AppWizard创建应用程序时,它会自动将File Open菜单项映射到CWinApp的OnFileOpen成员函数。
OnFileOpen函数进一步调用一组函数来完成一下工作:
1)提示用户选择一个文件。
2)调用已经存在文档对象的CDocument::OnOpenDocument虚成员函数。该函数将打开文件,调用DeleteContents函数,再创建一个用于装入数据的CArchive对象,然后调用文档的Serialize函数从归档中载入数据。
3)调用视图的OnInitialUpdate函数。

除了使用File Open菜单项外,还可以选择使用最近使用过的文件列表。(框架会记录4个最近使用过的文件,并将它们的名字显示在File菜单中。这些文件名在程序的运行过程中被记录在Windows的注册表中。
说明:
可以改变最近使用文件数。(在InitInstance函数里为LoadStdProfileSetting函数提供适当参数)
CWinApp::LoadStdProfileSettings
void LoadStdProfileSettings( UINT nMaxMRU = _AFX_MRU_COUNT );
//nMaxMRU:The number of recently used files to track.
//Call this member function from within the InitInstance member function to enable and load the list of most recently used (MRU) files and last preview state. If nMaxMRU is 0, no MRU list will be maintained.

7,CDocument::DeleteContents
1)当File New或File Open菜单项被选中CDocument::OnNewDocument或CDocument::OnOpenDocument函数都要调用CDocument::DeleteContents函数(清除现存文档对象内容)。
即:当文档对象第一次被创建之后,CDocument::DeleteContents 会被立刻调用,而当文档被关闭,它再次被调用。
2)常在派生类中重载DeleteContents 函数完成对文档对象中内容清除工作。
3) CDocument::DeleteContents      Called by the framework to delete the document’s data without destroying the CDocument object itself. It is called just before the document is to be destroyed. It is also called to ensure that a document is empty before it is reused. This is particularly important for an SDI application, which uses only one document; the document is reused whenever the user creates or opens another document. Call this function to implement an “Edit Clear All” or similar command that deletes all of the document’s data. The default implementation of this function does nothing. Override this function to delete the data in your document.

8,将File Save 和File Save As与系列化代码相连接:
1)当AppWizard在创建应用程序时,将File Save菜单项映射到CDocument类的OnFileSave成员函数。
2)OnFileSave函数调用CDocument::OnSaveDocument函数,OnSaveDocument函数使用归档对象(存入)来调用文档的Sarialize函数。
3)File Save As菜单象以类似方式处理。映射CDocument::OnFileSaveAs函数,OnFileSaveAs函数会调用OnSaveDocument函数。
4)文档存盘的必要的文件管理工作都是由应用程序框架来完成。
注意:
File New和File Open被映射到应用程序类成员函数,而File Save和File Save As则被映射到文档类成员函数。

9,文档的‘胀’标志
许多面向文档的应用程序跟踪用户对文档的修改,当用户试图关闭文档或退出时候,应用程序弹出对话框询问是否需要将文档保存。
1)MFC通过CDocument::m_bModified来支持这种功能。文档被修改(变胀了)则m_bModified=TRUE,否则为FALSE。
2)m_bModified为protected类型,可以通过CDocument类中的SetModifiedFlag和IsModified成员函数来访问。(注意:在MSDN中不能查出CDocument类m_bModified数据成员,不过追踪CDocument类定义可以发现如下定义:protected: BOOL m_bModified; )
3)CDocument::SetModifiedFlag
void SetModifiedFlag( BOOL bModified = TRUE );

CDocument::IsModified
BOOL IsModified( );

10,程序注册
1)利用AppWizard在程序创建Step-4使用Advanced选项为程序添加文件扩展名(或在StringTable里IDR_MAINFRAME里添加)
2)在InitInstance函数里加入下列代码行:RegisterShellFileTypes(TRUE);(注意添加的位置在AddDocTemplate函数之后!)

11,允许程序的拖放:
如果希望运行中的程序可以打开拖到其上的文件,则必须在主程序框架窗口中调用CWnd的DragAcceptFiles函数。
在InitInstance函数中(函数未)添加下列代码:m_pMainWnd->DragAcceptFiles();

你可以通过这个链接引用该篇文章:http://npuwanglei.bokee.com/tb.b?diaryId=11642352

VC 技术内幕(第四版)笔记(第15章)

分类:VC学习

第十五章:文档与视图的分离

 

1,SDI应用程序文档类由CDocument类派生,一个文档类可以有一个或多个由CView类派生的视图类。
 
2,重要成员函数:
1)CView::GetDocument
CDocument* GetDocument( ) const;
//文档对象是用来保存数据的,而视图对象则是用来显示数据的。
//一个视图对象只有一个与之相关连的文档对象。
//Return A pointer to the CDocument object associated with the view.Return NULL if the view is not attached to a document.
//Call this function to get a pointer to the view’s document. This allows you to call the document’s member functions.

2)CDocument::UpdateAllViews
void UpdateAllViews( CView* pSender, LPARAM lHint = 0L, CObject* pHint = NULL );
//当文档数据发生修改的时候,调用该函数通知所有的视图对所显示的数据进行相应得更新。
//pSender:Points to the view that modified the document, or NULL if all views are to be updated.
//如果在派生文档类中调用UpdateAllViews函数,则pSender应该设置为NULL;如果UpdateAllViews函数在派生视图类成员函数中调用,则pSender参数应该设置成this(如:GetDocument()->UpdateAllViews(this);)

3)CView::OnUpdate
virtual void OnUpdate( CView* pSender, LPARAM lHint, CObject* pHint );
//当应用程序调用了CDocument::UpdateAllViews函数时,会调用OnUpdate函数更新视图显示。
//通常视图类OnUpdate函数先对文档进行访问,读取文档的数据,然后对视图的数据成员或控制进行更新,以反应文档的变化。
//可以利用OnUpdate函数使视图的某部分无效,以触发视图的OnDraw函数调用,从而利用文档数据来重绘对应的视图窗口。
//默认的OnUpdate函数使得整个窗口矩形无效。
//当程序调用CDocument::UpdateAllViews函数,如果pSender参数指向了某个特定的视图对象,则除了该指定的视图之外,文档的所有其它视图的OnUpdate函数都会被调用。

4)CView::OnInitialUpdate
virtual void OnInitialUpdate( );
//当应用程序被启动,或当用户从File菜单选择了New时候,或当用户从File菜单选择了Open时候,该虚函数都会被自动调用。
//CView基类中的OnInitialUpdate函数除调用OnUpdate函数中没做其它任何事情。如果在派生类中重载该函数一定要调用基类的OnInitialUpdate函数,或调用派生类的OnUpdate函数。
//当应用程序启动时,框架调用视图类的OnCreate函数之后立即调用OnInitialUpdate函数。OnCreate函数只能被调用一次,而OnInitialUpdate可以被调用多次。
//可以通过在派生重载OnInitialUpdate函数,在其中对视图对象进行初始化。

5)CDocument::OnNewDocument
virtual BOOL OnNewDocument( );
//Called by the framework as part of the File New command. The default implementation of this function calls the DeleteContents member function to ensure that the document is empty and then marks the new document as clean. Override this function to initialize the data structure for a new document. You should call the base class version of this function from your override.
//If the user chooses the File New command in an SDI application, the framework uses this function to reinitialize the existing document, rather than creating a new one. If the user chooses File New in a multiple document interface (MDI) application, the framework creates a new document each time and then calls this function to initialize it. You must place your initialization code in this function instead of in the constructor for the File New command to be effective in SDI applications.


3,简单文档视图交互应用程序步骤(单文档单视图):
1)在派生文档类中定义文档的数据成员,用以保存程序中数据。为了方便派生视图类的访问可以将这些数据成员定义成公有类型或将派生视图类定义为派生文档类的友元类。
2)在派生视图类中对OnInitialUpdate虚成员函数进行重载。当文档数据被初始化或被从磁盘中读出后,框架会自动调用OnInittialUpdate函数。该函数对视图进行更新,以便放映出当前的文档数据。
3)在派生视图类中,让窗口消息控制函数和命令消息控制函数直接读取和更新文档数据成员,利用GetDocument函数对文档对象进行访问。

对应事件发生次序:
程序启动: CMyDocument对象被创建-》CMyView对象被创建-》视图窗口被创建-》CMyView::OnCreate函数被调用(如果被映射)-》CMyDocument::OnNewDocument函数被调用-》
CMyView::OnInitialUpdate函数被调用-》视图对象被初始化-》视图窗口无效-》CMyView:OnDraw函数被调用
用户编辑数据: CMyView类中函数对CMyDocument数据成员进行更新
退出程序: CMyView对象被删除-》CMyDocument对象被删除


4,CFormView类
CFormView类具有许多无模式对话框的特点,其派生类也和相应的对话框资源相联系,也支持DDX和DDV等。
CFormView类对象可以直接接收来之本身的控制通告消息,也可接收来自框架窗口的命令消息。(同时具有许多无模式类对话框和视图类特征)。
派生层次:CView|CScrolView|CFromView
CFormView类虽然不是从CDialog类派生,但是围绕对话框创建,因而可以使用许多CDialog类成员函数。(这时只需将CFormView指针强制转换成CDialog类指针即可)如:((CDialog*)this)->GotoDlgCtrl(GetDlgItem(IDC_NAME));


5,高级文档视图交互应用程序步骤(单文档多视图):
编写多视图应用程序,只要对其中某一视图编辑改变了文档,则其它的文档需要随之更新,以反映出文档的变化。
步骤:
1)在派生文档类中定义需要的数据成员。同时设计访问该数据成员的方法,或将视图类设计成文档类的友元类。
2)在派生视图类中,利用向导重载OnUpdate虚成员函数。当文档数据被修改后,应用程序框架会自动调用该函数。利用重载的OnUpdate函数来完成视图的更新,以反映当前的文档数据。
3)对所有的命令消息判断其哪些是针对文档的哪些是针对视图的,然后将其映射到相应的类中。
4)在派生视图类中,允许对文档数据进行更改,在退出之前,一定要调用CDocument::UpdateAllViews函数更新其它的视图。使用CView::GetDocument获取相关联的文档对象指针。
5)在派生文档类中,允许对文档数据进行修改,修改后退出前要调用UpdateAllViews函数更新与其关联的所有视图。

对应发生的事件次序:
应用程序启动:CMyDocument对象被创建-》CMyView对象被创建-》其它视图对象被创建-》视图窗口被创建-》CMyView::OnCreate函数被调用(如果被映射)-》CMyDocument::OnNewDocument函数被调用-》CMyView::OnInitialUpdate函数被调用-》调用CMyView::OnUpdate-》初始化视图
用户编辑数据: 视图类中函数对CMyDocument数据成员进行更新
  退出时候调用CDocument::UpdateAllViews函数更新其它的视图
退出程序: 视图对象被删除-》CMyDocument对象被删除


6,笔记略过内容:诊断信息转储(参见P296-P300),CObList集合类(参见P308-312)
1)选择Debug目标时_DEBUG常量候被定义,程序中的诊断代码会被连到程序中去。
2)选择Release目标,诊断信息转储被禁止,诊断代码也不会被连到程序中去。由Release目标生成的可执行文件非常小(比使用Debug目标生成的目标文件小很多呢)。
3)CObList很重要的特性是可以包含混合指针。

你可以通过这个链接引用该篇文章:http://npuwanglei.bokee.com/tb.b?diaryId=11642346

VC 技术内幕(第四版)笔记(第14章)

分类:VC学习

第十四章:可重用框架窗口类


1, 可重用基类的设计:为某个工程所设计的类应该能够被提取出来 ,使它进一步一般化后被应用于其他的应用程序。

2, 一些重要函数:
1)CFrameWnd::ActivateFrame
virtual void ActivateFrame( int nCmdShow = -1 );
//以nCmdShow作为参数调用CWnd::ShowWindow函数来显示框架窗口(其菜单视图控制栏窗口也会被同时显示)。nCmdShow决定窗口是最大化还是最小化等。
//在派生类中重载ActivateFrame ,在nCmdShow传递给CFrameWnd::ActivateFrame之前修改nCmdShow的值。还可以调用CWnd::SetWindowPlacement设置框架窗口的位置和尺寸并还可以设置控制栏的可视状态。
2)CWnd::PreCreateWindow
virtual BOOL PreCreateWindow( CREATESTRUCT& cs );
//PreCreateWindow在调用ActivateFrame函数之前被框架调用,用以在窗口显示之前改变其窗口的特性(特性主要参考:CREATESTRUCT结构。
//在派生类中重载它,在CS传给基类之前改变CS结构中值,从而实现定制(显示)窗口。
3)在MDI中,主框架窗口的ShowWindow函数是由应用程序类InitInstance函数调用,不是由CFrameWnd::ActivateFrame函数调用。故要控制MDI主框架窗口的一些特性,应该在应用程序类InitInstance函数中添加相应的代码。

3,Window注册表
1)Window注册表是一组系统文件,由Window管理,Windows和其他的应用程序可以在注册表中保存一些永久的信息。
Windows 注册表被组织成一个层次的数据库,字符和整型数据可以通过一个多部分键值来访问。
2)操作:
SetRegistryKey   Causes application settings to be stored in the registry instead of .INI files.

GetProfileInt   Retrieves an integer from an entry in the application’s .INI file.
WriteProfileInt  Writes an integer to an entry in the application’s .INI file.
GetProfileString  Retrieves a string from an entry in the application’s .INI file.
WriteProfileString  Writes a string to an entry in the application’s .INI file.
说明:
1)vc5开始,AppWziard在应用程序类的InitInstance函数中有对CWinApp::SetRegistryKey函数的调用,如下:
 SetRegistryKey(_T("Local AppWizard-Generated Applications"));
该函数的调用使应用程序使用注册表,如果去掉则应用程序不使用注册表,仅在Windows目录下创建一个INI文件,并使用该文件。
SetRegistryKey的字符串参数建立最上层键,其后的注册表函数定义下面的两层(称为头名和入口名)。
2)为能够使用注册表访问函数,需要一个指向应用实例对象的指针,可以通过AfxGetApp函数获得。如下:
AfxGetApp()->WriteProfileString("Text formatting","Font","Times Roman");
AfxGetApp()->WriteProfileInt("Text Formatting","Points",10);
3)注册表访问函数可以将注册表当成CString对象或无符号整数来处理。


4,CString类中,LPCTSTR并不是一个指向CString对象的指针,而是一个用来代替const char*的Unicode版本。
1) CString str;
 char ch[]="abcdefg";
 strcpy(str.GetBuffer(strlen(ch)),ch);
 str.ReleaseBuffer();
 pDC->TextOut(0,0,str);
输出:abcdefg
2) CString str("abcdefg");
 char ch[20];
 strcpy(ch,LPCTSTR(str));
 pDC->TextOut(0,0,ch);
输出:abcdefg
说明:
char *strcpy( char *strDestination, const char *strSource );
3)编写带字符串参数的函数原则:
a,如果不改变字符串内容:可以使用const char*形参,可以使用CString&类型形参
b,如果改变字符串内容,可以使用CString&类型形参(当然可以使用指针,但这儿不建议)。


5,获取窗口坐标
GetWindowPlacement
//Retrieves the show state and the normal (restored), minimized, and maximized positions of a window.
SetWindowPlacement(可以返回最大化前的屏幕坐标)
//Sets the show state and the normal (restored), minimized, and maximized positions for a window.
GetWindowRect
//Gets the screen coordinates of CWnd.

相关文章推荐

《Spring技术内幕》学习笔记17——Spring HTTP调用器实现远程调用

1.Spring中,HTTPInvoker(HTTP调用器)是通过基于HTTP协议的分布式远程调用解决方案,和java RMI一样,HTTP调用器也需要使用java的对象序列化机制完成客户端和服务...
  • chjttony
  • chjttony
  • 2011年06月18日 17:30
  • 11968

《Spring技术内幕》学习笔记17——Spring HTTP调用器实现远程调用

1.Spring中,HTTPInvoker(HTTP调用器)是通过基于HTTP协议的分布式远程调用解决方案,和java RMI一样,HTTP调用器也需要使用java的对象序列化机制完成客户端和服务器端...
  • lcczzu
  • lcczzu
  • 2015年07月16日 10:59
  • 203

《Spring技术内幕》学习笔记17——Spring HTTP调用器实现远程调用

1.Spring中,HTTPInvoker(HTTP调用器)是通过基于HTTP协议的分布式远程调用解决方案,和java RMI一样,HTTP调用器也需要使用java的对象序列化机制完成客户端和服务器端...

VC++.net 技术内幕6 源码 part17

  • 2008年09月10日 21:21
  • 977KB
  • 下载

《Spring技术内幕》学习笔记14——Spring读取和处理事务配置

1.Spring事务处理的基本过程: Spring事务处理主要分以下三个主要的过程: (1).读取和处理在Spring IoC容器中配置的事务处理属性,并转化为Spring事务处理所需要的内部数据...

VC++.net 技术内幕6 源码 part14

  • 2008年08月20日 18:06
  • 977KB
  • 下载

(转)VC++技术内幕(第四版)笔记--…

CRect rectClient;         GetClientRect(rectClient);           pDC->SetMapMode(MM_ANISOTROPIC); ...

vc技术内幕笔记

1,当用户改变了窗口尺寸,或者当窗口恢复了先前被遮盖的部分(自动调用ondraw)。或者当应用程序改变了窗口数据时,窗口都需要被重新绘制(用invalidate或invalidaterect)。 2...

Java核心技术卷I(原书第9版)个人笔记(u9 2015-10-17 14:40:51)

本人的Java学习笔记,欢迎交流指正。

VC技术内幕笔记

第一天: WINDOWS应用程序一定要有WinMain函数,该函数用来完成一些特殊的任务,象创建程序的主窗口,主窗口用来处理消息的代码。MFC将WinMain隐藏在框架中,不象写SDK程序时可以...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VC技术内幕笔记14-17
举报原因:
原因补充:

(最多只允许输入30个字)