VC++环境下浮动工具条的编程

合集下载

VC实现工具栏

VC实现工具栏

VC实现工具栏(2010-08-02 20:34:33)转载原文标签:转载原文地址:VC实现工具栏作者:天涯霜雪首先,需要具备几个条件,一是工具栏具有CBRS_TOOLTIPS风格,二是工具栏的父窗口需要处理TTN_NEEDTEXT通知消息.在MFC类库中,CFrameWnd默认处理了TTN_NEEDTEXT 通知消息,因此在文档视图结构的应用程序中,只要工具栏拥有CBRS_TOOLTIPS风格,就能显示提示信息.如果在对话框中添加TTN_NEEDTEXT通知消息,需要消息映射部分添加如下代码:ON_NOTIFY_EX(TTN_NEEDTEXT,0,OnToolTipNotify)函数原型:OnToolTipNotify(UINT id,NMHDR *pNMHDR,LRESULT *pResult)参数说明:id:是发送消息的控件ID,但此处没有用,因为控件ID可以来自于pNMHDR.pNMHDR:是一个NMHDR结构指针(实际应该是NMTTDISPINFO结构指针),NMHDR结构记录了发送消息的控件ID,句柄等信息.pResult:表示结果代码指针,TTN_NEEDTEXT消息可以忽略该参数.实现过程:定义一个CToolBar变量m_wndToolBar,创建一个工具栏资源.在OnInitDialog方法中创建工具栏://创建工具栏if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS |CBRS_SIZE_DYNAMIC|CBRS_BORDER_TOP ) || !m_wndToolBar.LoadToolBar(IDR_TOOLBAR1)){TRACE0("Failed to create toolbarn");return -1; // fail to create}//设置图象和按钮的大小,为了适当的演示按钮文本m_wndToolBar.GetToolBarCtrl().SetBitmapSize(CSize(16,16));m_wndToolBar.GetToolBarCtrl().SetButtonSize(CSize(32,32));//设置按钮文本m_wndToolBar.SetButtonText(0,"新建");m_wndToolBar.SetButtonText(1,"打开");m_wndToolBar.SetButtonText(2,"保存");m_wndToolBar.SetButtonText(4,"剪切");m_wndToolBar.SetButtonText(5,"复制");m_wndToolBar.SetButtonText(6,"粘贴");m_wndToolBar.SetButtonText(8,"打印");m_wndToolBar.SetButtonText(10,"帮助");RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0); // TODO: Add extra initialization herereturn TRUE; // return TRUE unless you set the focus to a control在消息影射部分添加消息映射:ON_NOTIFY_EX( TTN_NEEDTEXT, 0, OnToolTipNotify)接收函数部分:afx_msg BOOL OnToolTipNotify( UINT id, NMHDR * pNMHDR, LRESULT * pResult );函数实现:一种BOOL CMainFrame::OnToolTipNotify(UINT id, NMHDR *pNMHDR, LRESULT *pResult) {TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR;UINT nID =pNMHDR->idFrom; //获取工具栏按钮IDint index = m_wndToolBar.GetToolBarCtrl().CommandToIndex(nID);//根据ID获取按钮索引 CString str;switch(index){case 0:pTTT->lpszText = "检测窗口";break;case 1:pTTT->lpszText = "分析窗口";break;case 2:pTTT->lpszText = "网络连接";break;case 3:pTTT->lpszText = "显示图像";break;case 4:pTTT->lpszText = "开始录像";break;case 5:pTTT->lpszText = "存入数据库";break;case 6:pTTT->lpszText = "读取数据库文件";break;case 7:pTTT->lpszText = "阀位分析查询";break;case 8:pTTT->lpszText = "报表打印";break;default:pTTT->lpszText = "什么东西?";break;}pTTT->hinst = AfxGetResourceHandle();return(TRUE);}另一种:BOOL CToolHintDlg::OnToolTipNotify(UINT id, NMHDR *pNMHDR, LRESULT *pResult) {TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR;UINT nID =pNMHDR->idFrom; //获取工具栏按钮IDint index = m_wndToolBar.GetToolBarCtrl().CommandToIndex(nID);//根据ID获取按钮索引 m_wndToolBar.GetButtonText(index,m_ToolText);//获取按钮文本pTTT->lpszText =m_ToolText.GetBuffer(0);//设置显示的提示信息pTTT->hinst = AfxGetResourceHandle();return(TRUE);}。

浅谈VC_中滚动条的编程

浅谈VC_中滚动条的编程

