100分:工具栏的定制问题,发言就有分,人少分就多

NothingRemained 2002-09-20 05:18:53
工具栏的定制问题,看了一下,调用了什么Custom..,还是不行,那位指点一把
下面是MSDN的相关文章

CToolBarCtrl: Handling Customization Notifications
A Windows CE toolbar common control has built-in customization features, including a system-defined customization dialog box, which allow the user to insert, delete, or rearrange toolbar buttons. The application determines whether the customization features are available and controls the extent to which the user can customize the toolbar.

You can make these customization features available to the user by giving the toolbar the CCS_ADJUSTABLE style. The customization features allow the user to drag a button to a new position or to remove a button by dragging it off the toolbar. In addition, the user can double-click the toolbar to display the Customize Toolbar dialog box, which allows the user to add, delete, and rearrange toolbar buttons. The application can display the dialog box by using the Customize method.

The toolbar control sends notification messages to the parent window at each step in the customization process. If the user holds the SHIFT key down and begins dragging a button, the toolbar automatically handles the drag operation. The toolbar sends the TBN_QUERYDELETE notification message to the parent window to determine whether the button may be deleted. The drag operation ends if the parent window returns FALSE. Otherwise, the toolbar captures mouse input and waits for the user to release the mouse button.

When the user releases the mouse button, the toolbar control determines the location of the mouse cursor. If the cursor is outside the toolbar, the button is deleted. If the cursor is on another toolbar button, the toolbar sends the TBN_QUERYINSERT notification message to the parent window to determine if a button may be inserted to the left of the given button. The button is inserted if the parent window returns TRUE; otherwise, it is not. The toolbar sends the TBN_TOOLBARCHANGE notification message to signal the end of the drag operation.

If the user begins a drag operation without holding down the SHIFT key, the toolbar control sends the TBN_BEGINDRAG notification message to the owner window. An application that implements its own button-dragging code can use this message as a signal to begin a drag operation. The toolbar sends the TBN_ENDDRAG notification message to signal the end of the drag operation.

A toolbar control sends notification messages when the user customizes a toolbar by using the Customize Toolbar dialog box. The toolbar sends the TBN_BEGINADJUST notification message after the user double-clicks the toolbar, but before the dialog box is created. Next, the toolbar begins sending a series of TBN_QUERYINSERT notification messages to determine whether the toolbar allows buttons to be inserted. When the parent window returns TRUE, the toolbar stops sending TBN_QUERYINSERT notification messages. If the parent window does not return TRUE for any button, the toolbar destroys the dialog box.

Next, the toolbar control determines if any buttons may be deleted from the toolbar by sending one TBN_QUERYDELETE notification message for each button in the toolbar. The parent window returns TRUE to indicate that a button may be deleted; otherwise, it returns FALSE. The toolbar adds all toolbar buttons to the dialog box, but grays those that may not be deleted.

Whenever the toolbar control needs information about a button in the Customize Toolbar dialog box, it sends the TBN_GETBUTTONINFO notification message, specifying the index of the button for which it needs information and the address of a TBNOTIFY structure. The parent window must fill the structure with the relevant information.

The Customize Toolbar dialog box includes a Help button and a Reset button. When the user chooses the Help button, the toolbar control sends the TBN_CUSTHELP notification message. The parent window should respond by displaying help information. The dialog box sends the TBN_RESET notification message when the user selects the Reset button. This message signals that the toolbar is about to reinitialize the dialog box.

These messages are all WM_NOTIFY messages, and they can be handled in your owner window by adding message-map entries of the following form to the message map of your owner window:

ON_NOTIFY( wNotifyCode, idControl, memberFxn )
Parameters
wNotifyCode
Notification message identifier code, such as TBN_BEGINADJUST.
idControl
The identifier of the control sending the notification.
memberFxn
The method to be called when this notification is received.
Your method would be declared with the following prototype:
...全文
172 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
NothingRemained 2002-09-23
  • 打赏
  • 举报
回复
最高只有25分是因为大家的回答跟我的本意都有一段距离
Scott_Zheng 2002-09-23
  • 打赏
  • 举报
回复
关注
NothingRemained 2002-09-23
  • 打赏
  • 举报
回复
ai,看来问题没说清楚,我想问的是:工具栏定制,就是象很多程序一样,在工具栏上点击右键 >> "自定义",然后就出现一个对话框,自己可以添加或者移除工具栏上的按钮

此问题结帐,重新发问,希望大家能再次。。。
jy98huxhu 2002-09-21
  • 打赏
  • 举报
回复
上面的东西太长了
学习
xspf 2002-09-20
  • 打赏
  • 举报
回复
高人,佩服之至
MrMu 2002-09-20
  • 打赏
  • 举报
回复
学习!N!
用户 昵称 2002-09-20
  • 打赏
  • 举报
回复
good havens
wmjcom 2002-09-20
  • 打赏
  • 举报
回复
楼上的是高手

up
andy_lau 2002-09-20
  • 打赏
  • 举报
回复
如果要帮忙的化,cyj302@eyou.com
andy_lau 2002-09-20
  • 打赏
  • 举报
回复
这里要注意OnContextMenu()函数的第一个参数pWnd既不是主框架窗口,也不是工具栏窗口本身,而是工具栏的父窗口的指针(它可能就是Dock窗口)。另外,不要在工具栏的类内再响应WM_CONTEXTMENU消息了,比如不要在CMyDialogbar类内越位OnContextMenu()函数。否则右击该工具栏时不会再进入CMainFrame类的OnContextMenu()函数。
通过试验发现,有趣的是多个工具栏相邻地靠在一起时,其父窗口是同一个(即句柄是相等的)。但也仍应分别进行判断(如上例),防止用户把它们拉开,不相邻时,它们的父窗口就不同了。
上述方法效果较好,但是如果把工具栏拖到屏幕中间处于漂浮状态时,对鼠标右键就没有反应了,解决方法请参见下面第(三)节介绍。
(二)、但是要实现对右击菜单栏的响应,还需按如下步骤进行:
1、打开MainFrm.h文件,在CMainFrame类中添加函数原型:
afx_msg void OnNcRButtonUp( UINT nHitTest, CPoint point );
2、在CMainFrame的消息映射表中添加:
ON_WM_NCRBUTTONUP()
3、在OnNcRButtonUp()函数中添加如下代码:
if(nHitTest==HTMENU)
{
CMenu mymenu;
mymenu.LoadMenu(IDR_MENU_TOOLBAR);
CMenu *submenu=mymenu.GetSubMenu(0);

submenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON,
point.x,point.y,this);
}

