VC 界面编程
总结
初级经济法重点总结下载党员个人总结TXt高中句型全总结.doc高中句型全总结.doc理论力学知识点总结pdf
2006-09-26 15:52
[前言:]拥有美丽的外观,软件就成功了一半。界面由控件、工具栏、菜单、窗体等元素
组成,对他们进行美化就能得到一个美丽的界面。
让控件更醒目在 ComboBoxComboBoxComboBoxComboBox中改变列表框的宽度
我们经常会使用到组合框,而组合框是是有 2种功能的--下拉和列表。一般情况
下,列表框的宽度和选择框是一样宽的,但是我们有些时候确实很需要把列表框
的宽度变大,一便让我们能更好的看我们要选的东西。
为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一
个的 WM_CTLCOLOR 的消息句柄,或者使用 CComboBox 的继承类,而且在其中添加
下面的代码:
HBrush tvisualcombo::onctlcolor(CDC* pdc, CWND* pwnd, UINT nctlcolor)
{
HBrush hbr = ccombobox::onctlcolor(pdc, pwnd, nctlcolor);
switch (nctlcolor) {
case ctlcolor_edit:
break;
case ctlcolor_listbox:
if (listwidth > 0) {
// new width of a listbox is defined
CRect rect;
pwnd->GetWindowRect(&rect);
if (rect.Width() != listwidth) {
rect.right = rect.left + listwidth;
pwnd->MoveWindow(&rect);
}
}
break;
}
// todo: return a different brush if the default is not desired
return hbr;
}
这样之后还没有完全好,你还得刷新一下列表框,那样才能随时根据列表框
中的文本的长度,而改变列表框的宽度,要想这样的话,你还得这样,你必须扫
描列表框中的条目,还得计算其中文本的长度(通过 pdc),这样你如果再刷新
列表框的话,才能一条目中比较长的来显示。
上面的
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
是通过 WM_CTLCOLOR 消息来实现的,后来才知道在 MFC 的
CComboBox 类中有一个函数也可以实现同样的功能,就是:
CComboBox::SetDroppedWidth(int width);
通过这个函数,你可以把宽度设成你自己喜欢的值,而它的实际的宽度是下
面 2个值中的最大值:
1.你所设置的值(就是通过上面的函数所设置的值)
2.列表框的值
如何获取一个对话控件的指针
有两种方法。其一,调用 CWnd: : GetDlgItem,获取一个 CWnd*指针调用成员函
数。下例调用 GetDlgItem,将返回值传给一个 CSpinButtonCtrl*以便调用
CSpinButtonCtrl : : SetPos 函数:
BOOL CSampleDialog : : OnInitDialog ( )
{
CDialog : : OnInitDialog ( ) ;
//Get pointer to spin button .
CSpinButtonCtrl * pSpin - ( CSpinButtonCtrl *) GetDlgItem (IDC_SPIN) ;
ASSERT _ VALID (pSpin) ;
//Set spin buttons default position .
pSpin —> SetPos (10) ;
return TRUE ;
}
其二, 可以使用 ClassWizard 将控件和成员变量联系起来。在 ClassWizard 中
简单地选择 Member Variables 标签,然后选择 Add Variable …按钮。如果在
对话资源编辑器中,按下 Ctrl 键并双击控件即可转到 Add Member Variable 对
话。
VC中如何改变对框中控件的颜色
在 VC 中,当我们大量的运用控件时,往往会为改变控件的颜色所烦恼。因为 VC
不象 VB 那样,可以方便地改变对话框及各个控件的颜色,要改变一个控件的颜
色比较烦琐。本文所介绍的就是如何改变在一个对框上的控件的颜色。步骤如下:
① 先创建一个基于对话框的工程,命名为 test,然后在对话框上加入一个
ListBox 控件。
② 在 testDlg.h 中加入一个成员变量:CBrush m_brush;
③ 在 OnInitDialog()中,加入 m_brush.CreateSolidBrush( RGB(0,0,0 );此处
设置的 RGB 值可以改变 ListBox 的背景色。为了观看 ListBox 中字的颜色变化,
我们给 ListBox 加入几个字:利用 Class Wizard 给 ListBox 加入一个 Control
类型的成员变量 m_ctrlListBox,然后在 OnInitDialog()加入如下所示的代 码:
m_ctrlListBox.AddString("1 号选手");
m_ctrlListBox.AddString("2 号选手");
④ 点击 Class Wizard,给 testDlg 加入 WM_CTLCOLOR 事件,单击 Edit Code 按
钮,然后把改函数的内容替换为如下代码:
if(nCtlColor== CTLCOLOR_LISTBOX)
{
pDC- >SetBkMode(TRANSPARENT);
pDC- >SetTextColor(RGB(255,255,255));
//此处设置字体的颜色
return (HBRUSH)m_brush.GetSafeHandle();
}
else
return CDialog::OnCtlColor (pDC, pWnd, nCtlColor);
现在编译并运行改程序,可以看到列表框已经变成黑色而其中的字已经变为白色
了!
工具栏和状态条设计
在 VC++下实现高彩色工具条
引言
一些 Windows 系统自带程序如资源管理器、Internet Explorer 等程序的工具条
看上去和其他一些程序的工具条不太一样,在颜色上要漂亮许多。其实这些程序
的工具条上的图标均为 256 色,而普通应用程序 在工具栏上所显示图标的颜色
通常只有 16 色,这就决定了后者在视觉上远没有前者美观。由于 Windows 随系
统而带的程序也是由开发人员编写的应用程序, 这就
说明
关于失联党员情况说明岗位说明总经理岗位说明书会计岗位说明书行政主管岗位说明书
通过程序编码可以实
现 256 色甚至更多色彩的图标在工具栏上的显示。为此笔者经过摸索,通过 MFC
编程在应用程序中实现了高彩色工具条。现将实现 的主要方法介绍如下,以飨
广大读者。
基本设计思路
在实现高彩色工具条之前,先研究一下普通 16 色 的工具条的实现过程,并从中
总结出改进方法。在 VC 的资源视图中工具条是一个资源名为 IDR_MAINFRAME 的
Toolbar 型资源,并可通过在编辑 按钮上的图标来完成工具条上图标的绘制。
虽然在资源视图中工具条上各按钮的图标是相互独立的,但在存储时并非像图标
一样保存为 ico 格式文件而是以 bmp 位图格式保存在磁盘上的。该位图是一个
由工具条上的按钮图标组成的长条型位图图像,中间没有任何缝隙,在程序运行
和在资源视图对工具条进行编辑时该图像首 先装载到一个图像列表中,然后工
具栏根据索引依次从图像列表中将图像显示到工具条的各个按钮上。由于 VC 限
制工具栏上的图标不能超出 16 色,因此不论是在 资源视图直接编辑位图还是用
复制粘贴等手段均无法获取超出 256 色的工具条(注:用复制粘贴的方法虽然在
编辑视图中可以暂时显示出 256 色的图标,但在程 序运行时仍会退化成 16 色)。
由于不能在资源视图中通过编辑 Toolbar 资源实现 16 色以上的图标,加之工具
条在显示时有并不直接 从 Toolbar 获取图标而是从图像列表中读取,因此可以
通过其他一些图像处理软件做好类似于工具条的 bmp 图像(仅颜色比普通工具条
bmp 图像丰富,其 余完全一样),并以位图的形式加入到程序资源。在使用时,
先将其读取到图像列表,这样图像列表中用于显示到工具条上的图标的颜色就可
以是 256、24 位、 甚至 32 位色的了。由于工具条缺省时将直接加载资源名为
IDR_MAINFRAME 的 Toolbar 型资源作为图标的来源,因此还必须通过
SetImageList()函数将含有高彩色工具条位图的图像列表指定为工具条的图标
来源。
真彩工具条的实现
由于工具条的创建是在主框架类的 OnCreate()函数中完成的,因此高彩色图
像的装载和图像列表的替换工作必须也在此进行。在进行程序设计之前,需 要
做好各种准备工作,比如高彩色工具条位图的绘制、高彩色位图加入到资源等。
绘制工具条位图时,必须控制好图像的尺寸,如需要有 N个边长为 M的图标,
那么需要绘制的位图尺寸为长=N*M;宽=M。真彩位图在加入到工程之后就不能再
在 VC 的资源视图中进行编辑了。由于这个彩色位图仅起到美化界 面的作用,因
此具体对的事件响应等工作还要通过设置原有的 Toolbar 资源来完成。
准备工作就绪后,先要把工具条位图装载到图像列表,这样才能被工具条做获取。
在作这一步时,必须用::LoadImage()函数去加载工具条位图,并通过宏
MAKEINTRESOURCE()来指定具体要加载哪一个资源位图:
HBITMAP hbm = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDB_TOOLBAR), //加载 IDB_TOOLBAR
IMAGE_BITMAP, //按位图格式
0,0, // cx,cy
LR_CREATEDIBSECTION | LR_LOADMAP3DCOLORS );
LoadImage 返回一个位图句柄 HBITMAP,但在 MFC 下使用 CBitmaps 会更加方便,
可创建一个
CBitmap 对象并用 Attach()成员函数将它与位图句柄联系起来:
CBitmap bm;
bm.Attach(hbm);
MFC 加载工具栏位图时使用了一个内部函数 AfxLoadSysColorBitmap()将缺省
颜色设定为 16 色,因此为了显示 16 色以上的图像,必须在调用图像列表类
CImageList 的 Create()函数创建图像列表时对图像清单做进一步的处理:
m_ilToolBar.Create(32,32,ILC_COLOR8, 4, 4);
m_ilToolBar.Add(&bm,(CBitmap*)NULL);
这里用 ILC_COLOR8 标明了创建的图像列表是 256 色的,在 VC 的 commctrl.h 中
对其有定义,并且还提供有其他几种颜色位深度的预定义:
#define ILC_COLOR4 0x0004 //16 色
#define ILC_COLOR8 0x0008 //256 色
#define ILC_COLOR16 0x0010 //16 位色
#define ILC_COLOR24 0x0018 //24 位色
#define ILC_COLOR32 0x0020 //32 位色
如果使用的工具条位图只有 256 色(对于多数程序这样已经足够),则显然没有
必要再使用更高级别的位深度定义。最后一步,也是最关键的一步,必须通过
SetImageList()函数指定工具条 m_wndToolBar 的图标来源不再是原来缺省的
图像列表而是含有高彩色位图的图像列表 m_ilToolBar:
m_wndToolBar.GetToolBarCtrl().SetImageList(&m_ilToolBar);
到此为止就可以通过 MFC 在自己编写的程序中实现类似于 IE 等软件的漂亮的工
具条了。下图就是笔者用上述方法得到的程序界面:
小结
本文通过对作为工具条图标来源的图像列表的替换,实现了在普通 MFC 应用程序
中具备了以往只有 Windows 系统自带程序才具备的高彩色工具条。较好地 美化
了程序的界面。本文程序在 Windows 98 下,由 Microsoft Visual C++ 6.0 编译
通过。
用 VC 制作非常酷的工具条
自微软推出 Windows 95 后,一大批全新的控件使我们的应用程序更加美观,使用
也更加方便。其中一个显著的变化就是工具条不再是一个突出的 3D 小方框,而是
变成了平面的状态,但 是只要把鼠标移动到上面,它就会自动地浮出来,大大方
便了用户。
笔者经过一段时间摸索,终于找到了制作这种工具条的方法。原来 Windows 95
封装了许多常用的控件,大都被放在 Comctrl32.dll 中,其中 Toolbar 控件是用
于制作工具条的。下面 简要介绍一下如何在 VC5.0 中添加一个 Toolbar。
众所周知,所有的控件都是某一类型的窗口,所以制作 Toolbar 也要从制作窗口
开始。由于 MFC 的 Toolbar 类并不支持新的功能,所以我们只好用 SDK 方法,通过
API 调用来完成整个过程 ,该过程与制作一个传统的工具条类似。
Toolbar 是属于 comctrl32.dll 的扩展功能,所以要先调用
InitCommonControlsEx()的函 数。该函数有一个重要的参数决定了对 Toolbar
的支持,它的主要作用是注册 Toolbar 窗口,以 便在以后的程序中制作这种窗口,
而普通的工具条则要调用 InitCommandControls()。需要注意的是这两个函数的
写法。
INITCOMMONCONTROLSEX icex;
DWORD dwStyle;
icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
//注意下面这两个参数决定了是否注册 Toolbar
icex.dwICC=ICC_COOL_CLASSES|ICC_BAR_ CLASSES;
InitCommonControlsEx(&icex);
然后就可以调用 CreateWindowEx 这个函数来建立 Toolbar 窗口:
HWND hwndTB = CreateWindowEx(
WS_EX_TOOLWINDOW, //扩展工具条风格
TOOLBARCLASSNAME, //Toolbar 类名
NULL,
WS_CHILD|WS_VISIBLE|TBSTYLE_FLAT,
//窗口风格
0,0,0,0, //大小
AfxGetApp()->GetMainWnd(), //父窗口名
NULL,
AfxGetInstanceHandle(), //实例
NULL);
判断一下窗口句柄,如果不为空,就表示窗口建立成功。此时的 Toolbar 不过是一
个空空的窗口,我们可以根据需要向里面添加按钮。向 Toolbar 中 添加按钮是
通过向它发送消息来 实现的,以下过程与制作传统的工具条基本一致。首先,建
立一个 ImageList 控件,然后通过定义按钮的数据结构来确定每个按钮的类型。
// 建立一个 Imagelist 控件,
HWND himl;
//MYICON_CX,MYICON_CY 是每个按钮的大小
himl= ImageList_Create(MYICON_CX,MYICON_CY,ILC_COLOR4,0,4);
//加入事先作好的工具条位图 IDB_BITMAP2
ImageList_Add( himl,
LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP2)),NULL);
//通过消息把位图加入到 Toolbar 中
SendMessage(hwndTB, TB_SETIMAGELIST, 0, (LPARAM)himl);
下面加入 5个普通的按钮:
TBBUTTON tbArray[5]; //按钮的数据结构
for(i=0;i<5;i++){
tbArray[i].iBitmap = i; //第 i 个位图
tbArray[i].idCommand = IDM_BUTTONSTART+i;
//命令 ID
tbArray[i].fsState = TBSTATE_ENABLED;
tbArray[i].fsStyle = TBSTYLE_BUTTON;
//按钮风格
tbArray[i].dwData = 0;
tbArray[i].iString = i; //显示的字符串
}
//设置按钮结构的大小
::SendMessage(hwndTB,TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0);
//添加按钮到 Toolbar 中
::SendMessage(hwndTB,TB_ADDBUTTONS,(UINT)5, (LPARAM)tbArray);
至此,一个很酷的工具条基本上制作完成,最后再调用函数 ShowWindow()即可:
ShowWindow(hwndTB, SW_SHOWMAXIMIZED);
当点击按钮时,Toolbar 就把消息传送到父窗口中,由父窗口响应消息。Toolbar
中按钮的 ID 包含在消息函数的 wParam 参数中,可以设置它 来调度不同的模块。
这时可以重载父窗口的 O nCommand()函数,根据 wParam 参数判断点击了哪个按
钮。假定父窗口是主窗口框架,代码如下:
BOOL CMainFrame::OnCommand(WPARAM wParam,LPARAM lParam)
{
switch(wParam){
case IDM_BUTTONSTART+0:
AfxMessageBox(“你点中了第一个按钮!!", MB_ICONINFORMATION);
break;
case IDM_BUTTONSTART+1:
AfxMessageBox(“你点中了第二个按钮!!",MB_ICONINFORMATION);
break;
case IDM_BUTTONSTART+2:
AfxMessageBox(“你点中了第三个按钮!!", MB_ICONINFORMATION);
break;
}
return CMainFrame::OnCommand(wParam,lParam);
}
Visual C++ 版本 6中工具条的新特色
微软在 www.microsoft.com/visualc 已经推出 Visual C++6.0 预览版几个月了。
正式版预计到今年年底发布。同时,预览版显示出版本 6将包含大量的改进和提
高,包括支持Internet控件,例如扁平工具 条等。虽然改进的控件包与Internet
无关,但它首先出现在 Internet Explorer 中,因此它就被取做这个名字了。事
实上,官方发布的预览版的标题是“针对 Internet Explorer 4.0 的 Visual C++
5.0 技术预览”。
在以前关于 MFC 工具条类的讨论专题中,我曾答应提供一个在版本 6中工具条的
外观演示。有一个很好的消 息,那就是你现在用 CToolBar 所作的所有工作在新
的版本中都是有效的,包括那些在以前的栏目中所描述的一些扩展功能。因此,
你将很容易修改现存的程 序以获得象 Internet Explorer 和 Visual Studio 中
那样“酷”的界面。此外,并没有什么坏消息。
工具条的新特色
早在版本 4中,CToolBar 就已被 MFC 库完全实现了。一旦公用控件动态链接库
(命名为 comctl32.dll)变得无所不在了, CToolBar 就成了如今已包含在操作
系统中的工具条控件的代名词了。然而,CToolBar 并没有揭示公用工具条控件
的所有能力。如今,通过 CreateEx()函数,它成功了。
公用控件动态链接库现在包含了至少三类风格:最初的、在 Internet
Explorer3.0 中加入的以及在 Internet Explorer 4.0 中加入的。虽然这些版本
理论上是向下兼容的,但某些专业人员曾写出一些不能在后来版本中正常运行的
应用程序,这可能是这些程序采用了一些没有公开的 功能,而这些功能并没有
被包含在所有的版本中。
Visual C++程序员没有这样的经历,因为在 Visual C++4.0 或 5.0 中
comctl32.dll 并不是一个可以再分发的组件,它在安装 Internet Explorer 时
被更新,因此 MFC 程序员无法依靠最新版本的某些功能来用于他们的程序。这就
是 CToolBar 仅仅具有最初的 DLL 的有限功能的原 因。CToolBar 能够实现最新
的特色意味着微软将在Visual C++6.0中包含最新的DLL并将其作为一个可以再
分发的组件。
绝大多数新特色将由在调用CreateEx()和其它CToolBar成员函数时指定的新的
风格标志来确定。下面是 commctrl.h 的一部分,它定义了 TBSTYLE 类标识符:
#define TBSTYLE_BUTTON 0x0000
#define TBSTYLE_SEP 0x0001
#define TBSTYLE_CHECK 0x0002
#define TBSTYLE_GROUP 0x0004
#define TBSTYLE_CHECKGROU TBSTYLE_GROUP | TBSTYLE_CHECK)
#if (_WIN32_IE $#@62;= 0x0300)
#define TBSTYLE_DROPDOWN 0x0008
#endif
#if (_WIN32_IE $#@62;= 0x0400)
#define TBSTYLE_AUTOSIZE 0x0010
#define TBSTYLE_NOPREFIX 0x0020
#endif
#define TBSTYLE_TOOLTIPS 0x0100
#define TBSTYLE_WRAPABLE 0x0200
#define TBSTYLE_ALTDRAG 0x0400
#if (_WIN32_IE $#@62;= 0x0300)
#define TBSTYLE_FLAT 0x0800
#define TBSTYLE_LIST 0x1000
#define TBSTYLE_CUSTOMERASE 0x2000
#endif
#if (_WIN32_IE $#@62;= 0x0400)
#define TBSTYLE_REGISTERDROP 0x4000
#define TBSTYLE_TRANSPARENT 0x8000
#define TBSTYLE_EX_DRAWDDARROWS 0x00000001
#endif
你会注意到其中的一些采用了条件编译,依赖于_WIN32_IE 的值,它缺省指的是
Internet Explorer 4.0(即取值为 0x0400)。对于 Internet Explorer 3.0(即
取值为 0x0300)以前的版本,大多数的 TBSTYLE 标识符指的是按钮或是一组按
钮。Internet Explorer3.0 引入了扁平钮、文本标签、下拉列表和自定义绘制。
Internet Explorer 4.0 增强了下拉列表和自定义绘制功能,并且增加了支持 OLE
拖动目标到一个工具条。
扁平钮和把手
在 过去的 18 个月中我常常被问及该如何获得象 Internet Explorer 和 Visual
Studio 中的工具条一样不使用浮雕按钮而是用扁平钮并且带有便于移动和定位
的把手那样酷的界面。这些特色并不被 MFC 所支持,因此最简单获取的方法就 是
购买一个扩展库。而对于 Visual C++ 6.0 来说却无须多此一举,因为它使得
CToolBar 类实现了对扁平钮、把手和其它新的视觉效果的支持。
在预览版中, AppWizard 并不会自动包括这些新特色,但它们却很容易被加入。
表 1显示了 AppWizard 创建的主框架窗口的 OnCreate()函数,表 2显 示了需要
做哪些修改以获得具有扁平钮和把手的工具条。图1显示了表1创建出的工具条,
而图 2显示出了表 2实现的工具条。
表 1: CMainFrame::OnCreate as generated by AppWizard
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if(CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if(!m_wndToolBar.Create(this)||!m_wndToolBar.LoadToolBar(IDR_MAINFRAM
E))
{
TRACE0("Failed to create toolbarn");
return -1; // fail to create
}
if(!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)))
图 1
表 2: Adding flat buttons and the gripper
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if(CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if(!m_wndToolBar.CreateEx(this)||!m_wndToolBar.LoadToolBar(IDR_MAINFR
AME))
{
TRACE0("Failed to create toolbarn");
return -1; // fail to create
}
if(!m_wndStatusBar.Create(this)||!m_wndStatusBar.SetIndicators(indica
tors,sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status barn");
return -1; // fail to create
}
// TODO: Remove this if you dont want tool tips or a resizeable toolbar
m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |
CBRS_GRIPPER | CBRS_BORDER_3D | CBRS_TOOLTIPS | CBRS_FLYBY |
CBRS_SIZE_DYNAMIC);
// TODO: Delete these three lines if you dont want the toolbar to
// be dockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
return 0;
}
图 2
为了作出扁平按钮我必须使用 CreateEx()来代替 Create()。这个新的函数
在 afxext.h 中声明:
BOOL CreateEx
(
CWnd* pParentWnd, // parent window
DWORD dwCtrlStyle = TBSTYLE_FLAT, // extended style
DWORD dwStyle = // style
WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP,
CRect rcBorders = CRect(0,0,0,0), // border rectangle
UINT nID = AFX_IDW_TOOLBAR // identifier
);
因为扩展风格缺省指的就是 TBSTYLE_FLAT,因此我要得到扁平按钮就只需要简
单地将 AppWizard 形成的代码中的 Create()改为 CreateEx()即可。我将在后面
实现其它的扩展风格。为了获得把手,我必须在调用 SetBarStyle()函数时包含
CBRS_GRIPPER 标志,参看表 2。这是 CControlBar 类的一个新风格,而 CToolBar
类是从它继承而来的。请注意到我也加入了 CBRS_BORDER_3D 标志,这是为了修
正一个未知的绘制问题,该问题将会在工具条的边缘绘制一些多余的点。这也许
意味着预览版确实有这个问题,因 为一旦我将 3D 标志加入就立即解决了并且也
似乎没有影响到别的什么。
上面所作的两个简单的改变是使得一个已存程序获得酷界面的最省力的方法。在
一个程序具有了扁平钮和把手的同时,它也不会发生不应有的其它改变。(未完)
标题栏上添加按钮
自 从 Windows 操作系统出现以后,在应用程序中进行人机交互的思想和手段便
发生了根本性的改变,计算机的界面变得友好精彩。一个程序的好坏很大程度
上决 定于人机交互的方便程度。当前,大多数程序的标题栏都千篇一律,如何
让自己的程序与众不同是每个程序员的梦想,但改变标题栏的内容的确有相当
的难度。该篇 文章向你介绍如何在标题栏上添加图标按钮,而且当鼠标经过和
点击该图标时,鼠标将有不同的反应。请按照下面的步骤实现。
第一步:打开 VC 编程环境,生成一个新的基于单文档的工程 temp,所有的选项
都取默认值,下面,我们就在此工程的标题栏上生成三个按钮图标。
第二步:下载资源文件,共有三个文件:CaptionButton.cpp、CaptionButton.h
和 Thunk.h。将这三个文件添加到工程中(添加方法不必细说了吧)。
第三步:在 Mainfrm.h 中定义变量 CCaptionButton cbExtra;,当然要包含头文
件#include "CaptionButton.h"。
第四步:为工程加载位图资源,ID 号分别为 IDB_BITMAP1、IDB_BITMAP2、
IDB_BITMAP3、IDB_BITMAP6、IDB_BITMAP7。这些位图将显示在标题栏上,至于
用什么样的位图就看你的喜好了。
第五步:在 Mainfrm.cpp 的 OnCreate 函数中添加如下的代码:
//初识化,m_hWnd 是我们要处理的窗口句柄
cbExtra.Init(m_hWnd);
// // 设置标题栏上的原来的按钮(最大化、最小化和关闭)保留的数目
cbExtra.SetNumOfDefaultCaptions(3);
// 设置位图的透明颜色
COLORREF crTransparent = RGB(255,0,255);
cbExtra.SetTransparentColor(crTransparent);
// 鼠标选中一个位图后该位图的样子
cbExtra.SetSelectionBitmap((HBITMAP)LoadImage(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDB_BITMAP7),
IMAGE_BITMAP,
0,
0,
LR_LOADMAP3DCOLORS|LR_DEFAULTCOLOR));
// 鼠标移动到一个位图后,该位图的变化
HBITMAP hMouseOverBitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDB_BITMAP2),
IMAGE_BITMAP,
0,
0,
LR_LOADMAP3DCOLORS|LR_DEFAULTCOLOR);
// 设置位图 1
HBITMAP hCaptionAMBitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDB_BITMAP3),
IMAGE_BITMAP,
0,
0,
LR_LOADMAP3DCOLORS|LR_DEFAULTCOLOR);
HBITMAP hCaptionAMBitmapHilite =
CCaptionButton::CombineBitmaps(hCaptionAMBitmap,
hMouseOverBitmap, crTransparent);
// 设置位图 2
HBITMAP hCaption2Bitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDB_BITMAP6),
IMAGE_BITMAP,
0,
0,
LR_LOADMAP3DCOLORS|LR_DEFAULTCOLOR);
HBITMAP hCaption2BitmapHilite =
CCaptionButton::CombineBitmaps(hCaption2Bitmap,
hMouseOverBitmap,crTransparent);
// 设置位图三
HBITMAP hCaption3Bitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDB_BITMAP1),
IMAGE_BITMAP,
0,
0,
LR_LOADMAP3DCOLORS|LR_DEFAULTCOLOR);
HBITMAP hCaption3BitmapHilite =
CCaptionButton::CombineBitmaps(hCaption3Bitmap,
hMouseOverBitmap,crTransparent);
// 利用上面的定义创建标题栏上的位图,宝库位图的 ID 号,鼠标经过时的
file://变换位图,鼠标选择时的变换位图和提示文字。
cbExtra.New(1,hCaptionAMBitmapHilite,hCaptionAMBitmap,"guan");
cbExtra.New(2,hCaption2BitmapHilite,hCaption2Bitmap,"xi");
cbExtra.New(3,hCaption3BitmapHilite,hCaption3Bitmap,"ming");
第六步:现在我们可以先停下来看看我们的成果如何。编译我们的工程,运行,
我们可以发现,我们的标题栏上增加了三个按钮,鼠标在上面移动或点击的时
候,位图会发生变化。只是我们还没有添加在位图上点击是的处理函数,不要
急,接下来我们就添加相应的处理函数。
第七步:当我们在标题栏上点击图标时,将有一个消息 WM_CBLBUTTONCLICKED
产生,参数 WPARAM 是指点击图标的 ID 号。
在mainfrm.h中定义消息映射函数afx_msg LRESULT Hit(WPARAM wParam, LPARAM
lParam);
在 mainfrm.cpp 中定义函数实现:
ON_MESSAGE(WM_CBLBUTTONCLICKED, Hit)
LRESULT CMainFrame::Hit(WPARAM wParam, LPARAM lParam)
{
switch(wParam)
{// begin wParam
case 1:
AfxMessageBox("第一个 CAPtion");
break;
case 2:
AfxMessageBox("第二个 Caption");
break;
case 3:
AfxMessageBox("第三个 Caption");
break;
}
return 1;
}
这样,当我们单击图标时将弹出不同的提示对话框,这只是一个例子,至于实
现什么样的功能随你的便了。
第八步:标题栏的动态改变。在程序的执行过程中如果你要改变标题栏的样子
你同样可以实现,下面分别给出如何删除一个图标和更改一个图标的样子。
void CMainFrame::OnDelete()
{
cbExtra.Delete(1);
}
void CMainFrame::OnChange()
{
cbExtra.Replace(1,
1,
hCaption4BitmapHilite,
hCaption4Bitmap,
"pNewToolTipText");
}
好了,功能实现了,还算满意吧,希望对你有用。
通过例程
分析
定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析
状态条用法
状 态条是一个包含信息的控制条,通常用于信息和状态提示,这里信息是有关
菜单命令或工具命令的提示字符串以及其它指示/帮助信息,而状态是用来指示
SCROLL LOCK 和 NUM LOCK 等一些键的状态。状态条通常框架窗口的底部。状态
条的信息行能显示有关的程序状态或鼠标指向的工具按钮或菜单项的信息。状
态条既不能接受用户输 入,也不产生命令信息。
实际上,从编程人员的角度出发(至少是那些使用 AppWizard 创建应用程序的
编程人员),状态条是如此普 通,它们并不像工具条那样允许用户编辑的资源。
在创建程序框架时,用户只需告诉 AppWizard 为应用程序包含一个状态条,可
以说,此时,用户的工作就 完成了。但是,我们如果巧妙使用工具条,我们会
发现它可以帮我们实现很多功能。
按以下做法我们实现在状态条上显示滚动字符串,鼠标的坐标,动态时钟。
第一步:
运行 AppWizard 生成一个工程 mystatus,接受所有的默认设置,除了下面两步:
在 step 1 中选 Single Document ;step 4 中去掉 Docking Bar 前的对钩,然
后点击 Advanced 按钮,选择Window Styles 中的 Maximized 选项。点击Finish
按钮,此时我们生成了一个工程。运行我们可以发现程序默认生成的状态条,
接下来我们要对这个状态条进行修改。
第二步:
在这一步我们将实现把状态条移到菜单的下边。在 MainFrm.cpp 中我们可以看
到状态条的定义部分
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status barn");
return -1; // fail to create
}
我们所要做的是将上面的定义改为
if(!m_wndStatusBar.Create(this,
WS_CHILD|WS_VISIBLE|CBRS_TOP,AFX_IDW_STATUS_BAR)
||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status barn");
return -1; // fail to create
}
运行程序,这时我们可以发现,状态条已经移到了上边。
第三步:
在这一步,我们实现在状态条实现滚动文字。
< 1 > 在 MainFrm.cpp 中,我们可以发现如下的定义
static UINT indicators[] =
{
ID_SEPARATOR,
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
我们将其改为
static UINT indicators[] =
{
ID_SEPARATOR,
ID_STATUS1,
ID_STATUS2,
ID_STATUS3,
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
<2>在菜单 VIEW 中选择 Resource Symbols , 在对话框中选择 NEW, 在 NAME 中
输入 ID_STATUS1,VALUE 中取默认值,同样方法定义 ID_STATUS2,ID_STATUS3。
<3>定义字符串资源,在ResouceView中选择String Table,在其中为ID_STATUS1
定义字符串资源为"me",同样方法定义 ID_STATUS2,ID_STATUS3。
<4>在 MainFrm.h 中定义如下变量:
public:
CString str,str1;
<5>在 MainFrm.cpp 中修改 OnCreate 函数如下:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if(!m_wndStatusBar.Create (this,WS_CHILD|WS_VISIBLE|CBRS_TOP,
AFX_IDW_STATUS_BAR)
|| !m_wndStatusBar.SetIndicators(indicators,sizeof(indicator
s) /sizeof(UINT)))
{
TRACE0("Failed to create status barn");
return -1; // fail to create
}
m_wndStatusBar.SetPaneInfo(1,ID_STATUS1,SBPS_POPOUT,320);
m_wndStatusBar.SetPaneInfo(2,ID_STATUS2,SBPS_POPOUT,100);
m_wndStatusBar.SetPaneInfo(3,ID_STATUS3,SBPS_POPOUT,100);
str1=str="你好,欢迎使用本程序,祝你合家幸福,事业有成!";
SetTimer(1,200,NULL);
SetTimer(2,10,NULL);
return 0;
}
<6>在类 CmainFrame 中重载函数 OnTimer(),并添加如下代码:
void CMainFrame::OnTimer(UINT nIDEvent)
{
file:// TODO: Add your message handler code here and/or call default
if(nIDEvent==1){
if(str.IsEmpty()) str=str1;
str=str.Right(str.GetLength()-2);
m_wndStatusBar.SetPaneText(1,str);
}
if(nIDEvent==2){
SYSTEMTIME t;
::GetLocalTime(&t);
CString str2;
str2.Format("%d:%d:%d:%d",t.wHour,t.wMinute,t.wSecond,t.wMilliseconds
);
m_wndStatusBar.SetPaneText(3,str2);
}
CFrameWnd::OnTimer(nIDEvent);
}
<7>将 MainFrm.h 中,定义 m_wndStatusBar 之前的 protected: 改为 public:
<8>通过类向导在类 CmystatusView 中重载 WM_MOUSEMOVE,并在实现函数中添加
如下代码:
void CMystatusView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CString str3;
str3.Format("X:%d,Y:%d",point.x,point.y);
((CMainFrame*)AfxGetMainWnd())->m_wndStatusBar.SetPaneText(2,str3);
CView::OnMouseMove(nFlags, point);
}
好了,到这里我们所有的功能就都实现了,快编译运行一下吧!怎么样?还满
意吗?
让标题栏文字居中
|添加以下模块:
PublicSubCenterC(frmAsForm)
DimSpcFAsIntegerHowmanyspacescanfit
DimclenAsIntegercaptionlength
DimoldcAsStringoldcaption
DimiAsIntegernotimportant
removeanyspacesattheendsofthecaption
veryeasyifyoureaditcarefully
oldc=frm.Caption
DoWhileLeft(oldc,1)=Space(1)
DoEvents
oldc=Right(oldc,Len(oldc)-1)
Loop
DoWhileRight(oldc,1)=Space(1)
DoEvents
oldc=Left(oldc,Len(oldc)-1)
Loop
clen=Len(oldc)
IfInStr(oldc,"!")$#@60;$#@62;0Then
IfInStr(oldc,"")$#@60;$#@62;0Then
clen=clen*1.5
Else
clen=clen*1.4
EndIf
Else
IfInStr(oldc,"")$#@60;$#@62;0Then
clen=clen*1.4
Else
clen=clen*1.3
EndIf
EndIf
seehowmanycharacterscanfit
SpcF=frm.Width/61.2244howmanyspacecanfit itthecaption
SpcF=SpcF-clenHowmanyspacescanfit-Howmuch spacethe
tiontakesup
Nowthetrickypart
IfSpcF$#@62;1Then
DoEventsspeeduptheprogram
frm.Caption=Space(Int(SpcF/2))+oldc
Elseiftheformistoosmallforspaces
frm.Caption=oldc
EndIf
EndSub
|在窗体中添加以下代码:
DimoldsizeAsLong
PrivateSubForm_Resize()
IfMe.Width=oldsizeTheni