AA2!4",MAN KMA; / / 定义视图变量
(,7!’) ; / / 实例化 KMA("48 AA2!4",MA (KMA ) ; / / 调用该函数获得绘图 E"&.4K-.4MA 映象模式 (R41,) ; / / 得到屏幕剪辑 区 KMAOPQ4,A2!K3$B 域 图S
水平滑块大 小反映水平 图形大小
("G"J FG" , "@%)=<K=E :&)A "??()*+IID=@%*F6%*G"
种是自定义滚动条,即在程序中自己定义滚动条 的大小与放置位置, 然后设置它的滚动参数; 另一 种是利用系统滚动条来设置滚动参数。这两种方 法在不同的绘图方式(指直接屏幕绘图与二次内 存缓冲绘图) 下有各自的使用优点。 第一种用在直 接屏幕绘图时很方便,通过参数定义能够方便地 控制滚动参数, 形象地设置屏幕滚动范围 (指屏幕 有一部分可不参与视图滚动,如图形的纵坐标和 横坐标所在的屏幕区域) , 还可经专门的滚动参数 定义设置滚动滑块的大小来反映整个视图大小的 变化等, 而且该滚动条在非像素 (即非 //01231 图形映象模式)绘图时能用逻辑坐标方便的设置 滚动参数;第二种方法用在内存绘图时能够简单 的实现浏览整个视图的功能,不需自定义滚动条 放置的位置与大小, 只需设置滚动参数即可。 因内 存绘图无闪屏现象出现,通过设置计时器还可以 流畅的滚动播放视图,编程中发现该滚动条只接 受设备坐标参数。下面分别讨论这两种滚动条的 编程方法。
系统滚动条编程
上面自定义滚动条在屏幕直接绘图时使用很
的终止位置 (R41,) ; / / 将区域变量转为设 KMAOP;&,$M& 备坐标 (R41,%24#,, R41,%X$,\ )*7+1.$223-.%Z$04[!"@$8 () , ; / / 放置水平条 ]] ) ,$), R41,%[!@,7

工具条的编程技术

工具条的编程技术

工具条的编程技术本节将讨论一些与工具条有关的编程技术,主要包括命令处理、命令更新、按钮风格和工具条的隐藏/显示等技术。

【实例5-4】工具条的编程技术光盘路径/05/record/实例目的工具条的编程技术本实例通过创建一个录音的窗口,在窗口上添加录音的基本工具按钮来学习工具条的编程技术。

1.创建工程启动Microsoft Visual Studio 6.0,在IDE中依次选择“File New”菜单命令,或直接按快捷键“Ctrl+N”,打开“New”对话框。

在“New”对话框中单击“Projects”选项卡,在列表框中选择“MFC AppWizard(.exe)”项,在“Project name”文本框中输入“record”,其他使用默认值,单击“OK”按钮,弹出“MFC AppWizard-Step1”对话框。

在“MFC AppWizard-Step1”对话框中,选中“Multiple Document”单选按钮,其他使用默认值,然后单击“Finish”按钮,在弹出的“New Project Information”对话框中单击“OK”按钮,就可以完成工程的创建。

2.添加资源在工作区中选择的Resource View标签,转到资源编辑窗口,双击“Toolbar IDR_MAINFRAME”条目打开该菜单资源的编辑界面。

双击对后面的空白虚线框,为其添加一个工具按钮,其ID为:ID_RECORD_ START。

用2 的方法添加另一个工具按钮,其ID为:ID_RECORD_STOP。

完成添加后的界面,如图5-50所示。

图5-50 添加工具3.添加响应函数要使菜单和工具条执行命令,光为它们指定命令ID是不行的,必须为每个命令ID定义命令处理函数。

如果不为命令定义命令处理函数或下面将要提到的命令更新处理函数,则框架将自动使该命令对应的菜单项和按钮禁止(灰化)。

在IDE主菜单项中依次选择“View”→“ClassWizard”,打开“MFC ClassWizard”对话框,选择“Member Maps”选项卡。

VC++环境下浮动工具条的编程

VC++环境下浮动工具条的编程

VC++环境下浮动工具条的编程上海市福山路张景01-9-12 下午03:44:44许多程序员都希望自己的程序能更象商业化程序,特别是希望自己的程序工具条能够象WINDOWS95下的OFFICES一样具有浮动效果。

针对VISUALC++编程环境,以下分别介绍了两种产生浮动工具条的方法。

各有其优点和不足,可供程序员选择。

第一种方法该方法最为简单,利用VC中的工具条的系统未公布的隐含参数TBSTYLE_FLAT,不需更改原由程序只要在程序中添加4条语句即可实现浮动效果。

不过该方法只能产生简单的浮动工具条,而且没有象OFFICES中工具条右侧的拖动条gripper。

而且该方法在VC50下存在严重的缺陷,当拖动工具条时,系统不能对工具条进行刷新,因此会产生移动工具条到新位置时,原处仍有工具条。

主要是负责工具条的动态连接库COMCTL32.DLL的BUG。

该问题在VC60中由于更新了该动态连接库而得以解决。

程序员如果使用的是VC5版可以用新的版本COMCTL32.DLL (4.72版以上)替换该动态连接库来解决。

具体方法如下:int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){...m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |CBRS_TOOLTIPS | CBRS_FLYBY |CBRS_SIZE_DYNAMIC|TBSTYLE_FLAT);//添加以下4句语句,产生浮动效果LONG lStyle;lStyle=GetWindowLong(m_wndToolBar,GWL_STYLE);lStyle=lStyle|TBSTYLE_FLAT;SetWindowLong(m_wndToolBar,GWL_STYLE,lStyle);m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);...}第二种方法该方法是对MFC原来的CTOOLBAR类进行继承,主要是重载成员函数OnWindowPosChanging(LPWINDOWPOS lpWndPos);OnPaint();OnNcPaint();OnNcCalcSize(); 实现浮动工具条。

VC++中添加工具栏和状态栏

VC++中添加工具栏和状态栏

VC++中添加工具栏和状态栏VC++中添加工具栏方法1、使用VC生成的工具栏通过VC资源窗口insert一个工具栏资源IDR_TOOLBAR1,并进行编辑为对话框类添加一个工具栏变量CToolBarm_T oolBar;在OnInitDialog()函数中添加如下代码,添加显示工具栏if(!m_T oolbar.CreateEx( this,TBSTYLE_FLAT , WS_CHILD | WS_VISIBLE |CBRS_ALIGN_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS, CRect(4,4,0,0))||!m_Toolbar.LoadToolBar(IDR_TOOLBAR1) ){TRACE0("failedto create toolbar\n");returnFALSE;}m_T oolbar.ShowWindow(SW_SHOW);RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CO NTROLBAR_LAST, 0);2、通过图像列表自定义工具栏通过VC资源窗口insert所需的ico文件,并分别命名为对话框类添加工具栏变量和图像列表变量CToolBarm_T oolBar;CImageListm_ImageList;在OnInitDialog()函数中添加如下代码,将图像列表与工具栏关联并进行显示//创建图像列表m_ImageList.Create(32,32,ILC_COLOR24|ILC_MASK,1,1);//向图像列表中添加图标m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICONUSER));m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICONSET));m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICONQUERY));m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICONRECOR D));m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICONIMPORT ));m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICONEXPORT ));UINTarray[8];for(inti=0;i<8;i++) //初始化工具栏ID{if(i==2|| i==5)array[i]= ID_SEPARATOR; //第3、6个按钮为分隔条elsearray[i]= i+1001;}m_T oolBar.Create(this);m_T oolBar.SetButtons(array,8);//关联图像列表m_T oolBar.GetT oolBarCtrl().SetImageList(&m_ImageList);m_T oolBar.SetSizes(CSize(50,60),CSize(32,32));//设置按钮和图标的大小/*The sizeImage parameter must contain thesize, in pixels, of the images in the toolbar's bitmap.The dimensions in sizeButton must besufficient to hold the image plus 7 pixels extra in width and 6 pixels extra inheight.This function also sets the toolbar heightto fit the buttons.*/ //设置工具栏按钮的显示文本m_T oolBar.SetButtonText(0," 用户 ");m_T oolBar.SetButtonText(1," 设置 ");m_T oolBar.SetButtonText(3," 查询 ");m_T oolBar.SetButtonText(4," 记录 ");m_T oolBar.SetButtonText(6," 导入 ");m_T oolBar.SetButtonText(7," 导出 ");RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CO NTROLBAR_LAST,0);3、导入图片生成工具栏,并将工具栏与菜单栏对应项绑定通过VC资源窗口insert所需的ico文件,并分别命名,然后insert一个菜单资源IDR_MAINFRAME_MENU,并进行编辑为对话框类添加菜单栏变量、工具栏变量和图像列表变量CMenum_Menu;CToolBarm_T oolBar;CImageListm_ImageList;在OnInitDialog()函数中添加如下代码,将图像列表与工具栏关联,并将工具栏和对应菜单项ID进行关联,从而与菜单项共用处理函数m_Menu.LoadMenu(IDR_MAINFRAME_MENU);SetMenu(&m_Menu);TBBUTTONtbButton[ICONSUM] = {0};m_ImageList.Create(32,32, ILC_COLOR32 | ILC_MASK, 0, 0);m_ImageList.Add(::AfxGetApp()->LoadIcon(IDI_ICON3));m_ImageList.Add(::AfxGetApp()->LoadIcon(IDI_ICON1));m_ImageList.Add(::AfxGetApp()->LoadIcon(IDI_ICON4));m_ImageList.Add(::AfxGetApp()->LoadIcon(IDI_ICON5));m_ImageList.Add(::AfxGetApp()->LoadIcon(IDI_ICON2));m_T oolBar.Create(WS_CHILD| WS_VISIBLE, CRect(0, 0, 0, 0), this, 0);m_T oolBar.SetImageList(&m_ImageList);for(inti=0; i< ICONSUM; i++){tbButton[i].dwData = NULL;tbButton[i].fsState = TBSTATE_ENABLED;tbButton[i].fsStyle = (BYTE)TBSTYLE_FLAT;tbButton[i].iBitmap = i;}tbButton[0].idCommand= ID_ATTENDANCE_RECORD;tbButton[1].idCommand= IDM_REQUEST_EMPLOYEE;tbButton[2].idCommand= IDM_PAYLIP;tbButton[3].idCommand= IDM_PORTFOLIO;tbButton[4].idCommand= ID_ABOUT;m_T oolBar.AddButtons(ICONSUM,tbButton);m_T oolBar.AutoSize();m_T oolBar.SetStyle(TBSTYLE_FLAT| CCS_TOP);注:若要把工具栏的按钮和菜单项相关联,也可将它们的ID设置为同一个ID来实现VC++中添加状态栏方法转自:/show_it/item/2a12a5dd72ef2517e1f46f20方法一:1.添加成员变量CStatusBarCtrl m_StatusBar;2.在OnInitDialog()中加入:m_StatusBar.Create(WS_CHILD|WS_VISIBLE|SBT_OWNERDRA W,CRect(0,0,0,0), this, 0);intstrPartDim[3]= {100, 200, -1}; //分割数量m_StatusBar.SetParts(3,strPartDim);//设置状态栏文本m_StatusBar.SetText("分栏一", 0, 0);m_StatusBar.SetText("分栏二", 1, 0);m_StatusBar.SetText("分栏三", 2, 0);//下面是在状态栏中加入图标m_StatusBar.SetIcon(1,SetIcon(AfxGetApp()->LoadIcon(IDR_ MAINFRAME),FALSE));//为第二个分栏中加的图标方法二:1.添加成员变量CStatusBar m_wndStatusBar;2.在OnInitDialog()中加入:static UINT indicators[] ={D_SEPARATOR, //status line indicatorID_INDICATOR_CAPS, //CAP lock indicator.ID_INDICATOR_NUM, //NUM lock indicator.ID_INDICATOR_SCRL, //SCRL lock indicator.};if(!m_wndStatusBar.Create(this)||!m_wndStatusBar.SetIndicat ors(indicators,sizeof(indicators)/sizeof(UINT))){TRACE0("Failed to create statusbarn");return -1; // fail to create}UINT nID; //控制状态栏里面的分栏m_wndStatusBar.SetPaneInfo(0,nID,SBPS_STRETCH|SBPS_NO BORDERS,100); //返回值存nID中m_wndStatusBar.SetPaneText(0,"就绪");m_wndStatusBar.SetPaneInfo(1,nID,SBPS_NORMAL,100);m_wndStatusBar.SetPaneText(1,"大写");m_wndStatusBar.SetPaneInfo(2,nID,SBPS_POPOUT,100);m_wndStatusBar.SetPaneText(2,"数字");// SetPaneInfo()函数的第三个参数的可选项如下:// The following indicator styles are supported:// SBPS_NOBORDERS No 3-D border around the pane.// SBPS_POPOUT Reverse border so that text "pops out."// SBPS_DISABLED Do not draw text.// SBPS_STRETCH Stretch pane to fill unused space. Only one pane per status bar can have thisstyle.// SBPS_NORMAL No stretch, borders, or pop-out.//----------------让这个状态栏最终显示在对话框中------------- RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CO NTROLBAR_LAST,0);。

