VC界面编程总结.pdf
《VC界面编程总结.pdf》由会员分享,可在线阅读,更多相关《VC界面编程总结.pdf(44页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、VCVC 界面编程总结界面编程总结2006-09-26 15:52前言前言:拥有美丽的外观,软件就成功了一半。界面由控件、工具栏、菜单、窗体等元素组成,对他们进行美化就能得到一个美丽的界面。让控件更醒目让控件更醒目在在 ComboBoxComboBoxComboBoxComboBox 中改变列表框的宽度中改变列表框的宽度我们经常会使用到组合框,而组合框是是有 2 种功能的-下拉和列表。一般情况下,列表框的宽度和选择框是一样宽的,但是我们有些时候确实很需要把列表框的宽度变大,一便让我们能更好的看我们要选的东西。为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一个的 WM_CTLC
2、OLOR 的消息句柄,或者使用 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 definedCRect rect;pwnd-GetWindowRe
3、ct(&rect);if(rect.Width()!=listwidth)rect.right=rect.left+listwidth;pwnd-MoveWindow(&rect);break;/todo:return a different brush if the default is not desiredreturn hbr;这样之后还没有完全好,你还得刷新一下列表框,那样才能随时根据列表框中的文本的长度,而改变列表框的宽度,要想这样的话,你还得这样,你必须扫描列表框中的条目,还得计算其中文本的长度(通过 pdc),这样你如果再刷新列表框的话,才能一条目中比较长的来显示。上面的方法是通
4、过 WM_CTLCOLOR 消息来实现的,后来才知道在 MFC 的CComboBox 类中有一个函数也可以实现同样的功能,就是:CComboBox:SetDroppedWidth(int width);通过这个函数,你可以把宽度设成你自己喜欢的值,而它的实际的宽度是下面 2 个值中的最大值:1.你所设置的值(就是通过上面的函数所设置的值)2.列表框的值如何获取一个对话控件的指针如何获取一个对话控件的指针有两种方法。其一,调用 CWnd:GetDlgItem,获取一个 CWnd*指针调用成员函数。下例调用 GetDlgItem,将返回值传给一个 CSpinButtonCtrl*以便调用CSpin
5、ButtonCtrl: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 中
6、简单地选择 Member Variables 标签,然后选择 Add Variable 按钮。如果在对话资源编辑器中,按下 Ctrl 键并双击控件即可转到 Add Member Variable 对话。VCVC 中如何改变对框中控件的颜色中如何改变对框中控件的颜色在 VC 中,当我们大量的运用控件时,往往会为改变控件的颜色所烦恼。因为 VC不象 VB 那样,可以方便地改变对话框及各个控件的颜色,要改变一个控件的颜色比较烦琐。本文所介绍的就是如何改变在一个对框上的控件的颜色。步骤如下:先创建一个基于对话框的工程,命名为 test,然后在对话框上加入一个ListBox 控件。在 testDlg.h
7、 中加入一个成员变量: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 号选手
8、);点击 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();elsereturn CDialog:OnCtlColor(pDC,pWnd,nCtlColor);现在编译并运行改程序,可以看到列表框已经变成黑色而其中的字已经变
9、为白色了!工具栏和状态条设计工具栏和状态条设计在在 VC+VC+下实现高彩色工具条下实现高彩色工具条引言引言一些 Windows 系统自带程序如资源管理器、Internet Explorer 等程序的工具条看上去和其他一些程序的工具条不太一样,在颜色上要漂亮许多。其实这些程序的工具条上的图标均为 256 色,而普通应用程序 在工具栏上所显示图标的颜色通常只有 16 色,这就决定了后者在视觉上远没有前者美观。由于 Windows 随系统而带的程序也是由开发人员编写的应用程序,这就说明通过程序编码可以实现 256 色甚至更多色彩的图标在工具栏上的显示。为此笔者经过摸索,通过 MFC编程在应用程序中
10、实现了高彩色工具条。现将实现 的主要方法介绍如下,以飨广大读者。基本设计思路基本设计思路在实现高彩色工具条之前,先研究一下普通 16 色 的工具条的实现过程,并从中总结出改进方法。在 VC 的资源视图中工具条是一个资源名为 IDR_MAINFRAME 的Toolbar 型资源,并可通过在编辑 按钮上的图标来完成工具条上图标的绘制。虽然在资源视图中工具条上各按钮的图标是相互独立的,但在存储时并非像图标一样保存为 ico 格式文件而是以 bmp 位图格式保存在磁盘上的。该位图是一个由工具条上的按钮图标组成的长条型位图图像,中间没有任何缝隙,在程序运行和在资源视图对工具条进行编辑时该图像首 先装载到
11、一个图像列表中,然后工具栏根据索引依次从图像列表中将图像显示到工具条的各个按钮上。由于 VC 限制工具栏上的图标不能超出 16 色,因此不论是在 资源视图直接编辑位图还是用复制粘贴等手段均无法获取超出 256 色的工具条(注:用复制粘贴的方法虽然在编辑视图中可以暂时显示出 256 色的图标,但在程 序运行时仍会退化成 16 色)。由于不能在资源视图中通过编辑 Toolbar 资源实现 16 色以上的图标,加之工具条在显示时有并不直接 从 Toolbar 获取图标而是从图像列表中读取,因此可以通过其他一些图像处理软件做好类似于工具条的 bmp 图像(仅颜色比普通工具条bmp 图像丰富,其 余完全
12、一样),并以位图的形式加入到程序资源。在使用时,先将其读取到图像列表,这样图像列表中用于显示到工具条上的图标的颜色就可以是 256、24 位、甚至 32 位色的了。由于工具条缺省时将直接加载资源名为IDR_MAINFRAME 的 Toolbar 型资源作为图标的来源,因此还必须通过SetImageList()函数将含有高彩色工具条位图的图像列表指定为工具条的图标来源。真彩工具条的实现真彩工具条的实现由于工具条的创建是在主框架类的 OnCreate()函数中完成的,因此高彩色图像的装载和图像列表的替换工作必须也在此进行。在进行程序设计之前,需 要做好各种准备工作,比如高彩色工具条位图的绘制、高彩
13、色位图加入到资源等。绘制工具条位图时,必须控制好图像的尺寸,如需要有 N 个边长为 M 的图标,那么需要绘制的位图尺寸为长=N*M;宽=M。真彩位图在加入到工程之后就不能再在 VC 的资源视图中进行编辑了。由于这个彩色位图仅起到美化界 面的作用,因此具体对的事件响应等工作还要通过设置原有的 Toolbar 资源来完成。准备工作就绪后,先要把工具条位图装载到图像列表,这样才能被工具条做获取。在作这一步时,必须用:LoadImage()函数去加载工具条位图,并通过宏MAKEINTRESOURCE()来指定具体要加载哪一个资源位图:HBITMAP hbm=(HBITMAP):LoadImage(Af
14、xGetInstanceHandle(),MAKEINTRESOURCE(IDB_TOOLBAR),/加载 IDB_TOOLBARIMAGE_BITMAP,/按位图格式0,0,/cx,cyLR_CREATEDIBSECTION|LR_LOADMAP3DCOLORS);LoadImage 返回一个位图句柄 HBITMAP,但在 MFC 下使用 CBitmaps 会更加方便,可创建一个CBitmap 对象并用 Attach()成员函数将它与位图句柄联系起来:CBitmap bm;bm.Attach(hbm);MFC 加载工具栏位图时使用了一个内部函数 AfxLoadSysColorBitmap()
15、将缺省颜色设定为 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 0 x0004/16 色#define ILC_COLOR8 0 x0008/25
16、6 色#define ILC_COLOR16 0 x0010/16 位色#define ILC_COLOR24 0 x0018/24 位色#define ILC_COLOR32 0 x0020/32 位色如果使用的工具条位图只有 256 色(对于多数程序这样已经足够),则显然没有必要再使用更高级别的位深度定义。最后一步,也是最关键的一步,必须通过SetImageList()函数指定工具条 m_wndToolBar 的图标来源不再是原来缺省的图像列表而是含有高彩色位图的图像列表 m_ilToolBar:m_wndToolBar.GetToolBarCtrl().SetImageList(&m_i
17、lToolBar);到此为止就可以通过 MFC 在自己编写的程序中实现类似于 IE 等软件的漂亮的工具条了。下图就是笔者用上述方法得到的程序界面:小结小结本文通过对作为工具条图标来源的图像列表的替换,实现了在普通 MFC 应用程序中具备了以往只有 Windows 系统自带程序才具备的高彩色工具条。较好地 美化了程序的界面。本文程序在 Windows 98 下,由 Microsoft Visual C+6.0 编译通过。用用 VCVC 制作非常酷的工具条制作非常酷的工具条自微软推出 Windows 95 后,一大批全新的控件使我们的应用程序更加美观,使用也更加方便。其中一个显著的变化就是工具条不
18、再是一个突出的 3D 小方框,而是变成了平面的状态,但 是只要把鼠标移动到上面,它就会自动地浮出来,大大方便了用户。笔者经过一段时间摸索,终于找到了制作这种工具条的方法。原来 Windows 95封装了许多常用的控件,大都被放在 Comctrl32.dll 中,其中 Toolbar 控件是用于制作工具条的。下面 简要介绍一下如何在 VC5.0 中添加一个 Toolbar。众所周知,所有的控件都是某一类型的窗口,所以制作 Toolbar 也要从制作窗口开始。由于 MFC 的 Toolbar 类并不支持新的功能,所以我们只好用 SDK 方法,通过API 调用来完成整个过程,该过程与制作一个传统的工
19、具条类似。Toolbar 是属于 comctrl32.dll 的扩展功能,所以要先调用InitCommonControlsEx()的函 数。该函数有一个重要的参数决定了对 Toolbar的支持,它的主要作用是注册 Toolbar 窗口,以 便在以后的程序中制作这种窗口,而普通的工具条则要调用 InitCommandControls()。需要注意的是这两个函数的写法。INITCOMMONCONTROLSEX icex;DWORD dwStyle;icex.dwSize=sizeof(INITCOMMONCONTROLSEX);/注意下面这两个参数决定了是否注册 Toolbaricex.dwICC
20、=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(),/实例NU
21、LL);判断一下窗口句柄,如果不为空,就表示窗口建立成功。此时的 Toolbar 不过是一个空空的窗口,我们可以根据需要向里面添加按钮。向 Toolbar 中 添加按钮是通过向它发送消息来 实现的,以下过程与制作传统的工具条基本一致。首先,建立一个 ImageList 控件,然后通过定义按钮的数据结构来确定每个按钮的类型。/建立一个 Imagelist 控件,HWND himl;/MYICON_CX,MYICON_CY 是每个按钮的大小himl=ImageList_Create(MYICON_CX,MYICON_CY,ILC_COLOR4,0,4);/加入事先作好的工具条位图 IDB_BITM
22、AP2ImageList_Add(himl,LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP2),NULL);/通过消息把位图加入到 Toolbar 中SendMessage(hwndTB,TB_SETIMAGELIST,0,(LPARAM)himl);下面加入 5 个普通的按钮:TBBUTTON tbArray5;/按钮的数据结构for(i=0;i5;i)tbArrayi.iBitmap=i;/第 i 个位图tbArrayi.idCommand=IDM_BUTTONSTARTi;/命令 IDtbArrayi.fsStat
23、e=TBSTATE_ENABLED;tbArrayi.fsStyle=TBSTYLE_BUTTON;/按钮风格tbArrayi.dwData=0;tbArrayi.iString=i;/显示的字符串/设置按钮结构的大小:SendMessage(hwndTB,TB_BUTTONSTRUCTSIZE,sizeof(TBBUTTON),0);/添加按钮到 Toolbar 中:SendMessage(hwndTB,TB_ADDBUTTONS,(UINT)5,(LPARAM)tbArray);至此,一个很酷的工具条基本上制作完成,最后再调用函数 ShowWindow()即可:ShowWindow(hwn
24、dTB,SW_SHOWMAXIMIZED);当点击按钮时,Toolbar 就把消息传送到父窗口中,由父窗口响应消息。Toolbar中按钮的 ID 包含在消息函数的 wParam 参数中,可以设置它 来调度不同的模块。这时可以重载父窗口的 O nCommand()函数,根据 wParam 参数判断点击了哪个按钮。假定父窗口是主窗口框架,代码如下:BOOL CMainFrame:OnCommand(WPARAM wParam,LPARAM lParam)switch(wParam)case IDM_BUTTONSTART0:AfxMessageBox(“你点中了第一个按钮!,MB_ICONINFO
25、RMATION);break;case IDM_BUTTONSTART1:AfxMessageBox(“你点中了第二个按钮!,MB_ICONINFORMATION);break;case IDM_BUTTONSTART2:AfxMessageBox(“你点中了第三个按钮!,MB_ICONINFORMATION);break;return CMainFrame:OnCommand(wParam,lParam);VisualVisual C+C+版本版本 6 6 中工具条的新特色中工具条的新特色微软在 已经推出 Visual C+6.0 预览版几个月了。正式版预计到今年年底发布。同时,预览版显示出
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC 界面 编程 总结
限制150内