MFC学习绵绵不绝贴

CWinApp 类提供了很容易的注册表访问函数~~以前从来没注意过~~还到处找读写注册表的办法~~ -_-! 看下面几个成员函数~

SetRegistryKey Causes application settings to be stored in the registry instead of .INI files.

SetRegistryKey 这个函数功能是设置MFC程序的注册表访问键,并把读写 ini 文件的成员函数映射到读写注册表。只要调用一下 SetRegistryKey 并指定注册表键值,那么下面6个成员函数,就被映射到进行注册表读取了~

WriteProfileBinary Writes binary data to an entry in the application's .INI file.
WriteProfileInt Writes an integer to an entry in the application's .INI file.
WriteProfileString Writes a string to an entry in the application's .INI file.

 

GetProfileBinary Retrieves binary data from an entry in the application's .INI file.
GetProfileInt Retrieves an integer from an entry in the application's .INI file.
GetProfileString Retrieves a string from an entry in the application's .INI file.


MSDN上面写上面6个函数是写到INI文件的。所以俺就忽略了其访问注册表的功能。无意中看了其MFC实现才有所了解。

例子如下:
SetRegistryKey(_T("boli's app")); //这里是准备在注册表HKEY_CURRENT_USER//software 下面生成一个boli's app 分支~为什么说是准备呢?因为如果不调用相关函数,如上面提到的6个函数,它是不会真正读写注册表的。具体本文最最下面的MFC实现摘录。
CString strUserName,strPassword;
WriteProfileString("LogInfo","UserName",strUserName); //向注册表HKEY_CURRENT_USER//software//boli's app//LogInfo//分支下写入 UserName 字符串行键值~
WriteProfileString("LogInfo","Password",strPassword);//同上~

 strUserName = GetProfileString("LogInfo","UserName");// 这里是读取HKEY_CURRENT_USER//software//boli's app//LogInfo//分支下的 UserName 字符串键值到 strUserName~
 strPassword =  GetProfileString("LogInfo","Password");

 

 摘自:http://blog.vckbase.com/zaboli/archive/2005/03/03/3355.aspx

 


 

 

从视图类获得文档类的指针是很容易的,用 GetDocument即可,这在一般的MFC文档中有介绍,也是编程中极为常用的的操作,比如视图类在进行重画等操作时,往往要用到文档类中的数据。然而只能从视图类获得文档类的指针是远远不够的,每个类都有获得其它各个类指针的一套方法,现归纳如下:

为方便说明,现假设已用Application Wizard生成一个SDI应用程序Test,包含如一几个类:CTestApp,CTestDoc,CTestView,CMainFrm.
1.从视图类获得文档类的指针
  如前所述,在视图类中需要引用文档类的地方之前,使用以下语句:
 CTextDoc *pDoc=(CTestDoc*)GetDocument();
以后便可使用pDoc指针访问文档类。
此处的强制类型转换在Test应用程序中并不必需,因为该程序中只有一个视图类,并且在Initstance()中用SDI文档模板进行了装配,你可以在Test.cpp中的Initstance()方法中看到以下语句:
  

    以及TestView.h中的线上定义:
    inline CTestDoc* CTestView::GetDocument()
    { return (CTestDoc*)m_pDocument;}
  简而言之,就是说CTestView的GetDocument()函数自然而然地认为CTestDoc是与它“相配”的,当生成了一个具有多个视图类的应用程序时(如用CSplitterWnd)将窗口分为两栏,但这两栏并非从同一种视图类派生就属于这种情况。具体实现在本文讨论范围之外),只有一个视图类能与唯一的文档类用文档模板进行装配,那么在另外一个未经装配的类中要取得文档类的指针,则需时行强制类型转换。

 

2.从文档类取得视图类的指针
    CDocument类提供了两个函数用于视图类的定位:GetFirstViewPosition()和GetNextView(),具体语法如下:
    virtual POSITION GetFirstViewPosition() const;
    virtual CView* GetNextView(POSITION& rPosition) const;
    注意:GetNextView()括号中的参数用的是引用方式,因此执行后值可能改变。
    GetFirstViewPosition()用于返回第一个视图位置(返回的并非视图类指针,而是一个POSITION类型值), GetNextView()有两个功能:返回下一个视图类的指针以及用引用调动的方式来改变传入的POSITION类型参数的值。很明显,在Test程序中,只有一个视图类,因此只需将这两个函数调用一次即可得到CTestView的指针如下(需定义一个POSITION结构变量来辅助操作):
    CTestView* pTestView;
    POSITION pos=GetFirstViewPosition();
    pTestView=GetNextView(pos);
这样,便可到了CTestView类的指针pTestView.执行完成几句后,变量pos=NULL,因为没有下一个视图类,自然也没有下一个视图类的POSITION.
但是之几条语句太简单,不具有太强的通用性和安全特征;当象前面说的那样,当要在多个视图为中返回某个指定类的指针时,我们需要遍历所有视图类,直到找到指定类为止。判断一个类指针指向的是否某个类的实例时,可用IsKindOf()成员函数时行检查,如:
    pView->IsKindOf(RUNTIME_CLASS(CTestView));
    即可检查pView所指是否是CTestView类。