(三)、解决工具条漂浮时响应右击的办法
在工具条的类中也越位OnContextMenu()函数,即也响应WM_CONTEXTMENU消息,然后在OnContextMenu()中显示快捷菜单时,在submenu->TrackPopupMenu()中不要传递this指针,而是主窗口CMainFrame的指针,否则菜单项左边的选中标记显示不出来。
例如每个工具条类的OnContextMenu()函数中添加如下代码:
CMenu mymenu;
mymenu.LoadMenu(IDR_MENU_TOOLBAR);
CMenu *submenu=mymenu.GetSubMenu(0);

submenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON,
point.x,point.y, AfxGetMainWnd( ));

这样做每个工具条就必须使用自己派生的类(包括默认工具栏),派生自CToolBar或CDialogBar。因此将工具条变量的声明修改如下:
CMyToolbar m_wndToolBar;
CMyToolbar m_myToolBar;
CMyDialogbar m_wndMyDialogBar;

但这时CMainFrame的OnContextMenu()仍然需要。因为调试时观察发现,虽然此时右击工具栏按钮区域,不会进入CMainFrame的OnContextMenu();但是CToolBar和其派生类在其工具条不漂浮时,右击按钮以外的工具栏区域,只能进入CMainFrame的OnContextMenu(),并且此时pWnd指向工具栏的父窗口,因此反而不能进入他自己的OnContextMenu()。
至此,右击显示“工具栏”子菜单问题就完全解决了。
三、显示按钮文字
由CToolBar或CToolBar派生类所创建的工具条,还可以为每一个按钮在其下方或右侧显示标签文字。因此可以建立一个菜单项“显示文字”,让用户在显示和隐藏标签文字之间切换。
要实现上述功能,首先在CMainFrame的OnCreate()函数内调用CToolbar的SetButtonText()成员函数即可,随后还要调用它的SetSizes()成员函数。并且还要在响应“显示文字”菜单项的消息处理函数内,调用SetSizes()函数调整按钮尺寸,以便显示或遮挡按钮下面的文字。下面假设每个按钮图形的尺寸为24x23,具体实现步骤如下:
1、打开MainFrm.cpp文件,在OnCreate()函数内的末尾的return 0;语句之前插入如下代码:
char* stext1[]=
{
"老虎",
"鹦鹉",
"",
"鲜花",
"水果"
};

char* stext2[]=
{
"李嘉新",
"朱英",
"",
"小龙女",
"CoCo"
};
for(int i=0;i<5;++i)
{
m_wndToolBar.SetButtonText(i,stext1[i]);
m_myToolBar.SetButtonText(i,stext2[i]);
}
m_wndToolBar.SetSizes(CSize(31,29),CSize(24,23));
m_myToolBar.SetSizes(CSize(31,29),CSize(24,23));
现在文字是被遮挡不可见的,按钮的尺寸是31x29(必须比图形略大一点)。
2、在CMainFrame 类内建立“显示文字”菜单项的响应函数:
void CMainFrame::OnViewText();
void CMainFrame::OnUpdateViewText(CCmdUI* pCmdUI);
3、在OnUpdateViewText(CCmdUI* pCmdUI)函数内添加如下代码:
pCmdUI->SetCheck(m_bTextVisible);
4、在OnViewText()函数内添加如下代码:
m_bTextVisible=!m_bTextVisible;
if(m_bTextVisible)
{//Display text:
m_wndToolBar.SetSizes(CSize(32,43),CSize(24,25));
m_myToolBar.SetSizes(CSize(43,43),CSize(24,25));}
else
{//Make text invisible:
m_wndToolBar.SetSizes(CSize(31,29),CSize(24,23));
m_myToolBar.SetSizes(CSize(31,29),CSize(24,23));
}

//Resize the toolbar:
if(m_wndToolBar.IsWindowVisible( ) && m_wndToolBar.IsFloating( ))
{
PostMessage(WM_COMMAND,ID_VIEW_TOOLBAR);
PostMessage(WM_COMMAND,ID_VIEW_TOOLBAR);
}
if(m_myToolBar.IsWindowVisible( ) && m_myToolBar.IsFloating( ))
{
PostMessage(WM_COMMAND, ID_VIEW_MYTOOLBAR);
PostMessage(WM_COMMAND, ID_VIEW_MYTOOLBAR);
}
if(!m_wndToolBar.IsFloating( ))
{
PostMessage(WM_COMMAND,ID_VIEW_TOOLBAR);
PostMessage(WM_COMMAND,ID_VIEW_TOOLBAR);
return;
}
if(!m_myToolBar.IsFloating( ))
{
PostMessage(WM_COMMAND, ID_VIEW_MYTOOLBAR);
PostMessage(WM_COMMAND, ID_VIEW_MYTOOLBAR);
return;
}

5、在CMainFrame 类中添加一个类型为BOOL的变量m_bTextVisible,并将其初始化为FALSE。
现解说如下:
1、调用SetButtonText()时,按钮的序号 (index)一定要包括工具条上的分隔条(|),其文字用一个空字符串""表示即可(请参见上面的代码)。
2、显示文字时按钮的尺寸,由编程者试验确定。但一个原则就是按钮的宽度和高度必须至少比按钮图形的宽度和高度分别大7和6。
3、调用SetSizes()后,虽然按钮的高度改变了,但是工具条的高度却并不能随之立刻变过来。只有当用户单击该工具条的菜单项或改变主窗口大小时,工具条高度才改变,十分头疼。经反复摸索,我采用了如下的方法,不必改变主窗口大小(参见上面的代码):
PostMessage(WM_COMMAND, ID_VIEW_MYTOOLBAR);
PostMessage(WM_COMMAND, ID_VIEW_MYTOOLBAR);

