下载

1下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 VC界面编程总结

VC界面编程总结.doc

VC界面编程总结

有缘之士
2013-03-15 0人阅读 举报 0 0 暂无简介

简介:本文档为《VC界面编程总结doc》,可适用于IT/计算机领域

VC界面编程总结[前言:]拥有美丽的外观软件就成功了一半。界面由控件、工具栏、菜单、窗体等元素组成对他们进行美化就能得到一个美丽的界面。我们经常会使用到组合框而组合框是是有种功能的下拉和列表。一般情况下列表框的宽度和选择框是一样宽的但是我们有些时候确实很需要把列表框的宽度变大一便让我们能更好的看我们要选的东西。  为了能有这个功能我写了下面的这个函数。首先得在你的对话框中添加一个的WMCTLCOLOR的消息句柄或者使用CComboBox的继承类而且在其中添加下面的代码:HBrushtvisualcombo::onctlcolor(CDC*pdc,CWND*pwnd,UINTnctlcolor){HBrushhbr=ccombobox::onctlcolor(pdc,pwnd,nctlcolor)switch(nctlcolor){casectlcoloredit:breakcasectlcolorlistbox:if(listwidth>){newwidthofalistboxisdefinedCRectrectpwnd>GetWindowRect(rect)if(rectWidth()!=listwidth){rectright=rectleftlistwidthpwnd>MoveWindow(rect)}}break}   todo:returnadifferentbrushifthedefaultisnotdesiredreturnhbr}  这样之后还没有完全好你还得刷新一下列表框那样才能随时根据列表框中的文本的长度而改变列表框的宽度要想这样的话你还得这样你必须扫描列表框中的条目还得计算其中文本的长度(通过pdc)这样你如果再刷新列表框的话才能一条目中比较长的来显示。  上面的方法是通过WMCTLCOLOR消息来实现的后来才知道在MFC的CComboBox类中有一个函数也可以实现同样的功能就是:CComboBox::SetDroppedWidth(intwidth)  通过这个函数你可以把宽度设成你自己喜欢的值而它的实际的宽度是下面个值中的最大值:  你所设置的值(就是通过上面的函数所设置的值)  列表框的值如何获取一个对话控件的指针有两种方法。其一调用CWnd::GetDlgItem获取一个CWnd*指针调用成员函数。下例调用GetDlgItem将返回值传给一个CSpinButtonCtrl*以便调用CSpinButtonCtrl::SetPos函数:BOOLCSampleDialog::OnInitDialog(){CDialog::OnInitDialog()GetpointertospinbuttonCSpinButtonCtrl*pSpin(CSpinButtonCtrl*)GetDlgItem(IDCSPIN)ASSERTVALID(pSpin)SetspinbuttonsdefaultpositionpSpin>SetPos()returnTRUE}其二可以使用ClassWizard将控件和成员变量联系起来。在ClassWizard中简单地选择MemberVariables标签然后选择AddVariable…按钮。如果在对话资源编辑器中按下Ctrl键并双击控件即可转到AddMemberVariable对话。VC中如何改变对框中控件的颜色在VC中当我们大量的运用控件时往往会为改变控件的颜色所烦恼。因为VC不象VB那样可以方便地改变对话框及各个控件的颜色要改变一个控件的颜色比较烦琐。本文所介绍的就是如何改变在一个对框上的控件的颜色。步骤如下:①先创建一个基于对话框的工程命名为test然后在对话框上加入一个ListBox控件。②在testDlgh中加入一个成员变量:CBrushmbrush③在OnInitDialog()中加入mbrushCreateSolidBrush(RGB(,,)此处设置的RGB值可以改变ListBox的背景色。为了观看ListBox中字的颜色变化我们给ListBox加入几个字:利用ClassWizard给ListBox加入一个Control类型的成员变量mctrlListBox然后在OnInitDialog()加入如下所示的代码:mctrlListBoxAddString("号选手")mctrlListBoxAddString("号选手")④点击ClassWizard给testDlg加入WMCTLCOLOR事件单击EditCode按钮然后把改函数的内容替换为如下代码:if(nCtlColor==CTLCOLORLISTBOX){pDC>SetBkMode(TRANSPARENT)pDC>SetTextColor(RGB(,,))此处设置字体的颜色return(HBRUSH)mbrushGetSafeHandle()}elsereturnCDialog::OnCtlColor(pDC,pWnd,nCtlColor)现在编译并运行改程序可以看到列表框已经变成黑色而其中的字已经变为白色了!工具栏和状态条设计在VC下实现高彩色工具条引言一些Windows系统自带程序如资源管理器、InternetExplorer等程序的工具条看上去和其他一些程序的工具条不太一样在颜色上要漂亮许多。其实这些程序的工具条上的图标均为色而普通应用程序在工具栏上所显示图标的颜色通常只有色这就决定了后者在视觉上远没有前者美观。由于Windows随系统而带的程序也是由开发人员编写的应用程序这就说明通过程序编码可以实现色甚至更多色彩的图标在工具栏上的显示。为此笔者经过摸索通过MFC编程在应用程序中实现了高彩色工具条。现将实现的主要方法介绍如下以飨广大读者。基本设计思路在实现高彩色工具条之前先研究一下普通色的工具条的实现过程并从中总结出改进方法。在VC的资源视图中工具条是一个资源名为IDRMAINFRAME的Toolbar型资源并可通过在编辑按钮上的图标来完成工具条上图标的绘制。虽然在资源视图中工具条上各按钮的图标是相互独立的但在存储时并非像图标一样保存为ico格式文件而是以bmp位图格式保存在磁盘上的。该位图是一个由工具条上的按钮图标组成的长条型位图图像中间没有任何缝隙在程序运行和在资源视图对工具条进行编辑时该图像首先装载到一个图像列表中然后工具栏根据索引依次从图像列表中将图像显示到工具条的各个按钮上。由于VC限制工具栏上的图标不能超出色因此不论是在资源视图直接编辑位图还是用复制粘贴等手段均无法获取超出色的工具条(注:用复制粘贴的方法虽然在编辑视图中可以暂时显示出色的图标但在程序运行时仍会退化成色)。由于不能在资源视图中通过编辑Toolbar资源实现色以上的图标加之工具条在显示时有并不直接从Toolbar获取图标而是从图像列表中读取因此可以通过其他一些图像处理软件做好类似于工具条的bmp图像(仅颜色比普通工具条bmp图像丰富其余完全一样)并以位图的形式加入到程序资源。在使用时先将其读取到图像列表这样图像列表中用于显示到工具条上的图标的颜色就可以是、位、甚至位色的了。由于工具条缺省时将直接加载资源名为IDRMAINFRAME的Toolbar型资源作为图标的来源因此还必须通过SetImageList()函数将含有高彩色工具条位图的图像列表指定为工具条的图标来源。真彩工具条的实现由于工具条的创建是在主框架类的OnCreate()函数中完成的因此高彩色图像的装载和图像列表的替换工作必须也在此进行。在进行程序设计之前需要做好各种准备工作比如高彩色工具条位图的绘制、高彩色位图加入到资源等。绘制工具条位图时必须控制好图像的尺寸如需要有N个边长为M的图标那么需要绘制的位图尺寸为长=N*M宽=M。真彩位图在加入到工程之后就不能再在VC的资源视图中进行编辑了。由于这个彩色位图仅起到美化界面的作用因此具体对的事件响应等工作还要通过设置原有的Toolbar资源来完成。准备工作就绪后先要把工具条位图装载到图像列表这样才能被工具条做获取。在作这一步时必须用::LoadImage()函数去加载工具条位图并通过宏MAKEINTRESOURCE()来指定具体要加载哪一个资源位图:HBITMAPhbm=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDBTOOLBAR),加载IDBTOOLBARIMAGEBITMAP,按位图格式,,cx,cyLRCREATEDIBSECTION|LRLOADMAPDCOLORS)LoadImage返回一个位图句柄HBITMAP但在MFC下使用CBitmaps会更加方便可创建一个CBitmap对象并用Attach()成员函数将它与位图句柄联系起来:CBitmapbmbmAttach(hbm)MFC加载工具栏位图时使用了一个内部函数AfxLoadSysColorBitmap()将缺省颜色设定为色因此为了显示色以上的图像必须在调用图像列表类CImageList的Create()函数创建图像列表时对图像清单做进一步的处理:milToolBarCreate(,,ILCCOLOR,,)milToolBarAdd(bm,(CBitmap*))这里用ILCCOLOR标明了创建的图像列表是色的在VC的commctrlh中对其有定义并且还提供有其他几种颜色位深度的预定义:#defineILCCOLORx色#defineILCCOLORx色#defineILCCOLORx位色#defineILCCOLORx位色#defineILCCOLORx位色如果使用的工具条位图只有色(对于多数程序这样已经足够)则显然没有必要再使用更高级别的位深度定义。最后一步也是最关键的一步必须通过SetImageList()函数指定工具条mwndToolBar的图标来源不再是原来缺省的图像列表而是含有高彩色位图的图像列表milToolBar:mwndToolBarGetToolBarCtrl()SetImageList(milToolBar)到此为止就可以通过MFC在自己编写的程序中实现类似于IE等软件的漂亮的工具条了。下图就是笔者用上述方法得到的程序界面:小结本文通过对作为工具条图标来源的图像列表的替换实现了在普通MFC应用程序中具备了以往只有Windows系统自带程序才具备的高彩色工具条。较好地美化了程序的界面。本文程序在Windows下由MicrosoftVisualC编译通过。用VC制作非常酷的工具条自微软推出Windows后,一大批全新的控件使我们的应用程序更加美观,使用也更加方便。其中一个显著的变化就是工具条不再是一个突出的D小方框,而是变成了平面的状态,但是只要把鼠标移动到上面,它就会自动地浮出来大大方便了用户。笔者经过一段时间摸索,终于找到了制作这种工具条的方法。原来Windows封装了许多常用的控件,大都被放在Comctrldll中其中Toolbar控件是用于制作工具条的。下面简要介绍一下如何在VC中添加一个Toolbar。众所周知,所有的控件都是某一类型的窗口,所以制作Toolbar也要从制作窗口开始。由于MFC的Toolbar类并不支持新的功能,所以我们只好用SDK方法,通过API调用来完成整个过程该过程与制作一个传统的工具条类似。Toolbar是属于comctrldll的扩展功能,所以要先调用InitCommonControlsEx()的函数。该函数有一个重要的参数决定了对Toolbar的支持,它的主要作用是注册Toolbar窗口,以便在以后的程序中制作这种窗口,而普通的工具条则要调用InitCommandControls()。需要注意的是这两个函数的写法。INITCOMMONCONTROLSEXicexDWORDdwStyleicexdwSize=sizeof(INITCOMMONCONTROLSEX)注意下面这两个参数决定了是否注册ToolbaricexdwICC=ICCCOOLCLASSES|ICCBARCLASSESInitCommonControlsEx(&icex)然后就可以调用CreateWindowEx这个函数来建立Toolbar窗口:HWNDhwndTB=CreateWindowEx(WSEXTOOLWINDOW,扩展工具条风格TOOLBARCLASSNAME,Toolbar类名,WSCHILD|WSVISIBLE|TBSTYLEFLAT窗口风格,,,,大小AfxGetApp()->GetMainWnd(),父窗口名,AfxGetInstanceHandle(),实例)判断一下窗口句柄,如果不为空,就表示窗口建立成功。此时的Toolbar不过是一个空空的窗口我们可以根据需要向里面添加按钮。向Toolbar中添加按钮是通过向它发送消息来实现的,以下过程与制作传统的工具条基本一致。首先,建立一个ImageList控件,然后通过定义按钮的数据结构来确定每个按钮的类型。建立一个Imagelist控件,HWNDhimlMYICONCX,MYICONCY是每个按钮的大小himl=ImageListCreate(MYICONCX,MYICONCY,ILCCOLOR,,)加入事先作好的工具条位图IDBBITMAPImageListAdd(himl,LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDBBITMAP)),)通过消息把位图加入到Toolbar中SendMessage(hwndTB,TBSETIMAGELIST,,(LPARAM)himl)下面加入个普通的按钮:TBBUTTONtbArray按钮的数据结构for(i=i<i++){tbArrayiiBitmap=i第i个位图tbArrayiidCommand=IDMBUTTONSTART+i命令IDtbArrayifsState=TBSTATEENABLEDtbArrayifsStyle=TBSTYLEBUTTON按钮风格tbArrayidwData=tbArrayiiString=i显示的字符串}设置按钮结构的大小::SendMessage(hwndTB,TBBUTTONSTRUCTSIZE,sizeof(TBBUTTON),)添加按钮到Toolbar中::SendMessage(hwndTB,TBADDBUTTONS,(UINT),(LPARAM)tbArray)至此,一个很酷的工具条基本上制作完成,最后再调用函数ShowWindow()即可:ShowWindow(hwndTB,SWSHOWMAXIMIZED)当点击按钮时,Toolbar就把消息传送到父窗口中,由父窗口响应消息。Toolbar中按钮的ID包含在消息函数的wParam参数中,可以设置它来调度不同的模块。这时可以重载父窗口的OnCommand()函数,根据wParam参数判断点击了哪个按钮。假定父窗口是主窗口框架,代码如下:BOOLCMainFrame::OnCommand(WPARAMwParam,LPARAMlParam){switch(wParam){caseIDMBUTTONSTART+:AfxMessageBox(“你点中了第一个按钮!!",MBICONINFORMATION)breakcaseIDMBUTTONSTART+:AfxMessageBox(“你点中了第二个按钮!!",MBICONINFORMATION)breakcaseIDMBUTTONSTART+:AfxMessageBox(“你点中了第三个按钮!!",MBICONINFORMATION)break}returnCMainFrame::OnCommand(wParam,lParam)}VisualC版本中工具条的新特色微软在wwwmicrosoftcomvisualc已经推出VisualC预览版几个月了。正式版预计到今年年底发布。同时预览版显示出版本将包含大量的改进和提高包括支持Internet控件,例如扁平工具条等。虽然改进的控件包与Internet无关但它首先出现在InternetExplorer中因此它就被取做这个名字了。事实上官方发布的预览版的标题是“针对InternetExplorer的VisualC技术预览”。在以前关于MFC工具条类的讨论专题中我曾答应提供一个在版本中工具条的外观演示。有一个很好的消息那就是你现在用CToolBar所作的所有工作在新的版本中都是有效的包括那些在以前的栏目中所描述的一些扩展功能。因此你将很容易修改现存的程序以获得象InternetExplorer和VisualStudio中那样“酷”的界面。此外并没有什么坏消息。工具条的新特色早在版本中CToolBar就已被MFC库完全实现了。一旦公用控件动态链接库(命名为comctldll)变得无所不在了CToolBar就成了如今已包含在操作系统中的工具条控件的代名词了。然而CToolBar并没有揭示公用工具条控件的所有能力。如今通过CreateEx()函数它成功了。公用控件动态链接库现在包含了至少三类风格:最初的、在InternetExplorer中加入的以及在InternetExplorer中加入的。虽然这些版本理论上是向下兼容的但某些专业人员曾写出一些不能在后来版本中正常运行的应用程序这可能是这些程序采用了一些没有公开的功能而这些功能并没有被包含在所有的版本中。VisualC程序员没有这样的经历因为在VisualC或中comctldll并不是一个可以再分发的组件它在安装InternetExplorer时被更新因此MFC程序员无法依靠最新版本的某些功能来用于他们的程序。这就是CToolBar仅仅具有最初的DLL的有限功能的原因。CToolBar能够实现最新的特色意味着微软将在VisualC中包含最新的DLL并将其作为一个可以再分发的组件。绝大多数新特色将由在调用CreateEx()和其它CToolBar成员函数时指定的新的风格标志来确定。下面是commctrlh的一部分它定义了TBSTYLE类标识符:#defineTBSTYLEBUTTONx#defineTBSTYLESEPx#defineTBSTYLECHECKx#defineTBSTYLEGROUPx#defineTBSTYLECHECKGROUTBSTYLEGROUP|TBSTYLECHECK)#if(WINIE$#=x)#defineTBSTYLEDROPDOWNx#endif#if(WINIE$#=x)#defineTBSTYLEAUTOSIZEx#defineTBSTYLENOPREFIXx#endif#defineTBSTYLETOOLTIPSx#defineTBSTYLEWRAPABLEx#defineTBSTYLEALTDRAGx#if(WINIE$#=x)#defineTBSTYLEFLATx#defineTBSTYLELISTx#defineTBSTYLECUSTOMERASEx#endif#if(WINIE$#=x)#defineTBSTYLEREGISTERDROPx#defineTBSTYLETRANSPARENTx#defineTBSTYLEEXDRAWDDARROWSx#endif你会注意到其中的一些采用了条件编译依赖于WINIE的值它缺省指的是InternetExplorer(即取值为x)。对于InternetExplorer(即取值为x)以前的版本大多数的TBSTYLE标识符指的是按钮或是一组按钮。InternetExplorer引入了扁平钮、文本标签、下拉列表和自定义绘制。InternetExplorer增强了下拉列表和自定义绘制功能并且增加了支持OLE拖动目标到一个工具条。扁平钮和把手在过去的个月中我常常被问及该如何获得象InternetExplorer和VisualStudio中的工具条一样不使用浮雕按钮而是用扁平钮并且带有便于移动和定位的把手那样酷的界面。这些特色并不被MFC所支持因此最简单获取的方法就是购买一个扩展库。而对于VisualC来说却无须多此一举因为它使得CToolBar类实现了对扁平钮、把手和其它新的视觉效果的支持。在预览版中AppWizard并不会自动包括这些新特色但它们却很容易被加入。表显示了AppWizard创建的主框架窗口的OnCreate()函数表显示了需要做哪些修改以获得具有扁平钮和把手的工具条。图显示了表创建出的工具条而图显示出了表实现的工具条。表:CMainFrame::OnCreateasgeneratedbyAppWizardintCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct){if(CMDIFrameWnd::OnCreate(lpCreateStruct)==)returnif(!mwndToolBarCreate(this)||!mwndToolBarLoadToolBar(IDRMAINFRAME)){TRACE("Failedtocreatetoolbarn")returnfailtocreate}if(!mwndStatusBarCreate(this)||!mwndStatusBarSetIndicators(indicators,sizeof(indicators)))图表:AddingflatbuttonsandthegripperintCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct){if(CMDIFrameWnd::OnCreate(lpCreateStruct)==)returnif(!mwndToolBarCreateEx(this)||!mwndToolBarLoadToolBar(IDRMAINFRAME)){TRACE("Failedtocreatetoolbarn")returnfailtocreate}if(!mwndStatusBarCreate(this)||!mwndStatusBarSetIndicators(indicators,sizeof(indicators)sizeof(UINT))){TRACE("Failedtocreatestatusbarn")returnfailtocreate}TODO:RemovethisifyoudontwanttooltipsoraresizeabletoolbarmwndToolBarSetBarStyle(mwndToolBarGetBarStyle()|CBRSGRIPPER|CBRSBORDERD|CBRSTOOLTIPS|CBRSFLYBY|CBRSSIZEDYNAMIC)TODO:DeletethesethreelinesifyoudontwantthetoolbartobedockablemwndToolBarEnableDocking(CBRSALIGNANY)EnableDocking(CBRSALIGNANY)DockControlBar(mwndToolBar)return}图  为了作出扁平按钮我必须使用CreateEx()来代替Create()。这个新的函数在afxexth中声明:BOOLCreateEx(CWnd*pParentWnd,parentwindowDWORDdwCtrlStyle=TBSTYLEFLAT,extendedstyleDWORDdwStyle=styleWSCHILD|WSVISIBLE|CBRSALIGNTOP,CRectrcBorders=CRect(,,,),borderrectangleUINTnID=AFXIDWTOOLBARidentifier)因为扩展风格缺省指的就是TBSTYLEFLAT因此我要得到扁平按钮就只需要简单地将AppWizard形成的代码中的Create()改为CreateEx()即可。我将在后面实现其它的扩展风格。为了获得把手我必须在调用SetBarStyle()函数时包含CBRSGRIPPER标志参看表。这是CControlBar类的一个新风格而CToolBar类是从它继承而来的。请注意到我也加入了CBRSBORDERD标志这是为了修正一个未知的绘制问题该问题将会在工具条的边缘绘制一些多余的点。这也许意味着预览版确实有这个问题因为一旦我将D标志加入就立即解决了并且也似乎没有影响到别的什么。上面所作的两个简单的改变是使得一个已存程序获得酷界面的最省力的方法。在一个程序具有了扁平钮和把手的同时它也不会发生不应有的其它改变。(未完)标题栏上添加按钮自从Windows操作系统出现以后在应用程序中进行人机交互的思想和手段便发生了根本性的改变计算机的界面变得友好精彩。一个程序的好坏很大程度上决定于人机交互的方便程度。当前大多数程序的标题栏都千篇一律如何让自己的程序与众不同是每个程序员的梦想但改变标题栏的内容的确有相当的难度。该篇文章向你介绍如何在标题栏上添加图标按钮而且当鼠标经过和点击该图标时鼠标将有不同的反应。请按照下面的步骤实现。第一步:打开VC编程环境生成一个新的基于单文档的工程temp所有的选项都取默认值下面我们就在此工程的标题栏上生成三个按钮图标。第二步:下载资源文件共有三个文件:CaptionButtoncpp、CaptionButtonh和Thunkh。将这三个文件添加到工程中(添加方法不必细说了吧)。第三步:在Mainfrmh中定义变量CCaptionButtoncbExtra当然要包含头文件#include"CaptionButtonh"。第四步:为工程加载位图资源ID号分别为IDBBITMAP、IDBBITMAP、IDBBITMAP、IDBBITMAP、IDBBITMAP。这些位图将显示在标题栏上至于用什么样的位图就看你的喜好了。第五步:在Mainfrmcpp的OnCreate函数中添加如下的代码:初识化mhWnd是我们要处理的窗口句柄cbExtraInit(mhWnd)设置标题栏上的原来的按钮(最大化、最小化和关闭)保留的数目cbExtraSetNumOfDefaultCaptions()设置位图的透明颜色COLORREFcrTransparent=RGB(,,)cbExtraSetTransparentColor(crTransparent)鼠标选中一个位图后该位图的样子cbExtraSetSelectionBitmap((HBITMAP)LoadImage(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDBBITMAP),IMAGEBITMAP,,,LRLOADMAPDCOLORS|LRDEFAULTCOLOR))鼠标移动到一个位图后该位图的变化HBITMAPhMouseOverBitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDBBITMAP),IMAGEBITMAP,,,LRLOADMAPDCOLORS|LRDEFAULTCOLOR)设置位图HBITMAPhCaptionAMBitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDBBITMAP),IMAGEBITMAP,,,LRLOADMAPDCOLORS|LRDEFAULTCOLOR)HBITMAPhCaptionAMBitmapHilite=CCaptionButton::CombineBitmaps(hCaptionAMBitmap,hMouseOverBitmap,crTransparent)设置位图HBITMAPhCaptionBitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDBBITMAP),IMAGEBITMAP,,,LRLOADMAPDCOLORS|LRDEFAULTCOLOR)HBITMAPhCaptionBitmapHilite=CCaptionButton::CombineBitmaps(hCaptionBitmap,hMouseOverBitmap,crTransparent)设置位图三HBITMAPhCaptionBitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDBBITMAP),IMAGEBITMAP,,,LRLOADMAPDCOLORS|LRDEFAULTCOLOR)HBITMAPhCaptionBitmapHilite=CCaptionButton::CombineBitmaps(hCaptionBitmap,hMouseOverBitmap,crTransparent)利用上面的定义创建标题栏上的位图宝库位图的ID号鼠标经过时的file:变换位图鼠标选择时的变换位图和提示文字。cbExtraNew(,hCaptionAMBitmapHilite,hCaptionAMBitmap,"guan")cbExtraNew(,hCaptionBitmapHilite,hCaptionBitmap,"xi")cbExtraNew(,hCaptionBitmapHilite,hCaptionBitmap,"ming")第六步:现在我们可以先停下来看看我们的成果如何。编译我们的工程运行我们可以发现我们的标题栏上增加了三个按钮鼠标在上面移动或点击的时候位图会发生变化。只是我们还没有添加在位图上点击是的处理函数不要急接下来我们就添加相应的处理函数。第七步:当我们在标题栏上点击图标时将有一个消息WMCBLBUTTONCLICKED产生参数WPARAM是指点击图标的ID号。在mainfrmh中定义消息映射函数afxmsgLRESULTHit(WPARAMwParam,LPARAMlParam)在mainfrmcpp中定义函数实现:ONMESSAGE(WMCBLBUTTONCLICKED,Hit)LRESULTCMainFrame::Hit(WPARAMwParam,LPARAMlParam){switch(wParam){beginwParamcase:AfxMessageBox("第一个CAPtion")breakcase:AfxMessageBox("第二个Caption")breakcase:AfxMessageBox("第三个Caption")break}return}这样当我们单击图标时将弹出不同的提示对话框这只是一个例子至于实现什么样的功能随你的便了。第八步:标题栏的动态改变。在程序的执行过程中如果你要改变标题栏的样子你同样可以实现下面分别给出如何删除一个图标和更改一个图标的样子。voidCMainFrame::OnDelete(){cbExtraDelete()}voidCMainFrame::OnChange(){cbExtraReplace(,,hCaptionBitmapHilite,hCaptionBitmap,"pNewToolTipText")}好了功能实现了还算满意吧希望对你有用。通过例程分析状态条用法状态条是一个包含信息的控制条通常用于信息和状态提示这里信息是有关菜单命令或工具命令的提示字符串以及其它指示帮助信息而状态是用来指示SCROLLLOCK和NUMLOCK等一些键的状态。状态条通常框架窗口的底部。状态条的信息行能显示有关的程序状态或鼠标指向的工具按钮或菜单项的信息。状态条既不能接受用户输入也不产生命令信息。实际上从编程人员的角度出发(至少是那些使用AppWizard创建应用程序的编程人员)状态条是如此普通它们并不像工具条那样允许用户编辑的资源。在创建程序框架时用户只需告诉AppWizard为应用程序包含一个状态条可以说此时用户的工作就完成了。但是我们如果巧妙使用工具条我们会发现它可以帮我们实现很多功能。按以下做法我们实现在状态条上显示滚动字符串鼠标的坐标动态时钟。第一步:运行AppWizard生成一个工程mystatus接受所有的默认设置除了下面两步:在step中选SingleDocumentstep中去掉DockingBar前的对钩然后点击Advanced按钮选择WindowStyles中的Maximized选项。点击Finish按钮此时我们生成了一个工程。运行我们可以发现程序默认生成的状态条接下来我们要对这个状态条进行修改。第二步:在这一步我们将实现把状态条移到菜单的下边。在MainFrmcpp中我们可以看到状态条的定义部分  if(!mwndStatusBarCreate(this)||!mwndStatusBarSetIndicators(indicators,sizeof(indicators)sizeof(UINT))){TRACE("Failedtocreatestatusbarn")returnfailtocreate}我们所要做的是将上面的定义改为if(!mwndStatusBarCreate(thisWSCHILD|WSVISIBLE|CBRSTOP,AFXIDWSTATUSBAR)||!mwndStatusBarSetIndicators(indicators,sizeof(indicators)sizeof(UINT))){TRACE("Failedtocreatestatusbarn")returnfailtocreate}运行程序这时我们可以发现状态条已经移到了上边。第三步:在这一步我们实现在状态条实现滚动文字。<>在MainFrmcpp中我们可以发现如下的定义staticUINTindicators={IDSEPARATOR,IDINDICATORCAPS,IDINDICATORNUM,IDINDICATORSCRL,}我们将其改为staticUINTindicators={IDSEPARATOR,IDSTATUS,IDSTATUS,IDSTATUS,IDINDICATORCAPS,IDINDICATORNUM,IDINDICATORSCRL,}<>在菜单VIEW中选择ResourceSymbols,在对话框中选择NEW,在NAME中输入IDSTATUS,VALUE中取默认值同样方法定义IDSTATUSIDSTATUS。<>定义字符串资源在ResouceView中选择StringTable,在其中为IDSTATUS定义字符串资源为"me"同样方法定义IDSTATUSIDSTATUS。<>在MainFrmh中定义如下变量:public:CStringstr,str<>在MainFrmcpp中修改OnCreate函数如下:  intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct){if(CFrameWnd::OnCreate(lpCreateStruct)==)returnif(!mwndStatusBarCreate    (this,WSCHILD|WSVISIBLE|CBRSTOP,AFXIDWSTATUSBAR)||     !mwndStatusBarSetIndicators(indicators,sizeof(indicators)sizeof(UINT))){TRACE("Failedtocreatestatusbarn")returnfailtocreate}mwndStatusBarSetPaneInfo(,IDSTATUS,SBPSPOPOUT,)mwndStatusBarSetPaneInfo(,IDSTATUS,SBPSPOPOUT,)mwndStatusBarSetPaneInfo(,IDSTATUS,SBPSPOPOUT,)str=str="你好欢迎使用本程序祝你合家幸福事业有成!"SetTimer(,,)SetTimer(,,)return}<>在类CmainFrame中重载函数OnTimer(),并添加如下代码:  voidCMainFrame::OnTimer(UINTnIDEvent){file:TODO:Addyourmessagehandlercodehereandorcalldefaultif(nIDEvent==){if(strIsEmpty())str=strstr=strRight(strGetLength())mwndStatusBarSetPaneText(,str)}if(nIDEvent==){SYSTEMTIMEt::GetLocalTime(t)CStringstrstrFormat("d:d:d:d",twHour,twMinute,twSecond,twMilliseconds)mwndStatusBarSetPaneText(,str)}CFrameWnd::OnTimer(nIDEvent)}<>将MainFrmh中定义mwndStatusBar之前的protected:改为public:<>通过类向导在类CmystatusView中重载WMMOUSEMOVE,并在实现函数中添加如下代码:  voidCMystatusView::OnMouseMove(UINTnFlags,CPointpoint){TODO:AddyourmessagehandlercodehereandorcalldefaultCStringstrstrFormat("X:d,Y:d",pointx,pointy)((CMainFrame*)AfxGetMainWnd())>mwndStatusBarSetPaneText(,str)CView::OnMouseMove(nFlags,point)}好了到这里我们所有的功能就都实现了快编译运行一下吧!怎么样?还满意吗?让标题栏文字居中|添加以下模块:PublicSubCenterC(frmAsForm)DimSpcFAsIntegerHowmanyspacescanfitDimclenAsIntegercaptionlengthDimoldcAsStringoldcaptionDimiAsIntegernotimportantremoveanyspacesattheendsofthecaptionveryeasyifyoureaditcarefullyoldc=frmCaptionDoWhileLeft(oldc,)=Space()DoEventsoldc=Right(oldc,Len(oldc))LoopDoWhileRight(oldc,)=Space()DoEventsoldc=Left(oldc,Len(oldc))Loopclen=Len(oldc)IfInStr(oldc,"!")$#$#ThenIfInStr(oldc,"")$#$#Thenclen=clen*Elseclen=clen*EndIfElseIfInStr(oldc,"")$#$#Thenclen=clen*Elseclen=clen*EndIfEndIfseehowmanycharacterscanfitSpcF=frmWidthhowmanyspacecanfititthecaptionSpcF=SpcFclenHowmanyspacescanfitHowmuchspacethetiontakesupNowthetrickypartIfSpcF$#ThenDoEventsspeeduptheprogramfrmCaption=Space(Int(SpcF))oldcElseiftheformistoosmallforspacesfrmCaption=oldcEndIfEndSub|在窗体中添加以下代码:DimoldsizeAsLongPrivateSubFormResize()IfMeWidth=oldsizeThenifthewidthhasntchangedExitSubthendontmesswithitElseCenterCMeoldsize=MeWidthEndIfEndSubPrivateSubFormLoad()CenterCMeoldsize=MeWidthEndSub设计漂亮实用的菜单谈在VC中动态改变菜单大部分Windows应用程序都使用下拉式菜单实现自己特定的函数它使编程更加方便不需要在程序中增加多个按钮以完成这些操作。大多数情况下我们的程序编译生成后菜单就确定了不能再修改。然而在很多情况下程序要根据用户的自己设置产生不同的菜单以适应不同用户的要求这就需要我们动态的改变菜单。接下来我们就分析如何动态的生成不同的菜单。  第一步:  运行AppWizard生成一个工程mymenu接受所有的默认设置除了下面一

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/41

VC界面编程总结

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利