CMFC**系列类使用

1.如果你使用了CFrameWndEx类,但是App类并未继承自CWinAppEx,会报告如下的内存泄露:
Detected memory leaks!
Dumping objects ->
{914} client block at 0x01481660, subtype c0, 200 bytes long.
a CMFCVisualManager object at $01481660, 200 bytes long
原因在于VS 010的程序里有一个CMFCVisualManager类的全局对象,负责管理可视化界面,CWinAppEx类的ExitInstance函数可以析构这个对象。
 
为了析构这个对象可以使用如下语句:
CMFCVisualManager::DestroyInstance( TRUE );

这个可以在ExitInstance函数里面,也可以在App的析构函数里面。

2.afxres.h

is a file which has existed since dinosaurs roamed the earth.   It defines child window IDs for your tool-bar related things:
 #define AFX_IDW_TOOLBAR                 0xE800  // main Toolbar for window
#define AFX_IDW_STATUS_BAR              0xE801  // Status bar window
#define AFX_IDW_PREVIEW_BAR             0xE802  // PrintPreview Dialog Bar
#define AFX_IDW_RESIZE_BAR              0xE803  // OLE in-place resize bar
#define AFX_IDW_REBAR                   0xE804  // COMCTL32 "rebar" Bar
#define AFX_IDW_DIALOGBAR               0xE805  // CDialogBar

#define AFX_IDW_DOCKBAR_TOP             0xE81B
#define AFX_IDW_DOCKBAR_LEFT            0xE81C
#define AFX_IDW_DOCKBAR_RIGHT           0xE81D
#define AFX_IDW_DOCKBAR_BOTTOM          0xE81E
#define AFX_IDW_DOCKBAR_FLOAT           0xE81F

Of these 0xE800 is the standard toolbar which the app-wizard gives you.   If you add your own additional toolbars then they are (were) supposed to be created with IDs in the ranges:

0xE806 to 0xE81A

and  0xE280 upwards.

[There are some hints in the comments in the file that toolbars in these two ranges might behave differently wrt print preview, but I haven't worked that out, and anyway it might be out of date.]

BUT...............................
If you're using the new CMFCMenuBar in the 'feature pack' there's a sneaky change.

afxmenubar.h

has

#define AFX_IDW_MENUBAR               0xE806  // CMFCMenuBar

and the app wizard gives you a menu bar with this ID.   So DON'T give it to a toolbar!

3.修改整个程序中控件的字体:

afxGlobalData.fontRegular.DeleteObject();
afxGlobalData.fontRegular.CreateFont(
15,                        // nHeight
0,                         // nWidth
0,                         // nEscapement
0,                         // nOrientation
FW_NORMAL,                 // nWeight
FALSE,                     // bItalic
FALSE,                     // bUnderline下划线标记,需要下划线把这里设置成TRUE
0,                         // cStrikeOut
ANSI_CHARSET,              // nCharSet
OUT_DEFAULT_PRECIS,        // nOutPrecision
CLIP_DEFAULT_PRECIS,       // nClipPrecision
DEFAULT_QUALITY,           // nQuality
DEFAULT_PITCH | FF_SWISS,  // nPitchAndFamily
_T("Segoe UI"));

4.之前用classic mfc框架中控件做的61850客户端程序在向GCB风格MFC框架升级过程中的注意事项:

(1)主要框架类升级:CWinApp->CWinAppEx;CMainFrame->CMainFrameEx;CView->CView;CDocument->CDocument。

(2)容易忽略的是对资源文件(.rc文件)的升级,如果没有修改(.rc)文件会造成GCB风格控件(CMFCMenuBar、CMFCToolBar)创建失败,原因是这些控件的资源ID需要在(.rc)文件中进行包含(这些资源ID是MFC库内部预定义在afxribbon.rc中的),正确方法是使用VS的“资源包括”对话框进行更改,关于资源包括对话框:

若要打开“资源包括”对话框,请在 资源视图中右击 .rc 文件,然后从快捷菜单中选择“资源包括”。 

符号头文件

允许更改存储资源文件符号定义的头文件的名称。有关更多信息,请参见更改符号头文件的名称

只读符号指令

使您可以包含头文件,而头文件包含不应在编辑会话期间修改的符号。例如,可以包含由若干项目共享的符号文件。也可以包含 MFC .h 文件。有关更多信息,请参见包含共享(只读)或计算符号

编译时指令

允许包含利用主资源文件中的资源单独创建和编辑的资源文件,允许包含编译时指令(如按条件包含资源的那些指令)或允许包含自定义格式的资源。还可使用“编译时指令”框包含标准的 MFC 资源文件。有关更多信息,请参见编译时包含资源

说明说明

这些框中的项分别在由 TEXTINCLUDE 1、 TEXTINCLUDE 2 和 TEXTINCLUDE 3 标记的 .rc 文件中显示。 有关更多信息,请参见 TN035:在 Visual C++ 中使用多个资源文件和头文件。 

如上所述,应在“编译时指令”中增加:
#if !defined(_AFXDLL)
#include "l.CHS\afxribbon.rc"        // MFC 功能区和控件条资源
#endif

(注意,其中l.CHS是一个文件夹,例如F:\Visual Studio\Visual Studio 10.0\VC\atlmfc\include\l.chs\下的一个文件夹,里面包含了很多MFC的资源文件。)

5.在使用CMFCMenu和CMFCToolBar时应注意:

若如下进行创建:

if (!m_wndMenuBar.Create(this))
{
TRACE0("未能创建菜单栏\n");
return -1;      // 未能创建
}
m_wndMenuBar.SetPaneStyle(m_wndMenuBar.GetPaneStyle() | CBRS_SIZE_DYNAMIC | CBRS_TOOLTIPS | CBRS_FLYBY);

CMFCPopupMenu::SetForceMenuFocus(FALSE);// 防止菜单栏在激活时获得焦点
//CreateEx创建成功返回一个非零值
if (!m_fileToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC)
|| !m_fileToolBar.LoadToolBar(IDR_TOOLBAR_FILE, 0, 0,FALSE, 0, 0, IDB_BITMAP_TOOLBAR_FILE))
{
TRACE0("未能创建工具栏\n");
return -1;
}

由于创建后菜单资源与该工具栏关联起来,如果在LoadToolBar中参数4指定为FALSE的话会导致菜单项的大小会根据工具栏加载的图像像素大小而改变,从而导致菜单项大小不正常,因此应使用如下方法:

if (!m_wndMenuBar.Create(this))
{
TRACE0("未能创建菜单栏\n");
return -1;      // 未能创建
}
m_wndMenuBar.SetPaneStyle(m_wndMenuBar.GetPaneStyle() | CBRS_SIZE_DYNAMIC | CBRS_TOOLTIPS | CBRS_FLYBY);

CMFCPopupMenu::SetForceMenuFocus(FALSE);// 防止菜单栏在激活时获得焦点
//CreateEx创建成功返回一个非零值
if (!m_fileToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC,
CRect(1,1,1,1),IDR_TOOLBAR_FILE)
|| !m_fileToolBar.LoadToolBar(IDR_TOOLBAR_FILE, 0, 0,TRUE, 0, 0, IDB_BITMAP_TOOLBAR_FILE))
{
TRACE0("未能创建工具栏\n");
return -1;
}

参考:http://social.msdn.microsoft.com/Forums/vstudio/en-US/21525836-8a0c-4c50-b21d-adf619681906/cmfctoolbar-24x24-or-32x32-images?forum=vcgeneral


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值