VC++玩转炫酷悬浮窗1---悬浮窗的实现

VC++玩转炫酷悬浮窗1---悬浮窗的实现

目标实现像迅雷那样炫酷的悬浮窗。

计划&方案首先第一步要实现一个悬浮窗,窗体无边框,能够随意拖动。

对于一个窗体来说,只有我们把鼠标放到标题栏中才进入到拖拽模式。

由于是无边框的窗体,默认是不能够移动的。

我们尝试用两种办法使其跟随鼠标移动。

一个是用OnNcHitTest函数,另一个是在OnLButtonDown时发消息。

实践一、 OnNcHitTest方案这个CWnd类的一个方法,我们可以捕捉鼠标点击的坐标,然后将其HTCLIENT结果偷换成HTCAPTION,这样就可以让系统误以为鼠标左键点击的是标题栏,就进入了拖拽模式了。

官网参考点这里。

代码十分简单,只需要重载OnNcHitTest就可以。

代码填加三处:1. 头文件afx_msg LRESULT OnNcHitTest(CPoint pt);2. 注册消息BEGIN_MESSAGE_MAP(CAfloatWindowDlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_WM_NCHITTEST()END_MESSAGE_MAP()3. 函数编写LRESULT CAfloatWindowDlg::OnNcHitTest(CPoint pt){LRESULT nHitTest = CDialog::OnNcHitTest(pt);if(nHitTest == HTCLIENT){nHitTest = HTCAPTION;}return nHitTest;}二、 OnLButtonDown方案在程序获得左键按下的状态时,发送以下任一系统消息都可以实现悬浮窗的拖拽。

1.SendMessage(WM_SYSCOMMAND, SC_MOVE | HTCAPTION, 0);2.PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x,point.y));三、无边框窗体Dialog属性中,将Border的属性设为None。

VC 对话框自带滚动条的使用

VC 对话框自带滚动条的使用

VC对话框自带滚动条的使用一,使用对话框窗口自带的滚动条,在属性页面中设置即可,如下二,OnInitDialog()函数中,添加如下滚动条初始化语句SCROLLINFO vinfo;vinfo.cbSize =sizeof(vinfo);vinfo.fMask =SIF_ALL;vinfo.nPage =50;//滚动块自身的长短,通常有如下关系:其长度/滚动条长度(含两个箭头)=nPage/(nMax+2),//另外nPage取值-1时,滚动条会不见了。