有了以上基础,我们已经可以从文档类取得任何类的指针。为了方便,我们将其作为一个文档类的成员函数,它有一个参数,表示要获得哪个类的指针。实现如下:
 其中用了两次视图类的成员函数IsKindOf()来判断,是因为退出while循环有三种可能:
    1.pos为NULL,即已经不存在下一个视图类供操作;
    2.pView已符合要求。
    3.1和2同是满足。这是因为GetNextView()的功能是将当前视图指针改变成一个视图的位置同时返回当前视图指针,因此pos是pView的下一个视图类的POSITION,完全有可能既是pos==NULL又是pView符合需要。当所需的视图是最后一个视图是最后一个视图类时就如引。因此需采用两次判断。
    使用该函数应遵循如下格式(以取得CTestView指针为例):
    CTestView* pTestView=(CTestView*)GetView(RUNTIME_CLASS(CTestView));
    RUNTIME_CLASS是一个宏,可以简单地理解它的作用:将类的名字转化为CRuntimeClass为指针。
    至于强制类型转换也是为了安全特性考虑的,因为从同一个基类之间的指针类型是互相兼容的。这种强制类型转换也许并不必要,但能避免一些可能出现的麻烦。
3.从一个视图类取得另一视图类的指针
    综合1和2,很容易得出视图类之间互相获得指针的方法:就是用文档类作中转,先用1的方法得到文档类的指针,再用2的方法,以文档类的视图定位函数取得另一个视图类。同样,可以实现成一个函数:
    (假设要从CTest***iew中取得指向其它视图类的指针)
 
    这个函数和2中的GetView()相比,一是多了第一句以取得文档类指针,二是在GetFirstViewPosition()和GetNextView()前加上了文档类指针,以表示它们是文档类成员函数。
    有了此函数;当要从CTest***iew中取得CTestBView的指针时,只需如下:
    CTestBView* pTestbView=(CTestView*)GetView(RUNTIME_CLASS(CTestBView));
4. 从主帧窗口类获得视图类指针
    对本文所举的Test这各SDI程序来说,这是简单的,只需用CFrameWnd类的GetActiveView()成员函数即可。格式如下:
    CFrameWnd::GetActiveView()
    但将此函数应用在MDI应用的CMDIFrameWnd为中时,并不象所想的那样获得当前活动子窗口的视图类,而是返回NULL,这是一个要领性问题。在 MDI程序中,CMDIFrameWnd没有和任何视图类发生关系,也就是说没有视图类直接属于它,只有子帧窗口类CMDIChildWnd才是所有子窗口视图类的父窗口。而子帧窗口的父窗口才是CFrameWnd。因此,在MDI程序中获得活动视图类的正确方法应为:先获得活动子帧窗口,再从活动子帧窗口中获得活动视图类:
    //获得活动子帧窗口
    CMDIChildWnd* pChild=(CMDIChildWnd*)GetActiveFrame();
    //或:CMDIChildWnd* pChild=MDIGetActive();
    //获得活动子帧窗口的活动视图
    CMyView* pView=(CMyView*)pChild->GetActiveView();

CView常见打印函数:
OnPreparePrinting    设置打印参数时调用,覆盖式可以调用DoPreparePrinting并给主框架提供打印页数(已知)和其他打印相关信息
OnBeginPrinting    在打印开始前调用,覆盖式可以用来分配字体和其他打印需要的资源
OnPrepareDC        在每一页被打印前调用:覆盖时可以用来指定视口原点位置,并在OnDraw打印下页前设置剪贴区
OnPrint                 在每一页呗打印前调用,覆盖时可以用来打印页眉页脚以及其他没有用OnDraw或不依赖OnDraw打印的页元素
OnEndPrinting      在打印结束后调用,覆盖时可以用来释放在OnBeginPrinting中分配的资源
CPrintInfo 打印结构
  
   GetFromPage   获得首页码   GetToPage       获得末页码   GetMinPage     首页码
   GetMaxPage    末页码       SetMaxPage                         SetMinPage

m_bContinuePrinting

Contains a flag indicating whether the framework should continue the print loop.

m_bDirect

Contains a flag indicating whether the document is being printed directly (without displaying the Print dialog box).

m_bDocObject

Contains a flag indicating whether the document being printed is a DocObject.

m_bPreview

Contains a flag indicating whether the document is being previewed.

m_dwFlags

Specifies DocObject printing operations.

m_lpUserData

Contains a pointer to a user-created structure.

m_nCurPage

Identifies the number of the page currently being printed.

m_nJobNumber

Specifies the job number assigned by the operating system for the current print job

m_nNumPreviewPages

Identifies the number of pages displayed in the preview window; either 1 or 2.

m_nOffsetPage

Specifies offset of a particular DocObject's first page in a combined DocObject print job.

m_pPD

Contains a pointer to the CPrintDialog object used for the Print dialog box.

m_rectDraw

Specifies a rectangle defining the current usable page area.

m_strPageDesc

Contains a format string for page-number display.

  找不到所需.dll文件-某某.dll

一般在编程序时,都是生成了调试版的程序,就是在那个Debug目录下的可执行文件。运行这调试版的exe文件,都会动态连接MFC42D.DLL和MSVCRTD.DLL这两个文件,所以你如果将这个文件在其它机器上运行而这台机器没有这两个文件或者缺少一个,系统则会出现:“找不到所需.dll文件-某某.dll”这样的提示。而一般系统都不带有这两个文件,除非是装了vc等。
解决方法:

1、选择菜单build->Set Active Configuration,然后选择Release,
2、选择菜单project->settings,在General选项卡里第一项选择Use MFC in a static Library,即静态连接
其实这就是生成了发布版程序,在Release目录下,可执行文件不会用到那两个讨厌的dll文件,这样在其他机器上也能用了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值