即让工具栏先隐藏然后恢复为显示状态,或先显示再恢复为隐藏状态,导致工具栏窗口的刷新。这样做仅会引起工具栏抖动,避免了因改变主窗口尺寸而引起的主窗口抖动。
即使有多个工具条,也只需随意选一个按上述处理,所有的工具条都会同时被刷新。对所有停靠(即不飘浮的)的工具条都有作用(即使不相邻)。
但这样处理,对飘浮的工具条却无效,反之若被处理的工具条飘浮,则对停靠的也就无效了。因此,稳妥的办法,就是对所有可见的飘浮工具条分别按上述方法处理一下,然后任选一个不飘浮的工具条(可见与否没关系)处理一下(请参见上面的示例代码)。实际窗口效果如图3所示。

四、显示256种颜色的按钮
通常应用程序的工具按钮都是16色的,但是实际上也可以根据需要使用256种色(8位色),甚至是24位的颜色。尺寸也不一定是16x15,也可以是任意大的尺寸。
实现方法就是利用CImageList类装载24位颜色或256色的位图(共需三个位图),然后分别调用CToolbar类的成员函数SetImageList()、SetDisabledImageList()和SetHotImageList()。
(一)、制作位图
需要为工具条上的每个按钮准备三个位图,分别表示三种状态:正常、加亮(hot)和变灰(disabled),其中后两个也可省略不要。加亮就是当鼠标指针指向该按钮时的状态,变灰就是当该按钮被禁止时的状态。现在假设我们要实现的按钮图形尺寸是24x23。并假设已经为工具栏制作了工具栏模板资源。
制作位图可以用任何图形处理工具,如photoshop等。首先可以制作表示正常状态的位图:

1、分别为每个按钮制作一个24x23的图形;
2、将制作好的按钮图形左右排列,相邻地组合在一块,形成一个位图(如图1和图2);



3、将位图以24位颜色的格式保存为bmp文件,比如toolbarimg0.bmp和toolbarimg.bmp文件。
制作时需要注意的是,按钮图形在位图中的排列顺序,一定要与该工具栏资源模板中的按钮顺序完全相同,一一对应。这里的资源模板仍然是需要的,因为这样我们就不必自己编写构造按钮的具体代码,而由主框架(Framework)去完成。
下一步就是制作加亮和变灰的位图:
1、将上面制作的正常状态的位图,经过纹理化处理(比如用照片编辑器),然后以256色的格式另存为另外一个bmp文件,比如toolbardisabledimg0.bmp和toolbardisabledimg.bmp文件,作为禁止状态的位图,没有必要为其保存24位格式;
2、同样,将上面制作的正常状态的位图,经过加亮处理,然后以256色的格式另存为另外一个bmp文件,比如toolbarhotimg0.bmp和toolbarhotimg.bmp文件,作为加亮状态的位图。
3、将上述制作的六个位图,全部import到工程中来,分别分配它们的资源ID为:
IDB_IMG0
IDB_DISABLED_IMG0
IDB_HOT_IMG0
IDB_IMG
IDB_DISABLED_IMG
IDB_HOT_IMG
注意:对于24位位图,在import时会出现一个警告对话框,可以不必理会它。
(二)、添加实现代码
1、在CMainFrame类内添加如下六个变量(可以设为protected):
CImageList m_img1;
CImageList m_img2;
CImageList m_disabledimg1;
CImageList m_disabledimg2;
CImageList m_hotimg1;
CImageList m_hotimg2;
2、在CMainFrame类的OnCreate()函数末尾的return 0;语句之前插入如下代码:
//Load imagelists for toolbar1:
CBitmap bm;
bm.LoadBitmap(IDB_IMG0);
m_img1.Create(24,23,ILC_COLOR24,4,0);
m_img1.Add(&bm,RGB(0,0,0));
bm.DeleteObject( );
bm.LoadBitmap(IDB_DISABLED_IMG0);
m_disabledimg1.Create(24,23,ILC_COLOR8,4,0);
m_disabledimg1.Add(&bm,RGB(0,0,0));
bm.DeleteObject( );
bm.LoadBitmap(IDB_HOT_IMG0);
m_hotimg1.Create(
andy_lau 2002-09-20
  • 打赏
  • 举报
回复
AppWizard已经为我们产生了创建CMyDialogbar 控件的代码,这里就不必添加了。
这里要注意如下几个问题:
1、工具栏的控件标识符ID问题
应当注意工具栏的控件标识符ID与它的资源标识符ID通常是不相同的。AppWizard为程序的第一个默认工具栏分配的控件标识符ID是ID_VIEW_TOOLBAR,我们还必须为每一个新添加的工具栏,分别分配一个控件标识符ID。例如为m_myToolBar工具栏分配控件ID的步骤如下:
(1)、打开Resource.h文件,添加如下行:
#define ID_VIEW_MYTOOLBAR 137
(2)、在CMainFrame类的OnCreate()函数中创建m_myToolBar工具栏控件时,将ID参数值ID_VIEW_MYTOOLBAR传递给CToolBar的CreateEx()函数,而不能使用CreateEx()的缺省参数(见上述代码)。
不需要再为m_wndMyDialogBar 分配ID,因为AppWizard已经为m_wndMyDialogBar分配了控件标识符CG_ID_VIEW_FILTERBAR。
CreateEx()的函数原型如下:
BOOL CreateEx(CWnd* pParentWnd, DWORD dwCtrlStyle = TBSTYLE_FLAT, DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP, CRect rcBorders = CRect(0, 0, 0, 0), UINT nID = AFX_IDW_TOOLBAR);
由此可见ID_VIEW_TOOLBAR的值等于AFX_IDW_TOOLBAR。
2、程序启动时隐藏工具栏问题
有些工具栏在程序启动时,可能并不希望它显示出来,这时只需在CToolBar的CreateEx()函数中,将WS_VISIBLE参数去掉即可(见上述代码)。但对于m_wndMyDialogBar工具栏此法不灵,可在CMainFrame的OnCreate()函数中添加如下行:
m_wndMyDialogBar.ShowWindow(SW_HIDE);//this approach is effective for all toolbars.
(四)、添加消息映射条目
除了默认工具栏以外,我们还应为每一个新添加的工具栏分别添加两个消息映射条目:
1、打开MainFrm.cpp文件,在CMainFrame类的消息映射表中为m_myToolBar工具栏添加如下行:
ON_COMMAND_EX(ID_VIEW_MYTOOLBAR, OnBarCheck)
ON_UPDATE_COMMAND_UI(ID_VIEW_MYTOOLBAR, OnUpdateControlBarMenu)
AppWizard已经为m_wndMyDialogBar添加了如下行:
ON_COMMAND_EX(CG_ID_VIEW_MYDIALOGBAR, OnBarCheck)
ON_UPDATE_COMMAND_UI(CG_ID_VIEW_MYDIALOGBAR, OnUpdateControlBarMenu)
它们用于产生显示和隐藏该工具栏的处理代码。但不需要为默认工具栏添加这两个条目。
(五)、添加菜单项
切换到ResourceView,然后打开适当的菜单资源,
1、在菜单中添加菜单项“我的工具栏”,并指定ID为ID_VIEW_MYTOOLBAR;
2、在菜单中添加菜单项“我的对话框工具栏”,并指定ID为CG_ID_VIEW_FILTERBAR。
不需要为这两个菜单项建立处理函数,因为在第(四)节中添加的消息映射条目,已经为我们产生了处理代码。
单击这两个菜单项,即会显示或隐藏相应的工具栏。
至此,我们的程序中已经有了三个工具栏,它们的类型分别是:
CToolBar 、CMyToolBar和CMyDialogbar。
编译以后发现,这三个工具栏已经可以正常工作了。
二、编写类似Word 97的工具栏快捷菜单问题
即当用户右击主窗口中的菜单栏、工具栏时,显示“工具栏”子菜单。
自然要用OnContextMenu(CWnd* pWnd, CPoint point)函数,但调试跟踪发现,右击菜单栏根本无法进入该函数,即此函数对右击菜单栏无反应。故可采用OnNcRButtonUp( UINT nHitTest, CPoint point )函数,效果很好,举例如下。
假设工具栏子菜单的菜单资源已经建立,其资源ID是IDR_MENU_TOOLBAR,包含菜单项“默认工具栏”、“我的工具栏”和“我的对话框工具栏”;三个工具栏的对象均是CMainFrame类内的变量:
CToolBar m_wndToolBar;
CMyToolbar m_myToolBar;
CMyDialogbar m_wndMyDialogBar;

(一)、则首先按如下步骤实现右击工具栏时的响应:
1、在CMainFrame类内越位OnContextMenu()函数,响应WM_CONTEXTMENU消息;
2、在该函数内加入如下代码:
HWND h0= m_wndToolBar.GetParent()->m_hWnd;
HWND h1= m_myToolBar.GetParent()->m_hWnd;
HWND h2= m_wndMyDialogBar.GetParent()->m_hWnd;

if(h0==pWnd->m_hWnd || h1==pWnd->m_hWnd || h2==pWnd->m_hWnd)
{
CMenu mymenu;
mymenu.LoadMenu(IDR_MENU_TOOLBAR);
CMenu *submenu=mymenu.GetSubMenu(0);

submenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON,
point.x,point.y,this);
}
zswking 2002-09-20
  • 打赏
  • 举报