vinfo.nMax =600;//滚动条所能滚动的最大值vinfo.nMin=0;//滚动条所能滚动的最小值vinfo.nTrackPos =0;SetScrollInfo(SB_VERT,&vinfo);//即使上述步骤一不做,使用此条语句也可以显示滚动条三,添加相应的WM_VSCROLL函数void CMy1d0Dlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) {// TODO: Add your message handler code here and/or call defaultSCROLLINFO scrollinfo;GetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);switch (nSBCode){case SB_BOTTOM: //滑块滚动到最底部ScrollWindow(0,(scrollinfo.nPos-scrollinfo.nMax)*10); //滚动屏幕scrollinfo.nPos = scrollinfo.nMax; //设定滑块新位置SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); //更新滑块位置break;case SB_TOP: //滑块滚动到最顶部ScrollWindow(0,(scrollinfo.nPos-scrollinfo.nMin)*10);scrollinfo.nPos = scrollinfo.nMin;SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);break;case SB_LINEUP: //单击上箭头scrollinfo.nPos -= 1;if (scrollinfo.nPos<scrollinfo.nMin){scrollinfo.nPos = scrollinfo.nMin;break;}SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);ScrollWindow(0,10);break;case SB_LINEDOWN: //单击下箭头scrollinfo.nPos += 1;if (scrollinfo.nPos>scrollinfo.nMax){scrollinfo.nPos = scrollinfo.nMax;break;}SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);ScrollWindow(0,-10);break;case SB_PAGEUP: //单击滑块上方空白区域scrollinfo.nPos -= 5;if (scrollinfo.nPos<scrollinfo.nMin){scrollinfo.nPos = scrollinfo.nMin;break;}SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);ScrollWindow(0,10*5);break;case SB_PAGEDOWN: //单击滑块下方空白区域scrollinfo.nPos += 5;if (scrollinfo.nPos>scrollinfo.nMax){scrollinfo.nPos = scrollinfo.nMax;break;}SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);ScrollWindow(0,-10*5);break;case SB_ENDSCROLL: //鼠标离开滑块,结束滑块拖动// MessageBox("SB_ENDSCROLL");break;case SB_THUMBPOSITION:// ScrollWindow(0,(scrollinfo.nPos-nPos)*10);// scrollinfo.nPos = nPos;// SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);break;case SB_THUMBTRACK: //拖动滑块ScrollWindow(0,(scrollinfo.nPos-nPos)*10);scrollinfo.nPos = nPos;SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);break;}CDialog::OnVScroll(nSBCode, nPos, pScrollBar);}。

VC对话框程序添加目录菜单、工具条和状态栏

VC对话框程序添加目录菜单、工具条和状态栏

VC对话框程序添加目录菜单、工具条和状态栏为<对话框>添加工具条和状态栏前,先说说添加目录菜单栏;1,在Insert下拉菜单中选择Resorce,新建一个MENU,2,在CDialog::OnInitDialog();后面添加代码:CMenu menu;menu.LoadMenu(IDR_MENU1); // 红色部分为你新建MENU的ID索引SetMenu(&menu);为对话框程序添加工具条和状态栏摘要:本文介绍了在对话框程序基础上通过程序控制来动态添加工具条和状态条的实现过程和方法。

一、引言对于不需要文档/视图结构支持的程序一般都采用对话框做为程序的基础框架。

虽然在对话框程序上可以通过修改其属性来添加系统菜单,但对比SDI和MDI程序的工具条和状态栏未免使界面显得简单、单调。

虽然在Visual Basic 中提供有独立的工具条和状态栏标准控件可以直接在对话框上使用,但Visual C++ 6.0所提供的26种基本Windows标准控件却没有将它们包含其中。

因此要在对话框程序中实现工具条和状态栏只能通过编程来动态实现。

二、工具条的实现过程MFC对于工具条和状态栏分别提供了CToolBar和CStatusBar两个基本类库,但由于在实现时MFC 对其做了过多的封装,以至无法了解内部的一些核心技术。

因此本文在实现过程中放弃了相对比较方便的CToolBar和CStatusBar类的使用,而是通过SDK(Software Developers Kit,软件开发工具箱)式的WinAPI 应用程序接口来实现的。

在API函数中经常需要用到对话框的窗口句柄和当前的实例句柄,在SDK程序设计中以上两个句柄可以直接从入口函数WinMain()中引出,而在MFC下也对其做了封装,不能直接获取。

但MFC也为其留有接口:CWnd窗口类提供的GetSafeHwnd()可以返回对话框的窗口句柄;函数AfxGetInstanceHandle()则可以获取当前应用程序的实例句柄。

VC++ 5.0式样的工具条

VC++ 5.0式样的工具条

VC技巧五 - 工具条和状态条VC++ 5.0式样的工具条类似VC++ 5.0的工具条具有平面外观,左边带有一个“把手”,你可以通过鼠标拖动这个“把手”来移动工具条。

工具条各组间带有分隔线(如图所示)。

当鼠标在工具条上面移动时,工具条上的相应按钮会突出显示。

本文所讨论的增强型工具条CEnhanceToolBar类由CToolBar类所派生,是CToolBar类的补充和扩展。

如果你并不在乎工具条有没有“把手”的话,要生成平面工具条是十分简单的。

你只需要在CMainFrame的OnCreate()函数中添加一句话就可以(必须加在工具条生成函数之后,因为MFC在生成工具条时要清除其式样)://MainFrm.cppintCMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){......if (!m_wndToolBar.Create(this) ||!m_wndToolBar.LoadToolBar(IDR_MAINFRAME)){TRACE0("Failed to create toolbar\n");return -1; // fail to create}m_wndToolBar.ModifyStyle(0,TBSTYLE_FLAT);//设置工具条为平面格式......}如果你的计算机安装了版本为4.71.1712.3的COMCTL32.DLL(该动态库随IE 4一同发行),那就更好了,你的工具条会自动绘制分隔线的。

你可以通过鼠标拖动工具条的非按钮区域来移动这种工具条。

如果你要得到更好看(更“专业”)的工具条,那么你还得跟着我一步步的做下去:添加一个新类,本文中叫做CEnhanceToolBar类,由CToolBar类派生。

为CEnhanceToolBar类添加成员变量和函数的声明,并且根据你的需要设置其属性为public/protected/private。

vc_5菜单和工具条

vc_5菜单和工具条

if(!m_wndToolBar.CreateEx(this,TBSTYLE_FLAT, WS_CHILD|WS_VISIBLE|CBRS_ALIGN_TOP|C BRS_GRIPPER|CBRS_FLYBY|CBRS_SIZE_DY NAMIC) ||!m_wndToolBar.LoadToolBar(IDR_TOOLBAR1)) {TRACE0("Failed to create toolbar\n"); return -1; } RepositionBars(AFX_IDW_CONTROLBAR_FIR ST,AFX_IDW_CONTROLBAR_LAST,0);


