`
yingyingol
  • 浏览: 743000 次
文章分类
社区版块
存档分类
最新评论

修改应用程序的外观,工具栏、状态栏

 
阅读更多
第一部分 改变应用程序的外观
一、 问题:要修改一个应用程序的外观,应该在应用程序创建之前还是在创建之后修改呢?
修改一幢楼房应在建成之前,应在窗口创建之前修改。要改变一个框架窗口的外观,应在CMainFrame::PreCreateWindow()中去改变,
CREATESTRUCT cs结构体的类型和个数与创建窗口的CreateWindowEx()的个数和类型是完全一致的。只是顺序正好相反。
PreCreateWindow(cs)的参数cs被声明为一个引用类型,如果在子类中修改了cs的值,这种改变会反应到MFC的底层代码中。
1、修改窗口的大小:
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
cs.cx=300;
cs.cy=200;
return TRUE;
}
2、修改窗口的标题
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
cs.lpszName="http://www.sunxin.org";
return TRUE;
}
标题并没有被改变。
分析:程序是一个SDI应用程序,打开Word时,它的标题栏显示的一个“文档1”标题,
在MSDN中,Window Styles
在一个SDI应用程序中,缺省的窗口类型是WS_OVERLAPPEDWINDOW 和FWS_ADDTOTITLE的组合。
FWS_ADDTOTITLE 用来增加文档的标题到窗口的标题
去掉FWS_ADDTOTITLE属性。
cs.style&=~FWS_ADDTOTITLE; //取反,并进行与操作。
cs.style=WS_OVERLAPPEDWINDOW; //直接赋值
二、 问题:在窗口创建之后能不能修改外观和大小呢?
The SetWindowLong function changes an attribute of the specified window
LONG SetWindowLong(
HWND hWnd,
int nIndex, GWL_STYLE
LONG dwNewLong
);
在OnCreate函数中去改变
在所有的窗口对象(C++对象)中都有一个公有的成员变量m_hWnd,保存了与对象相关的窗口的句柄。
SetWindowLong(m_hWnd,GWL_STYLE,WS_OVERLAPPEDWINDOW);
问题:在使用SetWindowLong设置窗口类型里,想获得现有的窗口类型,怎么进行?
LONG GetWindowLong(
HWND hWnd, //窗口句柄
int nIndex //常量,指定窗口的那种信息 如:GWL_STYLE
);
获取现有类型,去掉最大化按钮
SetWindowLong(m_hWnd,GWL_STYLE,GetWindowLong(m_hWnd,GWL_STYLE)
& ~WS_MAXIMIZEBOX);
三、 如果要修改窗口的图标、光标和背景,应该如何去修改?
图标、光标和背景是在设计窗口类时被指定的,窗口类的设计和注册是由MFC的底层代码自动实现的,不可能去修改MFC的底层代码,如何修改?
一、自己编写窗口类,并注册,让随后的窗口的创建按照我们设计好的窗口类去创建。
在PreCreateWindow()中编写一个窗口类并注册之。
WNDCLASS wndcls;
wndcls.cbClsExtra=0;
wndcls.cbWndExtra=0;
wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);//获取一个黑色的背景画刷
wndcls.hCursor=LoadCursor(NULL,IDC_HELP);
wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);
wndcls.hInstance=AfxGetInstanceHandle();//注意用全局函数获取应用程序hInstance句柄
wndcls.lpfnWndProc=::DefWindowProc;//必须指定为API函数,不同于CWnd中的DefWindowProc(参数个数不同)
wndcls.lpszClassName="sunxin.org";
wndcls.lpszMenuName=NULL;//菜单的创建并不是在设计窗口类时创建的,由MFC在构造pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME,…) 被创建。
wndcls.style=CS_HREDRAW | CS_VREDRAW;
RegisterClass(&wndcls);
cs.lpszClass="sunxin.org";//precreatewindow()中判lpszClass是否为空,不为空说明已注册
编译并运行,发现只有图标被改变,背景、光标未改变,为什么?
答:view始终履盖在frame窗口上,必须在view类的precreatewindow中,指定窗口类为刚才自己编写的这个窗口类。
BOOL CStyleView::PreCreateWindow(CREATESTRUCT& cs)
{
cs.lpszClass="sunxin.org"; //这个窗口类已经注册了,只要指定即可
return CView::PreCreateWindow(cs);
}
四、 在框架窗口中只能修改图标,为了修改图标需要重写窗口类,太麻烦,MFC中提供了一个全局函数,AfxRegisterWndClass()修改、设定一个窗口类的类型,光标、背景、图标。返回一个注册成功的窗口类类名。如果只修改类的类型(wndcls.style),只要第一个参数,其它取默认值。
LPCTSTR AFXAPI AfxRegisterWndClass(
UINT nClassStyle,
HCURSOR hCursor = 0,
HBRUSH hbrBackground = 0,
HICON hIcon = 0
);
1、 改变框架窗口的图标
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW
| CS_VREDRAW,0,0,LoadIcon(NULL,IDI_WARNING));//
return TRUE;
}
2、改变光标和背景,在view中
BOOL CStyleView::PreCreateWindow(CREATESTRUCT& cs)
{
cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW,
LoadCursor(NULL,IDC_CROSS),(HBRUSH)GetStockObject(BLACK_BRUSH),0);
return CView::PreCreateWindow(cs);
}
3、只给AfxRegisterWndClass()的第一个参数赋值,其余取缺省值,cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW);
发现:图标变成wave-flag,光标是箭头形状,背景变成透明。
MSDN:
hCursor
Specifies a handle to the cursor resource to be installed in each window created from the window class. If you use the default of 0, you will get the standard IDC_ARROW cursor.
hbrBackground
Specifies a handle to the brush resource to be installed in each window created from the window class. If you use the default of 0, you will have a NULL background brush, and your window will, by default, not erase its background while processing WM_ERASEBKGND.
hIcon
Specifies a handle to the icon resource to be installed in each window created from the window class. If you use the default of 0, you will get the standard, waving-flag Windows logo icon.
五、 以上都是在窗口创建之前,在窗口创建之后,还能不能修改它的图标、光标背景?
DWORD SetClassLong(
HWND hWnd,
int nIndex,
LONG dwNewLong
);
The SetClassLong function replaces the specified 32-bit (long) value at the specified offset into the extra class memory or the WNDCLASSEX structure for the class to which the specified window belongs.
DWORD GetClassLong(
HWND hWnd,
int nIndex
);
The GetClassLong function retrieves the specified 32-bit (long) value from the WNDCLASSEX structure associated with the specified window
1、 在框架窗口中修改图标,在CMainFrame:: OnCreate() 函数中:
SetClassLong(m_hWnd,GCL_HICON,(LONG)LoadIcon(NULL,IDI_ERROR));
2、 在View中修改光标、背景,在CStyleView:: OnCreate() 函数中
SetClassLong(m_hWnd,GCL_HBRBACKGROUND,(LONG)GetStockObject(BLACK_BRUSH));
SetClassLong(m_hWnd,GCL_HCURSOR,(LONG)LoadCursor(NULL,IDC_HELP));
3、 利用SetClassLong()实现不断变化的图标(图标的动画效果)
在CMainFrame:: OnCreate()安装一个定时器。
初始化一个存储图标的句柄的数组(在CMainFrame增加m_hIcons[3]成员变量),注意MAKEINTRESOURCE宏的使用,以及三种获当前实例句柄的方法。
m_hIcons[0]=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1));
m_hIcons[1]=LoadIcon(theApp.m_hInstance,MAKEINTRESOURCE(IDI_ICON2));
m_hIcons[2]=LoadIcon(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDI_ICON3));
LoadIcon()的第二个参数要求一个字符指针,但我们只有图标的ID号,ID号转换为LPTSTR指针类型,MAKEINTRESOURCE()
LPTSTR MAKEINTRESOURCE(
WORD wInteger
);
分享到:
评论

相关推荐

    一个与窗体框架、图标、光标、工具栏相关的VC++程序

    如何增加和删除工具栏按钮,如何给应用程序增加工具栏,如何显示和隐藏工具栏。定制状态栏,在状态栏中添加时钟显示,CTime类及其用法。在状态栏中添加进度条(主窗口产生后立即产生进度条的巧妙思想,不能在...

    类似于Mac或WorldWind风格的动画工具栏控件

    RichImageBar是一个仿NASA WorldWind风格的工具栏,并在其基础上增强了动画功能,基于WindowsXP操作系统(也可在Win7下使用),采用C#语言开发,在... 在不修改程序代码的情况下,只需修改图片即可改变工具栏的外观。

    VC++程序设计视屏

    如何增加和删除工具栏按钮,如何给应用程序增加工具栏,如何显示和隐藏工具栏。定制状态栏,在状态栏中添加时钟显示,CTime类及其用法。在状态栏中添加进度条(主窗口产生后立即产生进度条的巧妙思想,不能在...

    changeStyle.rar_光标 改

    如何增加和删除工具栏按钮,如何给应用程序增加工具栏,如何显示和隐藏工具栏。定制状态栏,在状态栏中添加时钟显示,CTime类及其用法。在状态栏中添加进度条(主窗口产生后立即产生进度条的巧妙思想,不能在...

    WorldWind风格的工具栏控件,可实现真彩、Alpha透明、动画等效果

    简介: RichImageBar是一个仿NASA ...3. 在不修改程序代码的情况下,只需修改图片即可改变工具栏的外观。 使用说明见压缩包。详细介绍也可见博文:http://blog.csdn.net/fjpnxyh2000/archive/2010/09/09/5872211.aspx

    VB程序设计及应用

    主要介绍了 VisualBasic6.0 系统的基础知识,程序设计的常用函数、程序设计语句、数组,简单介绍了面向对象程序设计的基本概念,详细介绍了基本控件、对话框、图形、菜单等设计方法,多文档界面、工具栏、状态栏的...

    Visual C++2010开发权威指南.part03

    7.2 应用程序窗口图标与背景修改 359 7.2.1 修改窗口图标 359 7.2.2 修改背景 360 7.3 工具栏编程与美化 365 7.3.1 创建工具栏 365 7.3.2 在工具栏中添加、删除 7.3.2 按钮 366 7.3.3 从对话框创建工具栏 368 7.4 ...

    VC++在窗体中修改图标、光标、背景的方法

    摘要:VC/C++源码,界面编程,光标,图标 VC++如何修改MFC AppWizard向导生成的框架程序的外观和大小,修改图标、光标、背景的三种方法、如何增加和删除工具栏按钮、如何给应用程序增加工具栏,如何显示和隐藏工具栏。...

    MFC教程入门知识全集.rar

    9.1 修改Windows 应用程序外观样式 9.1.1 在框架类中修改程序外观 9.1.2 在视图类中修改程序外观 9.2 制作动画图标 9.3 将图片作为窗口显示的背景 第10 章 网络编程 10.1 计算机网络的基本概念 10.1.1 计算机...

    C#程序开发范例宝典(第2版).part08

    实例007 带背景的工具栏 7 实例008 浮动工具栏 7 实例009 带下拉菜单的工具栏 8 实例010 具有提示功能的工具栏 8 1.3 状态栏设计 9 实例011 在状态栏中显示检查框 9 实例012 带进度条的状态栏 10 实例013 ...

    软件界面设计工具_3款合集

    当您需要绘制一款应用程序的外观或显示怎样将程序的各个部分连接起来时,您就可以使用GUI Design Studio来实现,如: 将产品创意文档化 制作项目提案 需求记录 创建屏幕图样 为开发人员制作详细的规格 为现有...

    C#程序开发范例宝典(第2版).part12

    实例007 带背景的工具栏 7 实例008 浮动工具栏 7 实例009 带下拉菜单的工具栏 8 实例010 具有提示功能的工具栏 8 1.3 状态栏设计 9 实例011 在状态栏中显示检查框 9 实例012 带进度条的状态栏 10 实例013 ...

    《计算机应用基础》复习题.docx

    A 工具栏位置上拖曳 B 标题栏位置拖曳 C 状态栏位置上拖曳 D 编辑栏位置上拖曳 8.Windows 7中可以设置、控制计算机硬件配置和修改显示属性的应用程序是( )。 A Word B Excel C 资源管理器 D 控制面板 9.在...

    C#程序开发范例宝典(第2版).part13

    实例007 带背景的工具栏 7 实例008 浮动工具栏 7 实例009 带下拉菜单的工具栏 8 实例010 具有提示功能的工具栏 8 1.3 状态栏设计 9 实例011 在状态栏中显示检查框 9 实例012 带进度条的状态栏 10 实例013 ...

    C#程序开发范例宝典(第2版).part02

    实例007 带背景的工具栏 7 实例008 浮动工具栏 7 实例009 带下拉菜单的工具栏 8 实例010 具有提示功能的工具栏 8 1.3 状态栏设计 9 实例011 在状态栏中显示检查框 9 实例012 带进度条的状态栏 10 实例013 ...

Global site tag (gtag.js) - Google Analytics