没有合适的资源?快使用搜索试试~ 我知道了~
VC界面编程25.pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 26 浏览量
2021-10-08
06:47:56
上传
评论
收藏 372KB PDF 举报
温馨提示
试读
44页
VC界面编程25.pdf
资源推荐
资源详情
资源评论
VC界面编程总结
[前言:]拥有美丽的外观,软件就成功了一半。界面由控件、工具栏、菜单、窗体等元素
组成,对他们进行美化就能得到一个美丽的界面。
我们经常会使用到组合框, 而组合框是是有 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) ,这样你如果再刷新
列表框的话,才能一条目中比较长的来显示。
上面的方法是通过 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 编译
剩余43页未读,继续阅读
资源评论
maodi_lzc
- 粉丝: 1
- 资源: 4万+
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功