回复
说清楚点
andy_lau 2002-09-20
  • 打赏
  • 举报
回复
声明:

工具栏是一个比较传统的话题,如果您认为本文的内容比较陈旧的话,请您不要阅读,以免浪费你的宝贵精力和时间。


多工具条编程秘技


李安东


2001年10月1日


关键字: 工具栏 真彩色按钮 按钮标签


对于一个应用程序来说,用户界面始终是至关重要的问题之一,因为它不仅决定了用户使用的方便程度,而且还能增加用户对软件的信赖程度。下面就如何利用VC++ 6.0编写带有多个工具条的应用程序的问题,谈一点自己的体会。
一、实现多个工具栏
通常在每个新建的工程项目中,AppWizard已经创建了一个默认的工具栏,其资源标识符ID为IDR_MAINFRAME,并且在主窗口类(如CMainFrame)内添加了一个CToolBar类型的变量m_wndToolBar。而工具栏的实际创建则是在主窗口类的OnCreate()成员函数内进行的。我们在实现多工具栏时,也应遵循这些原则,将多工具栏集中在主窗口类内,进行统一实现和管理,这样做比较方便。
利用MFC提供的CToolBar和CDialogBar类实现多个工具栏,步骤是比较容易的。主要分如下几个步骤:
(一)、创建工具栏资源模板
如果要添加由CToolBar实现的工具栏,在资源编辑器(Resource editor)中:
1、创建一个新的工具栏资源,分配资源标识符ID(例如IDR_MYTOOLBAR);
2、添加并编辑该工具栏上的各个工具按钮。
CToolBar工具栏的特点就是包含多个按钮,但如果要在工具栏上包含其他控件,如编辑框、组合式列表框等,则应使用CDialogBar来实现,步骤如下:
1、单击“Project / Add to Project / Components and Controls...”菜单项;
2、在出现的“Components and Controls Gallery”对话框中,双击“Visual C++ Components”;
3、在出现的列表中选中“Dialog bar”,然后单击“Insert”按钮;
4、最后单击“Close”关闭该对话框。
这样AppWizard就自动为我们在CMainFrame类内产生了该工具栏所需的代码,并为其建立了一个资源模板,其资源ID为CG_IDD_MYDIALOGBAR。
注意Dialog bar的资源是一个对话框模板,而不是工具栏模板。
按上述步骤,为要添加的每个工具栏均添加一个资源,并分配一个资源标识ID。至于如何在工具栏上添加按钮,以及如何建立每个按钮的响应函数,这里就不一一赘述了。
(二)、派生新的工具栏类
一般情况下,可以直接使用MFC中的CToolBar或CDialogBar类实现工具栏。但若要实现某些特定的操作,就必须派生自己的工具栏类。在派生时有一点小技巧,介绍如下:
在由ClassWizard或ClassView派生新类时,其中的基类列表框中找不到CToolBar和CDialogBar这两个类。此时可暂时先选CToolBarCtrl或CDialog作为基类,然后再将基类改为CToolBar或CDialogBar。下面仅介绍一下由CDialogBar派生出CMyDialogbar类的具体步骤:
1、在ClassView中右击第一个项目;
2、在出现的快捷菜单中单击“New Class...”;
3、在出现的“New Class”对话框中,输入新产生的类的名称“CMyDialogbar”;
4、选择基类为CDialog,并指定Dialog ID为在第(一)节中创建的Dialog bar的对话框资源的ID,如CG_IDD_MYDIALOGBAR。
5、打开MyDialogbar.h文件,将CMyDialogbar的基类修改为CDialogBar;
6、打开MyDialogbar.cpp文件,将所有出现的CDialog 均替换为CDialogBar。
注意CDialogBar的构造函数没有参数,所以还要将“: CDialogBar(CMyDialogbar::IDD, pParent)”中的参数删去,改为“: CDialogBar()”。
按类似方法可由CToolBar派生出CMyToolbar类。
然后,在CMainFrame类内添加这两个类的对象,如:
CMyToolbar m_myToolBar;
CMyDialogbar m_wndMyDialogBar;
//This variable is generated by AppWizard formerly. At this point, your work is //simply replacing it’s base class with CMyDialogbar .
为了允许程序中的所有代码均能访问工具栏,最好将这两个变量设为public。当然请不要忘了将上述两个类的头文件用#include指令包含进来。
(三)、创建工具栏控件
打开MainFrm.cpp文件,在CMainFrame类的OnCreate()成员函数内添加如下代码:
//Toolbar2:
if (!m_myToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD|CBRS_GRIPPER
| CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC|CBRS_TOP
,CRect(0, 0, 0, 0), ID_VIEW_MYTOOLBAR) ||
! m_myToolBar.LoadToolBar(IDR_MYTOOLBAR))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
m_myToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_myToolBar);
zhf0021 2002-09-20
  • 打赏
  • 举报