工具条执行的功能往往已由相应的菜单实现 了。因此,一般情况下,没有必要为工具栏 设置消息响应函数,而只需为工具条上的按 钮指定正确的ID(按钮要响应函数的菜单调用 者的ID)来保证响应函数的正确调用。
1.创建工具条。 Resource View->右击顶层文件夹->Insert>Toolbar->new 2. 编辑工具栏按钮
void CMenuDlg::OnContextMenu(CWnd* pWnd, CPoint point) { // TODO: Add your message handler code here CMenu menu; menu.LoadMenu(IDR_QUICKMENU); CMenu *pquickmenu= menu.GetSubMenu(0); pquickmenu->TrackPopupMenu (TPM_LEFTALIGN|TPM_RIGHTBUTTON,poi nt.x,point.y,pWnd); }
1.在工程中插入新的菜单
在Workspace的“Resource View”中右击顶层文件夹, 在激活的快捷菜单中选择 “Insert”选项,在弹出对 话框中选“Menu”,单击New 按钮。

在VC中透明浮动按键的实现

在VC中透明浮动按键的实现

在VC中透明浮动按键的实现有一种按键,看起来是一幅完整的图片,当鼠标移到按键区域时,图片的一部分凸现,形成一个按键,当鼠标移走时又恢复原来状态。

源码爱好者最近,看了一些关于浮动按键的代码,其原理大致上跟CBitmapButton差不多,用数幅位图代表按键的各个状态,响应鼠标的各种消息来设置按键的状态,实现按键的浮动显示,但是这样的按键却不能和周围的背景混和成一幅图片。

为了实现“透明”按键,可以简单地做个试验:先在对话框中加入一个BUTTON,通过属性框选“Owner Draw”风格,再加入一个PICTURE,并加入图片,将BUTTON移到PICTURE上。

运行结果发现,按键没有显示出来,但在按键区域按下鼠标时,该按键仍然能发出WM_COMMAND消息,这样一个纯透明的按键建立了。

显然,这个按键是毫无使用意义的,因为用户不知道按键的位置,必须让用户容易觉察到按键的位置,可以把这个按键改造一下:(首先从CButton派生出一个新类CDrawButton)·把按键的标题显示出来这个实现起来比较简单,我们可以重载CButton类的成员函数DrawItem(),void CDrawButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct){CDC dc;CRect rect=lpDrawItemStruct->rcItem;//得到按键区域CString sCaption;dc.Attach(lpDrawItemStruct- >hDC); //得到设备环境CDCVERIFY(lpDrawItemStruct- >CtlType==ODT_BUTTON);GetWindowText(sCaption);//得到按键的标题dc.SetBkMode(TRANSPARENT);//透明显示CFont* m_pOldFont=dc.SelectObject(m_pFont);dc.DrawText(sCaption,&rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);dc.SelectObject(m_pOldFont);}其中的m_pFont是成员变量,它保存了对话框的字体指针,为了按键的标题风格与对话框的字体风格一致,在初始化时调用对话框的成员函数GetFont()即可得到指向对话框字体的CFont类指针。

将已有的VC++设计好的对话框类(不是对话框工程)加入BCGP工程的浮动停靠工具栏的方法

将已有的VC++设计好的对话框类(不是对话框工程)加入BCGP工程的浮动停靠工具栏的方法

在BCGP工程中添加一个对话框,并已创建对应的对话框类和成员变量、成员函数。

此步完成后,还要修改资源中的对话框的如下属性:Style为Child;Border为None;勾选Clip siblings和Clip children。

再进入如下步骤,可将它加入BCGP工程的浮动停靠工具栏,并且容易控制和使用。

1、打开CXXDlg.h头文件,定位到对话框类定义部分:class CMyDlg : public CDialog将CDialog修改为CBCGPDialogBar。

如果有OnInitDialog()函数,需要修改其定义为afx_msg LRESULT HandleInitDialog(WPARAM, LPARAM);如果有DestroyWindow()等对话框销毁函数,需要整合修改为析构函数,如:// Implementationpublic:virtual ~CMyDlg();2、打开CXXDlg.cpp头文件,定位到构造函数的开头,如:CMyDlg:: CMyDlg (CWnd* pParent /*=NULL*/): CDialog(CYttypeDlg::IDD, pParent)需要修改为:CMyDlg:: CMyDlg (CWnd* pParent /*=NULL*/): CBCGPDialogBar()并在其中加入:EnableVisualManagerStyle();EnableLayout();然后把该文件中所有的CDialog全部查找替换CBCGPDialogBar。

3、如果原来有OnInitDialog()函数,需要修改消息的映射部分。

在BEGIN_MESSAGE_MAP(CMyDlg, CBCGPDialogBar)与END_MESSAGE_MAP()之间,增加HandleInitDialog ()消息的映射为:ON_MESSAGE(WM_INITDIALOG, HandleInitDialog)然后修改OnInitDialog()函数为:LRESULT CMyDlgBar::HandleInitDialog(WPARAM wParam, LPARAM lParam)在函数开头处将CBCGPDialogBar::OnInitDialog();修改为:CBCGPDialogBar::HandleInitDialog(wParam, lParam);4、如果原来有DestroyWindow()等对话框销毁函数,需要先整合到一个函数,如DestroyWindow()中,然后修改该函数为:CMyDlg::~ CMyDlg ()然后删除函数中的CBCGPDialogBar::OnDestroy(); 一行。

vc 用VC制作工具条

vc 用VC制作工具条

用VC制作工具条我用VC开发软件已有两年时间,自认为对Windows用户界面技术也积累了不少经验,下文就想从另一个角度谈谈工具条的制作。

其实,在VC的开发环境中,对工具条的支持并不是很方便,相比之下就不如其它的一些编程语言,如C++Build等。

VC的应用程序向导(AppWizard)中基于单文档和多文档的程序为用户创建了一个工具条,并提供了对工具条的可视化编辑,但它提供的工具条仅仅是按纽(Button)的简单集合,不支持工具条中经常用到的编辑(Edit)控件、组合框(ComboBox)控件等,而在我们常见的软件中,如Word等等,带组合框(通常为下拉框,组合框的一种,不能编辑,只能选择其中一条)等其它控件的工具条也大量用到,它大大方便了用户的操作。

本文提出了一个比较简便的方法,利用VC的资源编辑器,可视化的确定控件在工具条中的位置,然后把控件作为工具条的子窗口创建,并实现控件的消息响应函数。

下文就以组合框为例,详细介绍在工具条中加入组合框的步骤。

用应用程序向导(AppWizard)生成一个基于单文档的工程(Project),首先打开VC的工具条资源编辑器,在要加入组合框的地方加一个空按纽,分配一个ID号,在本文的实例中为IDC_COMBOX。

其次,从面向对象的思想出发,一个工具条作为一个整体,应该封装为一个类,组合框控件应该作为这个类的一个成员变量。

因此生成一个以CToolBar为基类的的新类CComboToolBar,这可以用VC的类向导(ClassWizard)来实现,先生成一个以CToolBarCtrl为基类的新类CComboToolBar,然后在文件编辑器中打开ComboToolBar.h和ComboToolBar.cpp文件,把CComboToolBar基类改为CToolBar。

之所以有这番周折,是因为类向导不支持以CToolBar为基类生成新类。

新类生成后,加入成员变量CComboBox m_combobox。

VC++的菜单与工具栏使用方法解析

VC++的菜单与工具栏使用方法解析

m_rectangle = TRUE; m_ellipse =FALSE; dc.SelectObject(pOldBrush); dc.SelectObject(oldpen); delete pNewBrush;
}
对应的更新命令UI控制函数OnUpdateGraphEllipse , 根据变量m_ellipse的值来控制菜单的有效性状态, 决定菜单项“ellipse”什么时候有效
CWnd*pWnd, LPCRECT lpRct=NULL); 其中参数nFlags为弹出式菜单的标志,例如若其值为 TPM_RIGHTALIGN,表示创建的弹出式浮动菜单,其右边 界位于X处;若其值为TPM_LEFTALIGN,表示其左边界位 于X处,参数X与Y表示屏幕坐标。
(1)浮动菜单的创建
对应的更新命令UI控制函数 OnUpdateGraphRec根据变量m_rectangle的值 来控制菜单的有效性状态,决定菜单项 “rectangle ”什么时候有效。
void CMenuitemView::OnUpdateGraphRec(CCmdUI*pCmdUI)
{ pCmdUI->Enable(m_rectangle);
CBrush* pNewBrush, * pOldBrush; pNewBrush=new CBrush; pNewBrush->CreateSolidBrush(m_crbk); pOldBrush=dc.SelectObject(pNewBrush); dc.Ellipse(230,70,310,150);
如果菜单项有更新处理函数,那么它被调用进行 更新;如果没有,那么框架检查命令处理函数是否 存在,若不存在,则使菜单变灰。
必须提供一个菜单处理函数或更新函数。

滑动条控件(CScrollBar)的简单详细的方法

滑动条控件(CScrollBar)的简单详细的方法

1 VC++6.0下新建一个基本对话框的工程,往对话框中添加一个水平滑动条控件和一个编辑框控件,如下图所示:为水平滑动条关联一个CScrollBar类型的变量m_scroll,为编辑框关联一个int类型的变量m_show.2在初始化函数OnInitDialog()中对水平滑动条的位置和编辑框进行初始化: m_scroll.SetScrollRange(0,100);//水平滑动条范围设置为0到100m_scroll.SetScrollPos(10); //水平滑动条初始位置设置为10m_show=10;//编辑框中初始显示为10UpdateData(FALSE);编译运行后,如下图所示:3添加消息WM_HSCROLL的响应函数,添加如下代码:OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar){int position=m_scroll.GetScrollPos();//获取水平滑动条的位置switch(nSBCode)//水平滑动条的不同消息响应{case SB_LINELEFT://向左滚动一行position--;break;case SB_LINERIGHT://向右滚动一行position++;break;case SB_PAGELEFT: //向左滚动一页position-=10;break;case SB_PAGERIGHT: //向右滚动一页position+=10;break;case SB_THUMBTRACK://拖动滑动块position=nPos;//这里的nPos就是函数OnHScroll()的第2个参数break;case SB_LEFT://移动到最左边position=0;break;case SB_RIGHT://移动到最右边position=100;break;}if(position>100) position=100;if(position<0) position=0;m_scroll.SetScrollPos(position);//根据position的值来设定滑动块的位置m_show=position;//在编辑框中显示position的值UpdateData(FALSE);} 编译运行即可在编辑框中显示滑动块所在的位置了.运行后如下图:。

VC++浮动工具栏CSizingControlBar使用说明

VC++浮动工具栏CSizingControlBar使用说明

1. Include the following files in your project:2. Add these lines to your (if the files are in a different directory, include the path - see the file in the samples):#include ""#include ""3. Derive a class from CSizingControlBarG (you have an example in mybar.* files). 当然可以直接使用CSizingControlBarG类4. In , include your class' header:#include "" 当使用CSizingControlBarG 时#include ""then add a member variable to CMainFrame:CMyBar m_wndMyBar; 当使用CSizingControlBarG 时CSizingControlBarGm_wndMyBar;5. Create the bar in CMainFrame::OnCreate(). Then set bar styles, enable it to dock... like any control bar.if (!(_T("My Bar"), this, 123)){TRACE0("Failed to create mybar\n");return -1;// fail to create}(() |CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_wndMyBar, AFX_IDW_DOCKBAR_LEFT);The instructions above will make a docking bar with a DevStudio-like gripper (with 2 raised lines and a hide button) when docked, and with no gripper when floating.Let's explore some advanced features. Now we will use the CSizingControlBarCF class as a base class, and will hide the miniframe caption, showing the gripper in the floating state too. That's possible, because CSizingControlBarCF's gripper looks like a small caption. As a side effect of using a custom miniframe class, the resizing of the floating bar will be dynamic if "Show window contents while dragging" display property is enabled.1. Add these files to your project too:2. Change the file to look like this:3. Add these lines in CMainFrame::OnCreate(), after the EnableDocking() callBase class: CControlBar Location:This class implements most of the resizable window features - layout management, edge tracking, state persistence, non-client area calculation and painting, etc.Class members:Creates a resizable control bar. Most of the parameters are the same as for the common MFCcontrol bars. lpszWindowName will be the window title, which is shown on the caption of the miniframe, and/or is painted on the gripper by derived classes like CSizingControlBarCF. nID can be any valid window ID. It is strongly recommended to use different IDs for each bar, because the state persistence implementation is based on them.Used in conjunction with CFrameWnd::LoadBarState(), allows the bar to remember the previous sizes and positions in all states: floating, horizontally or vertically docked. The call loads from registry or from an .ini file the m_szFloat, m_szHorz and m_szV ert members. Best place to call: in CMainFrame::OnCreate(), just before LoadBarState().Returns TRUE if the bar is floating, FALSE otherwise.Returns TRUE if the bar is docked at the top or bottom of the frame (it is horizontally oriented), FALSE otherwise.Returns TRUE if the bar is docked on the lateral sides of the frame (left or right - vertically oriented), FALSE otherwise.Sets the SCBS_* styles. It is strongly recommended to use this function before the bar is created. These styles are not related with window styles. dwSCBStyle can be a combination of the following styles:Returns the SCBS_* style combination of the bar. See SetSCBStyle() above for a list of available styles.Base class: CSizingControlBar Location:Adds a gripper and a hide bar button in the non-client area. The non-client area is adjusted for the gripper in NcCalcClient() and painted in NcPaintGripper(). These 2 virtual member functions of CSizingControlBar are the framework for customizing the non-client area.OnNcHitTest() and OnNcLButtonUp() are used to implement the functionality of the button, while OnUpdateCmdUI() updates its look (flat/pushed/raised).Class members:Call this function to find if the bar will display the gripper in the current state. By default it returns FALSE if the bar is floating and the miniframe has its own caption, and TRUE otherwise.Base class: CSizingControlBarG Location:Using this class as a base class causes a small caption to be drawn for the bar, with the window title. If the bar is docked horizontally, the caption is painted sideways, with the text rotated 90 degrees CCW. In fact, it is the gripper which is custom painted - the bar functionality is similar with CSizingControlBarG's (the base class).A nice feature is child focus auto-sensing: if a child window of the bar has the focus, the caption is painted as active, giving a useful feedback to the user. Keep in mind that this is different from the MFC's active view concept: an active view will receive command messages and will translate keyboard accelerators even if the view doesn't have the focus. An active bar means just this - a window which is child of the bar has the keyboard focus.All colors used are the system colors, so you don't need to worry if you app will look bad if the user has other settings for display appearance. Even more - support for gradient captions is enabled for VC++ too, so you can use the compiler version of choice. The gradient captions are painted only if the user host system is Win98, Win2000, or above, and it is based (of course) on the system settings. More specific: if the main window caption is painted with gradient, the bars will have gradient captions too.These classes are intended to be used as base classes. Do not simply add your code to the files -instead create a new class derived from CSizingControlBarG or CSizingControlBarCF and put there what you need. If you want to customize your gripper, or simply don't want a gripper, you can use CSizingControlBar as a base class.Window IDs: The usage of IDs in the range of AFX_IDW_CONTROLBAR_FIRST + 32 ..AFX_IDW_CONTROLBAR_LAST is required only if the bar will not be enabled for docking (that's is /swfanyi/xinxi2_2311905.html- it will stay fixed right under the frame's menu). But in this situation you won't be able to fully use the features of this class, so if you will enable it to dock (a reasonable guess :) then you can use any valid window place where the IDs are important is the saving/loading of the bar's state. Y ou must use different IDs for each control bar that is enabled to dock, and this includes the other bars too. For example, if you have two toolbars, you can create the first one with the default ID (which is AFX_IDW_TOOLBAR = AFX_IDW_CONTROLBAR_FIRST), but the second one must have a different ID. OnUpdateCmdUI: This member function is pure virtual in CControlBar (the base class of CSizingControlBar). Its purpose is to allow updating of controls at idle time (from here CCmdUI::DoUpdate() is called for the toolbars buttons, controls on dialog bars, panes of status bar, etc.).However, I found it very useful to update the look of the "x" flat button in CSizingControlBarG and the color of the caption in CSizingControlBarCF (no timers needed). So, if you will use this function, don't forget to call the base class' member (see ).Dynamic resizing: This feature allows redrawing of the bar during resizing. Also all the bars are repositioned and redrawn if SPI_GETDRAGFULLWINDOWS system parameter is queried for this (it is enabled by the "Show window contents while dragging" checkbox in Display Properties).CBRS_SIZE_DYNAMIC: This bar style is required. Make sure you add it to the bar, otherwise the application will crash when the user floats a bar. Y ou can add it using SetBarStyle() after Create(), or by changing the default style for Create() to something like:WS_VISIBLE|WS_CHILD|CBRS_TOP|CBRS_SIZE_DYNAMIC.State persistence: The common MFC control bars' docking state is saved using CMainFrame::SaveBarState(). In addition to the info saved by this function, the CSizingControlBar class needs to save 3 sizes. This is done in CSizingControlBar::SaveState() function, so a () call is required. Please note that the state storing code must be placed in CMainFrame's OnClose() or DestroyWindow(), not in OnDestroy(), because at the time theWM_DESTROY message is received, the floating bars are already destroyed. In CMainFrame::OnCreate(), the () call must be placed before LoadBarState(). Alternatively, if you have more than one resizable bars, you can call once the static member SizingControlBar::GlobalSaveState() instead of calling each bar's SaveState(). The same for LoadState() - there is a CSizingControlBar::GlobalLoadState() function. See both samples here for more details.Precompiler flags: There are 2 symbols which can be defined to cause the floating bars to have different appearance and functionality:The table below shows how the floating bar and the miniframe behave in response to these flags. When the bar is docked, the flags have no effect.。

如何使用来创建一个可调整其大小的对话框 Visual C++ 中的滚动条

如何使用来创建一个可调整其大小的对话框 Visual C++ 中的滚动条

概要:本文介绍如何使用来创建一个可调整其大小对话框中滚动条。

该过程由四个基本部分组成:∙在资源编辑器中,选择在属性对话框中的水平滚动和垂直滚动样式。

∙选择调整大小的边框样式,以使该对话框可调整其大小。

∙重写WM_VSCROLL 和WM_HSCROLL 消息处理程序。

∙重写以设置滚动条区域,如果大小减小到小于原始大小WM_SIZE 消息处理程序。

更多信息:若要创建垂直滚动栏可调整其大小的对话框,请执行以下步骤:1.使用应用程序向导创建Microsoft 基础类(MFC) 基于对话框的应用程序。

2.在资源编辑器中,将添加到对话框资源模板中,某些控件属性中的对话框中,选择垂直滚动并选择调整大小的边框样式。

3.将以下受保护的成员变量添加到对话框类中:4.int m_nCurHeight;5.int m_nScrollPos;6.CRect m_rect;使用m_nScrollPos来存储当前垂直滚动位置。

使用m_nCurHeight来存储对话框中的当前高度并处理OnVScroll方法中滚动。

7.要获取原始窗口的大小,请将下行添加到OnInitDialog方法:8.GetWindowRect(m_rect);9.m_nScrollPos = 0;10.向WM_SIZE 消息设置滚动条范围的OnSize方法中添加消息处理程序。

将范围设置为0,如果大小增大到超过原始大小。

11.void CTestDlg::OnSize(UINT nType, int cx, int cy)12.{13.CDialog::OnSize(nType, cx, cy);14.15.// TODO: Add your message handler code here.16.m_nCurHeight = cy;17.int nScrollMax;18.if (cy < m_rect.Height())19.{20. nScrollMax = m_rect.Height() - cy;21.}22.else23. nScrollMax = 0;24.25.SCROLLINFO si;26.si.cbSize = sizeof(SCROLLINFO);27.si.fMask = SIF_ALL; // SIF_ALL = SIF_PAGE | SIF_RANGE| SIF_POS;28.si.nMin = 0;29.si.nMax = nScrollMax;30.si.nPage = si.nMax/10;31.si.nPos = 0;32. SetScrollInfo(SB_VERT, &si, TRUE);33.}34.将WM_VSCROLL 消息的消息处理程序添加到OnVScroll方法:35.void CTestDlg::OnVScroll(UINT nSBCode, UINT nPos,CScrollBar* pScrollBar)36.{37.// TODO: Add your message handler code here and/orcall default.38.int nDelta;39.int nMaxPos = m_rect.Height() - m_nCurHeight;40.41.switch (nSBCode)42.{43.case SB_LINEDOWN:44.if (m_nScrollPos >= nMaxPos)45.return;46.nDelta =min(nMaxPos/100,nMaxPos-m_nScrollPos);47.break;48.49.case SB_LINEUP:50.if (m_nScrollPos <= 0)51.return;52.nDelta = -min(nMaxPos/100,m_nScrollPos);53.break;54.55. case SB_PAGEDOWN:56.if (m_nScrollPos >= nMaxPos)57.return;58.nDelta =min(nMaxPos/10,nMaxPos-m_nScrollPos);59.break;60.61.case SB_THUMBPOSITION:62.nDelta = (int)nPos - m_nScrollPos;63.break;64.65.case SB_PAGEUP:66.if (m_nScrollPos <= 0)67.return;68.nDelta = -min(nMaxPos/10,m_nScrollPos);69.break;70.71. default:72.return;73.}74.m_nScrollPos += nDelta;75.SetScrollPos(SB_VERT,m_nScrollPos,TRUE);76.ScrollWindow(0,-nDelta);77.CDialog::OnVScroll(nSBCode, nPos, pScrollBar);78.}79.生成并运行该应用程序。

VC6.0程序设计方法例证——轻松建立浮动式自定义工具栏

VC6.0程序设计方法例证——轻松建立浮动式自定义工具栏

VC6.0程序设计方法例证——轻松建立浮动式自定义工具栏周昌权
【期刊名称】《《电脑知识与技术》》
【年(卷),期】2003(000)017
【摘要】VC6.0是当前最流行的、面向对象的可视化编程语言,使用它可方便快捷的设计应用程序,但人们往往在学习这门语言过程中会产生难而“望而却步”的感觉。

本文通过一个具体设计应用程序过程,证明利用VC6.0可轻松开发一个应用程序,总结出用VC6.0设计应用程序方法,从而帮助人们领悟VC6.0面向对象程序设计内涵,摆脱学习中的迷茫,树立信心,达到学好这门语言的目的。

【总页数】5页(P60-64)
【作者】周昌权
【作者单位】
【正文语种】中文
【中图分类】TP311.11
【相关文献】
1.Protel99中实现用户自定义工具栏和自定义快捷键 [J],
2.Visual FoxPro自定义工具栏的创建与应用 [J], 车葵
3.自定义傲游3的工具栏 [J], 震震有词
4.创建Word自定义样式及自定义工具栏 [J], 刘铁英; 叶慧玲
5.IE工具栏轻松DIY “我的工具栏《电脑迷》专版”诞生 [J], 赵轩
因版权原因,仅展示原文概要,查看原文内容请购买。

VC编程实现多功能工具条的技巧和方法

VC编程实现多功能工具条的技巧和方法

VC编程实现多功能工具条的技巧和方法
王鹏程
【期刊名称】《电脑编程技巧与维护》
【年(卷),期】2005(000)005
【摘要】大家都会注意到IE工具条上有许多新特性。

若编程中也使自己的应用程序具有这些新特性,一方面可增加程序界面的美观性,另一方面也使自己的程序与众不同,从而为使用者带来方便,下面我就介绍通过用VC++6.0中实现新特性工具条的几种方法。

【总页数】7页(P53-59)
【作者】王鹏程
【作者单位】无
【正文语种】中文
【中图分类】TP3
【相关文献】
1.VC编程实现显示和隐藏工具条 [J], 梦凡
2.基于VC++的图形编程实现方法 [J], 何建新
3.VC与MATLAB混合编程实现方法及具体实例研究 [J], 夏欣
4.计算微波中VC + +与Fortran混合编程实现方法 [J], 刘涛;曹祥玉;余征
5.图像轮廓的点坐标的提取方法及VC++编程实现 [J], 刘伟学
因版权原因,仅展示原文概要,查看原文内容请购买。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

VC++环境下浮动工具条的编程
许多程序员都希望自己的程序能更象商业化程序,特别是希望自己的程序工具条能够象WINDOWS95下的OFFICES一样具有浮动效果。

针对VISUALC++编程环境,以下分别介绍了两种产生浮动工具条的方法。

各有其优点和不足,可供程序员选择。

第一种方法
该方法最为简单,利用VC中的工具条的系统未公布的隐含参数TBSTYLE_FLA T,不需更改原由程序只要在程序中添加4条语句即可实现浮动效果。

不过该方法只能产生简单的浮动工具条,而且没有象OFFICES中工具条右侧的拖动条gripper。

而且该方法在VC50下存在严重的缺陷,当拖动工具条时,系统不能对工具条进行刷新,因此会产生移动工具条到新位置时,原处仍有工具条。

主要是负责工具条的动态连接库COMCTL32.DLL的BUG。

该问题在VC60中由于更新了该动态连接库而得以解决。

程序员如果使用的是VC5版可以用新的版本COMCTL32.DLL (4.72版以上)替换该动态连接库来解决。

具体方法如下:
int CMainFrame::OnCreate
(LPCREA TESTRUCT lpCreateStruct)
{
...
m_wndToolBar.SetBarStyle
(m_wndToolBar.GetBarStyle() |
CBRS_TOOLTIPS | CBRS_FLYBY |
CBRS_SIZE_DYNAMIC|TBSTYLE_FLAT);
//添加以下4句语句,产生浮动效果
LONG lStyle;
lStyle=GetWindowLong
(m_wndToolBar,GWL_STYLE);
lStyle=lStyle|TBSTYLE_FLA T;
SetWindowLong(m_wndToolBar,
GWL_STYLE,lStyle);
m_wndToolBar.EnableDocking
(CBRS_ALIGN_ANY);
...
}
第二种方法
该方法是对MFC原来的CTOOLBAR类进行继承,主要是重载成员函数OnWindowPosChanging(LPWINDOWPOS lpWndPos);OnPaint();OnNcPaint();OnNcCalcSize(); 实现浮动工具条。

使用本类,只要将以下的程序代码FlatToolBar.h和FlatToolBar.Cpp 加入项目,并用INCLUDE将FlatToolBar.H包含到绘制主窗口的CMainFrame中,然后把你的原先定义工具条变量的CToolBar类变成CFlatToolBar类,并在建立工具条后调用SetFlatLookStyle()函数设置浮动方式。

为方便以后其它使用程序,可以在该类上右击鼠标,选择Add to Gallery将CFlatToolBar类存入类库以便下次使用。

相关文档
最新文档