回复
仔细看啊。
andy_lau 2002-09-20
  • 打赏
  • 举报
回复
不知道你要什么
给你段文章
yaotang 2002-09-20
  • 打赏
  • 举报
回复
look at
www.vckbase.com
huahero 2002-09-20
  • 打赏
  • 举报
回复
找源码研究吧
romanticist 2002-09-20
  • 打赏
  • 举报
回复
自己研究阿
preston_gzw 2002-09-20
  • 打赏
  • 举报
回复
gz
sdb72 2002-09-20
  • 打赏
  • 举报
回复
up
加载更多回复(1)
【官方支持】 有问题,请先上http://www.plrsoft.cn/spcenter找补丁!实在不能解决,请Q我:2643148,请附加信息:asoft签到管理系统。 【如何安装】 1)、全新安装: 将所有文件放到IIS虚拟目录,在浏览器运行asoft_install_v x.x build xxxx.asp,选择“全新安装”即可。(asoft_tykq x.x build xxxx_all.xml是封装好的X.X完整版安装程序,适合懒人使用) 2)、升级安装 将所有文件放到IIS虚拟目录,在浏览器运行asoft_install_v x.x build xxxx.asp,选择“升级安装”即可。注意数据备份!(asoft_tykq x.x build xxxx _update.xml是封装好的升级版安装程序[未带数据库],适合老用户升级使用) 3)、绿色使用 解压“asoft_v x.x build xxxx _绿色安装包.rar”到虚拟目录,直接解压到浏览器访问虚拟目录即可。如果需要升级数据库,在浏览器运行asoft_install_v x.x build xxxx.asp,选择“仅升级数据库”即可。注意数据备份! 【一般会遇到哪些安装的问题】 如果安装不上,或者安装了不能用,请先检测以下三个原因,不要动不动就Q我,搜索引擎是个好东西,可以多加利用,谢谢! 1、本程序只能在IIS5.1 (winxp win2003 win7) 以上版本运行。(win2000、NETBOX或者简易IIS服务器下不能运行)!此错误的报错信息为 :未结束的字符串 2、NTFS硬盘写权限未打开,此错误的报错信息为 Microsoft JET Database Engine ‘80040e09’ 3、IIS父路径未启用,具体表现为登陆后大部数据处于LOADING状态。 4、IE8下,未勾选“自定义级别安全设置”中-“将文件上载到服务器时包含本地目录路径”选项 5、遇到不明的500错误,你点浏览器 工具->internet选项->高级 ,找到“显示友好http错误信息” 去掉这个选项前面的勾然后刷新页面,看看详细的错误信息,复制给我 更多解决方案请进入:http://www.plrsoft.cn/?p=52 (ASP+ACCESS数据架构策略报错解决办法) 6、无法使用视频签到,看不到图像 : 进入 C:\windows\system32\macromed\flash\mms.cfg 这个进程,不要搜索,要手动,因为C盘把这些设为自动隐藏文件,然后删除mms.cfg,重启。 【第一次登录使用】 全新安装和绿色使用的用户的请用 asoft / 123456 登陆管理,设定好管理员和其他设置即可。系统已经内置操作引导,登陆后可以在左右上方找到。 升级安装的用原密码登入即可。 【数据库安全】 建议将data/目录下的mdb数据库改成 .asp扩展名,同时修改根目录和ajaxinc目录的conn.asp中的数据库路径即可,这样可以防止数据库被恶意下载。 【功能概览】 1、用户:签到(普通签到和视频签到) 请假 便签 文件共享 2、管理员:人员管理 签到设定 部门设定 请假数据管理、自定义流程 系统设置 系统日志 在线更新 公告管理 各种用户行为记录导出 数据库管理 【给DIY用户】 根目录下文件为所有的程序文件,文件头部版权部已经附带该文件的功能说明。 [其他目录] attachments:用户的附件箱,以用户的用户名命名子文件夹("_annouce_"默认文件夹请不要删除,否则将无法上传公告附件!“_qdphoto_”放置用户签到图片,也请不要删除!) ajaxinc: AJAX应用类(以ajax_命名的四个文件)、附件上传(upload_5xsoft.inc|asoft_upload.asp)和EXCEL导出文件(toexcel.asp)、顶部banner(top.asp)、验证码生成文件(CodeGen.asp、VerifyCode.asp),数据库连接文件(conn.asp) MD5加密函数(MD5.asp) 全局自定义函数包(function.asp) data : 数据库文件夹 databackup:数据库和通过ASOFT SPCENTER在线更新后的程序文件备份文件夹 images:系统使用的图片文件夹 jsinc:jquery应用类、自己编写的JS函数,ajax应用入口函数 【一些定义】 签到签退缓冲:为了人性化的进行签到、签退操作,在签到、签退时间点前后设定的缓冲时间,在缓冲时间内进行签到签退都是合法的,不会被记录为迟到或者早退。例如,系统设定8:50签到,同时设定签到点前缓冲为10钟,签到点后后缓冲为5钟,那么在8:40~8:55签到都是正常的。早于该时间无法签到、晚于该时间视为迟到。 迟到:超过了预定义的签到时间而进行的签到操作 早退:当系统未开放自动签退功能时,如果发生过签到但未按时签退的行为 。例如,系统设定8:00~12:00未签到时间,8:00按时签到,但是未在12:00签退的行为 旷工:未按时进行预定义的签到动作的行为,例如,每天设定了上午下午两次签到点,上午未签到将为上午记录一次旷工;下午同理。 轮班:在用户绑定到某一签到组后(例如签到时间为早8:00~12:00,下午14:00~18:00,晚班19:00~23:00),管理员可以单独调整该用户签到频次,例如,只签早班,或者晚班。 跨天签到:可以允许用户进行任意多天的签到时长,适合晚班用户,例如从当天22:00~次日8:00. 【历史版本(不含补丁版本)】 [2010-01-10] V3.5 正式版 build 20110110 1、增加离座快捷设置,并可以锁定屏幕。 2、增加加班功能 修改: 1、自由签到可以在后台的签到设定进行是否脱离每日签到模块自动统计的开关 [2010-12-15] V3.5 内测版 build 20101215 增加: 1、可在后台授权的批量签到(签到内挂)诞生了,适合某些单位外派人员的负责人一键群签到需求 (在后台系统设置->权限管理对可操作的组别授权,授权后即可在左边操作栏的“数据管理”看到该选项) 2、现在系统允许在预设的假期内对某些人单独开放系统签到模块而不必更改全局设定了。 (在后台系统设置->常规设置可以添加想要开放签到的日期,比较适合于在一些额外的假日的时候进行便捷的调休) 3、万众期待的请假流程无限级自定义诞生了,并且,请假流程会根据申请人权限自动省略不必要的步骤(比如说部长的申请单无需组长进行第一审批了,即使该部门的请假流程存在组长这一级审批) 4、调整休假设定、批量签到、批量更改用户状态的界面,减少了单位时间内出现的按钮数量,使得操作更明晰 (通过左侧功能导航进入“休假设定”、“批量签到”、“用户状态设定”后可体验。需要后台在“权限管理”开放这三个权限) 5、允许任何用户可以根据实际情况中存在的项目团队进行自定义的项目负责人,项目负责人的作用体现为请假流程中的预审批。 (允许用户自发性的组成一些项目组,项目负责人可以由任何一个用户指定,被指定为项目负责人的用户会出现在进行指定操作的用户的请假流程预审批列表中,仅具有请假审批权限。) 6、首页增加“实时签到查看”选项卡 ,该选项卡可以在后台设定允许查看的权限组。 在后台系统设置->勾选后,可以在 start页面 [main.asp]看到。) 7、管理员可以在后台自定义用户状态(未审核、已审核、出差状态)、并可以将修改用户状态授权给组长以上职务,被设定为出差状态的用户会被系统自动忽略而不计入旷工,适合快速请假调休。 8、现在可以在部门管理界面调整部门先后顺序了 修改: 系统使用大小写混合密码无法登陆的情况 (用户名不区大小写。自V2.2版后,密码重新开放大小写混合的复杂型密码) 修正: 优化请假模块在进行剔除工作时间的请假时间计算逻辑并修复一个因跨天签到设置导致计算不准确的BUG。 [2010-09-13] V3.4 正式版 build 20100913 1、增加开关左侧导航的功能,现在你可以有更大的视觉空间来查看数据了 2、修正自由签到用户无法计算请假时间、导致无法请假的BUG 3、修正设置得无公共审批人无法在审批人列表中被看到的BUG 4、修正销假后,在请假时间内依然被记录为旷工,其中: 4.1 更改请假逻辑 请假状态从请假开始时间系统自动计算,而非在终审生效的时候算起 4.2 在考勤查询增加一个“请假”快速查询类别 5、增加防签到状态卡死代码,修复某人因迟到造成连续自动签退后卡死的情况 [2010-09-07] V3.3 正式版 build 20100907 修复中文登录名用户无法正确保存视频签到的图片的BUG [2010-08-28] V3.3 正式版 build 20100831 特别重大更新-> 加入了视频签到功能,杜绝代签现象。你可以在“系统设置”->“签到设置”中决定是否开启它,以适应那些没有安装摄像头的单位继续以原有方式签到。(依赖服务器端的Persits.Jpeg组件。如果没有该组件将无法启用视频签到拍照功能,系统会提示您安装!) 1、重新编写签到统计模块,不会出现周末双休时被记录到旷工的情况了 2、签到查询界面增加了“申辩”快捷筛选选项 3、为用户管理界面和用户数据导出功能增加了一个时间段筛选的功能,现在可以直观的统计出各个用户在选定时间段的考勤数据总揽了。 4、增加一个控制公告和便签刷新的时间字段 现在管理员可以根据自己的服务器压力情况修改这个时间了 5、将迟到跟签到合并,现在迟到人员不会同时产生一条“迟到”和一条“正常签到”记录了。 6、增加了一个请假界面的在数据受损后的兼容性 7、修复未创建附件箱时上传附件的BUG 8、修复FF下无法在公告和便签附件箱上传附件的BUG 9、修改当签到组管理无子选项的样式 10、为附件箱图片增加预览功能 11、修复登录验证码开关的小BUG 12、CSS调整,增加style文件夹,统一放置CSS 13、修改签到组弹出框样式 14、修改在线更新版本对比代码段,修正了一个无外网连接时AJAX机制报错的BUG 15、修改了calendar.js,优化了日历选择控件样式和速度 16、修正了几处界面显示效果 17、在“私人定制界面”页面增加了“是否开启系统tips” (tips有时候很烦人……哥也深受其害 >_<)的功能。 [2009-11-27] v3.2正式版 build20091127 1、增强了“自由签到”功能,现在您可以为各部门设定每天可自由不限时签到次数和每次签到签退最小间隔了。 2、新增“签到状态申辩”和处理申辩的功能,现在您可以向管理员提出有异议的签到记录并且要求管理员修正你的签到记录了。 3、增强了请假审批功能,现在您可以为各部门别自定义请假审批流程了 4、新加入节假日功能,现在您可以全局设定如何放假(休周末、休单周、休双周、单双轮休)以及当年法定节假日,甚至为任何一个单独用户设定个性化的休假方案了。休假期间,用户不能签到,也无法被签到记录统计程序记录。 5、现在您可以在发送便签或者发布公告的时候从自己的附件箱点选文件作为附件了。超级管理员增加了一个查看指定用户的便签附件箱的功能。 [2009-10-01] v3.1正式版 1、增加自定义用户组名称功能,现在您可以自由的为所有权限的用户取一个您喜欢的名字了(更改后用户下一次登录系统将会显示新的权限名称。例如,将“数据员”改为“秘书”等) 2、调整登陆页面设计。暂时屏蔽日程功能(插件暂时无法兼容,会在后续补丁开放该功能。) 3、编写公告和便签附件上传代码,植入uploadify控件,现在您可以为自己的附件箱增加附件了 4、如果管理员设置了自动签退,现在系统不再记录用户的早退行为了。 [2009-9-15] v3.1 beta3(内测,未发布) 1、增加滑动门机制,现在系统功能列表显得更加有序了。 2、引入jquery,改动行交叉变色机制和时间控件 3、修改工作人员状态模块增加发言类别,现在您可以发言、告知所有人您的离岗情况和请假情况了! 4、增加管理员对各部门私人附件箱大小的控制,现在用户可以为自己创建一个管理员规定大小的附件箱了。 5、v3.1正式版UI替换结束,正式版将启用全新界面。 6、新增“在办箱” 功能,您能方便的看到自己的工作情况,并能方便的查询联系薄、最近的操作记录 7、新增 user_zw字段 用于储存用户职务 [2009-7-22] v3.1 beta2 1、请假流程四级化,并通过为各部门设定不同的主管级、部门级请假时长审批来自动减少审批流程长度。例如,请假4小时以内,只需要主管基本审批即可,8小时以内,需要部门审批院审批。 3、签到、请假查询、导出代码更替,现在可以不用开启JAVASCRIPT功能来进行页面导出了。 4、原绑定用户功能写数据库时增加对轮班字段的写入,增加轮班设定页面,现在您可以为任何一个用户设定单独的签到方式了,例如,某团队在绑定同一个签到组的情况下,有些人可以只上午签到,有些人则可以下午签到,类似轮班。 5、增加新便签弹出、新公告弹出用户私人定制功能,任何用户可以根据自己的需要打开或者关闭该功能。 6、增加登陆开关验证码功能,现在您可以关闭“烦人”的验证码了。 7、嵌入Service Pack中心,现在您可以进行在线升级了! 8、系统浏览器兼容性调整完毕,现在您可以在IE、firefox和遨游、腾讯TT等浏览器上正常使用本程序了 [2009-5-10] v3.1 beta1 1、部功能ajax化 2、验证机制cookies化 3、界面UI更换 [2009-1-7] v 3.0 PACK3 [本次Pack3的发布主要是bug修正、少许的功能升级,并为下一个版本做铺垫。主要升级如下:] 1、 修改后台系统设置的“每日进行当日签到统计时间”,使得当前该功能关闭时,时间输入框为不可用状态。 2、 后台增加新的开关功能,现在可以控制新注册用户是否需要后台审核了。 3、 会员注册模块有更新,现在可以在注册时看到对注册要求填写项目的用途的注册引导信息了。 [改动fun.asp zizhusing.asp] 4、 修改单机模式和局域网模式的跳转,现在当你单机测试的时候程序不再向网关发送请求来获取返回的IP地址了,而是直接使用127.0.0.1。 5、 美化了页样式 6、 在后台左边操作栏增加了ajax实时更新便签信息的功能。在版权处增加了我的QQ实时聊天联系方式 7、 升级系统的周末模式。现在员工周末进入开放了周末模式的系统将直接跳转到个人信息查看页面而不是跳转到签到页面。 8、 便签模块ajax化,每5秒读取一次新信息。 9、 修复后台为员工配签到组时页跳转错误的BUG。 [2008-10-10] v 3.0 PACK2 1 、修改所有页面的页跳转功能,有一个统一的子过程:FenPage() 统一控制,现在可以选择任意跳转到第几页了 2 、细化了签到缓冲设置,现在可以有四个参数指定签到点前后的不同缓冲了,让缓冲时间更加精确。 数据库qdsetall表增加字段 hctime_pre用来储存签到前缓冲时间,qthctime_pre用来储存签退后缓冲 数据库type表增加字段 hctime_pre用来储存签到前缓冲时间,qthctime_pre用来储存签退后缓冲 [2008-10-5] v 3.0 PACK1 1 、使得系统日志查询和签到签退功能的每页显示条数可在后台系统参数设置控制 (修改webset.asp,systemevent.asp,menberqdqt.asp,menberztkg.asp) 2 、增加签退缓冲时间设定,现在签到缓冲时间和签退缓冲时间可以单独设定了,改变了签到签退公用一个缓冲时间的模式 数据库升级: 在qdsetall表增加qthctime字段Integer default 0,贮存有签到组的人员的签退缓冲时间;在type表增加 qthctime字段Integer default 0,贮存自由签到组签退缓冲时间 修改功能添加修改删除页面:manager/ qdset2.asp,qdset_do.asp,type.asp,type_do.asp,showtime.asp 修改该功能显示页面:根目录/ payinfo.asp,qd_main.asp,fun.asp,zhinf.asp,cdinf.asp,qdinf.asp,qdinfo.asp 3、 修正了签到功能在准点签到的时候一个致命的错误;增强了本系统在单机环境测试时的IP获取稳健性(本系统采取从局域网网关返回本机IP的方式获取IP,因此在单机测试的时候会提示找不到IP。为配合该功能,在后台系统设置了一个名为“系统使用模式”的功能开关:唯一性选择“局域网模式”和“单机模式”)。 修改qd_main.asp,webset.asp,webset_do.asp,webinfo.asp 增加数据库webset表字段LanOrLocal,数据类型为Integer default 0 4 、其余发现的提示性说明文字bug小修改 userpass.asp,allqdcheck.asp,cdinf.asp,zhinf.asp,qdinf.asp [2008-3-10] v2.2 正式版 1 前台新增IP锁定功能,防止代签,后台可开关该功能。 2 前台增加“签到查询功能”,后台可开关该功能。 3 修正 自由签到功能 4 增强图形验证码生成功能 [2007-10-5] v2.1 正式版 1 修正 取回密码功能 2 加入可控制的自动注销功能 3 加入迟到过久可以切换到下一个签到点的功能 4 修正按时间察看签到纪录的 th宽度问题 5 增加“按时间段查询”员工签到纪录和EXCEL导出功能 [2007-3-29] v2.0 正式版 1 签到功能彻底更新,增加多点签到功能,每天可以设置无限多个签到点! 2 增加“签到缓冲时间”功能,时令的签到设定更加人性化! 3 人员管理的增加、修改功能中增加 “签到设定"! 4 css全面定义,增加了可选择的多个项目操作功能[例如全删除,全审核通过]! 5 员工的签到操作界面大改变,系统会按照设定依次提示员工该何时签到何时注销 6 增加所有签到纪录查询功能! 7 员工管理者[小组长]更名为“组管理者” 8 后台系统设置功能中增加两项:更改首页横幅[banner]和logo,您用不着再去修改源文件来使系统的外观个性化了 9 根据反馈,去掉了“考勤管理”模块,去除了“人员奖罚”功能, [2006-11-24] v1.2 正式版 1、前台javascript过滤空串,减少服务器负担。[修改 login.asp,login2.asp.login3.asp]。 2、修改自主注册功能里面“职务细”与后台显示不一致的问题。[修改zizhusign.asp]。 3、去掉员工管理者发布公告和文章的功能[修改后台公告和文章相关的文件,请直接覆盖]。 4、员工管理者(相当于小组长)现在只能察看本组员工的信息和迟到情况。 5、修正了“修改我的资料”功能的一处显示不当的错误。 6、管理员的后台人员资料管理现在可以选择组别来察看、也可以输入该员工的登陆账号或真实姓名来察看了,这样可以 减少管理员寻找某个特定员工的时间,也可以实现按组别管理某个特定类别的员工。 7、系统升级到1.2版本,前台top.gif和后台左上角图片更新。 [2006-10-13] V1.1 正式版 本次升级解决的问题是: 在fun.asp文件中,修正了第271行“管理者”和“员工”与后台增加人员不一致的情况。 ·修正了登陆功能,现在管理员登陆后直接进入后台,而不是像1.0版进入的是index.asp ·修正了修改公告的功能,不会再发生语句错误导致无法执行该叶面的情况。 ·修正了审核功能,现在可以正常的单个审核了。 ·增加了了审核页面中信息量,可以显示该人员工作组,真实姓名,职务,以便管理员判断。 ·增加签到积累考勤,迟到或者不签到减少原有考勤功能。 ·完善后台“人员资料”功能,增加两项功能: 1、管理员可察看单个员工的该月迟到签到纪录。 2、签到、考勤、迟到三个栏目现在按系统配置的开关选项显示或关闭了。 ·人员详细资料中增加了“排名信息”,可以显示排名和排名时间。 [2006-10-5] V1.0 正式版 功能介绍 1、概念 管理:特指人员管理,考勤管理、签到管理、排名管理、工资结算管理。 通用:开放的配置系统,可以按本单位需要设置工作组、为人员配工作组并设定工作时间等等。前后台的一些功能可以按需要决定开关, 具有很大的开放性,功能多样、选择性。 2、特色功能: (1)、签到功能:可以自由设定员工签到方式为 自由签到或者 定时签到,可以统一设定所有人签到模式和时间。如果是设定的自由签到,还可 以设定当天最多签到次数,如果是定时签到模式,当天只能签到注销一次,还可以单独修改特定人员签到方式签到时间,功能强大而灵活。员工还可以查看本月自己的签到纪录(该功能后台可以选择开放或者关闭)。关于自由签到和定时签到的具体说明以及疑问请参看本文最后的备注部。 (2)、考勤功能:可以设定签到积累考勤积(每天的第一次签到增加积),迟到人员减,[此功能1.1版更新]。管理员和员工管理者可以直接修改员工的当月考勤和记录在案的总考勤。员工可以在自己的控制面板察看考勤明细。(该功能后台可以选择开放或者关闭)。 (3)、排名功能:管理员可以对员工的 月签到次数、总签到次数;月考勤,总考勤;月迟到次数、总迟到次数进行排名并记录到数据库以供员工通过前台的查询接口查询排名。在排名的时候,系统会有两个功能予以选择,一是先排名到页面预览,一是要求选择是否员工管理者也参加排名。因为在您的公司中,员工管理者可能是属于权力部门的,他们没有被配和员工一样的工作,比如学校的校长,公司的会计等等。在查询接口,会显示当前所查看的排名纪录的排名时间,以免造成理解上的错误,因为这不是实时排名。前台的查询接口可以在后台关闭。 (4)、工资结算功能:该功能以工作时间为结算依据。计算公式为:[((月工资/本月天数)/日规定工作间)*今日有效工作时间],这里有个有效工作时间的概念,可以理解为“不超过系统设定的工作时间的工作时间”。因为会发生员工忘记注销或者超时注销的情况。因此后台可以为个个工作组设定“忘记注销默认工作时间”,这是忘记注销有效工作时间的上限。而超时注销是以改人员所在组的规定工作时间为上限的。因此超时注销不会增加你的有效工作时间。如果是自由签到,那么在系统规定的签到次数内,系统会累计今日工作时间,以规定的工作时间为上限。如果是定时签到,那么只能签到和注销一次,以后的升级版本会加入日多点定时签到的功能,请关注。

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