孙鑫VC++第9章定制应用程序外观

孙鑫视频VC++深入详解学习笔记 <br />VC++深入详解学习笔记<br />Lesson1: Windows程序运行原理及程序编写流程<br />Lesson2: 掌握C++基本语法<br />Lesson3: MFC框架程序剖析<br />Lesson4: 简单绘图<br />Lesson5: 文本编程<br />Lesson6: 菜单编程<br />Lesson7: 对话框编程<br />Lesson9: 定制应用程序的外观<br />Lesson10: 绘图控制<br />Lesson11 图形的保存和重绘<br />Lesso 阅读详情

 

                             九、定制应用程序外观

 

1.      如果希望在应用程序窗口创建之前修改它的外观和大小,就应该在CMainFrame类的PreCreateWindow成员函数中进行;(只需要修改CREATETRUCT结构体中的相关成员变量就行)

//修改窗口大小

Cs.cx = 300;

Cs.cx =200;

//修改程序窗口风格

//如果想让窗口显示自己的标题,只需要将窗口的FWS_ADDTOTITLE样式去掉;

Cs.lpszName = http://www.sunxin.org;

Cs.style &=~FWS_ADDTOTITLE;

 

2.      在窗口创建之后修改

 

在窗口创建之后修改其外观,可以在框架类的OnCreate函数中添加具体的实现代码;

利用SetWindowLong,和GetWindowLong;

 

SetWindowLong(m_hWnd,GWL_STYLE,GetWindowLong(m_hWnd,

        GWL_STYLE) &~WS_MAXIMIZEBOX);

 

3.      修改窗口的光标、图标和背景:在窗口创建前修改

 

在框架类的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();//获取当前应用程序的实例句柄

wndcls.lpfnWndProc = ::DefWindowProc;

wndcls.lpszClassName = "sunxin.org";

wndcls.lpszMenuName = NULL;

wndcls.style = CS_HREDRAW | CS_VREDRAW;

 

RegisterClass(&wndcls);

cs.lpszClass = "sunxin.org";//指定类名,得跟注册的名字一样

 

但凡以AFX开始的函数都是应用程序框架类函数,也是全局函数,在程序的所有类中都可以直接调用;

 

注意:在MFC程序中,如果想要修改应用程序窗口的图标,则应在框架类中进行,因为在框架窗口中才有标题栏,所以才能修改位于该标题栏上的图标;如果想要修改程序窗口的背景和光标,就应该在视类中进行;

 

 

所以得在视类的PreCreateWindow函数中添加

Cs.lpszClas = “sunxin.org”;

 

 

第二种方法:不需要重写整个窗口类,比较简单

 

//不需要重写整个框架类

cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW |CS_VREDRAW,0,0,//光标和背景都为0

LoadIcon(NULL,IDI_WARNING));

 

 

4.      修改窗口的光标、图标、和背景:在窗口创建之后修改:OnCreate函数中

 

SetClassLong(m_hWnd,GCL_HICON,(LONG)LoadIcon(NULL,IDI_ERROR));

 

5,模拟动画图标:利用定时器和SetClassLong函数就可以完成这个功能;

 

6,加载图标资源

 

             

       externCStyleApp theApp;

       //LoadIcon函数的第一个参数为NULL,加载的是系统图标

       //使用自定义图标,第一个参数应为应用程序的当前实例句柄

 

       //MAKEINTERSOURCE宏将资源ID号转换为资源标识符字符串

 

 

       m_hIcons[0]= LoadIcon(AfxGetInstanceHandle(),MAKEINTERSOURCE(IDI_ICON1));

       //利用全部变量theapp,需要添加声明 extern C**App theApp;

       m_hIcons[1]= LoadIcon(theApp.m_hInstance,MAKEINTERSOURCE(IDI_ICON2));

m_hIcons[2]=LoadIcon(AfxGetApp()->m_hinstance,MAKEINTERSOURCE(IDI_ICON3));

 

 

然后设置定时器:SetTimer(1,1000,NULL);

然后再为类添加定时器消息WM_TIMER的响应函数,并调用SetClassLong函数改变应用程序窗口的图标;

 

 

作为静态的局部变量,它将存放在程序的数据区中,而不是在栈中分配空间的;static

 

1.      工具栏编程

 

在工具栏中删除按钮:不要用delete,而是在按钮上按下鼠标左键,然后拖出工具栏就可以了;

 

2.      创建工具栏的方法有两种:

 

(一)  第一种方法:

1.      创建工具栏资源;

2.      构造CToolBar对象

3.      调用Create或者CreateEx函数创建windows工具栏,并把它与已创建的CToolBar对象关联起来;

4.      调用LoadToolBar函数加载工具栏资源;

 

(二)  第二种方法:

1.      构造CToolBar对象;

2.      调用Create或者CreateEx函数创建windows工具栏,并把它与已创建的CToolBar对象关联起来;

3.      调用LoadBitmap函数加载包含工具栏按钮的图像的位图;(该位图为Toolbar.bmp,里面有许多小图像,对应按钮)

4.      调用SetButtons函数设置样式,并把工具栏上的一个按钮与位图中的一个图像相关联;

 

 

3.      MFC创建工具栏的过程

 

在框架类的OnCreate函数中;

 

MFC为我们自动创建的工具栏和主菜单的资源ID是一样的,也就是说,在MFC编程中,一个ID可以表示多种资源;

 

4.      创建自定义的工具栏

 

调用工具栏对象的EnableDockng函数允许工具栏停靠于客户区的任意位置;

框架类的EnableDocking函数,让主框架窗口可以被停靠;

最后调用的DockControlBar函数,可以让这个新工具栏停靠在主框架窗口上;

 

 

   如何让工具栏显示和隐藏:

 

              if (m_newToolBar.IsWindowVisible())

       {

              m_newToolBar.ShowWindow(SW_HIDE);

       }

       else

       {

              m_newToolBar.ShowWindow(SW_SHOW);

       }

      

       //让滚动条重新调整它的位置

       RecalcLayout();

 

       //让工具栏漂浮移动后显示停靠在主框架窗口上;

       DockControlBar(&m_newToolBar);

 

      

 

       也可以用一个函数来实现显示/隐藏工具栏

       ShowControlBar(&m_newToolBar,!m_newToolBar.IsWindowVisible(),FALSE);

 

 

 

       设置菜单复选标志:

       为这个菜单添加一个UPDATE_COMMAND_UT消息响应函数

 

       pCmdUI->SetCheck(m_newToolBar.IsWindowVisible());

 

 

5.      状态栏编程:在框架类中的OnCreate函数中;用CStatusBar类定义了一个m_wndStatusBar变量;

 

 

6.      状态栏的右下角称为状态指示器;

 

状态栏对象也是在框架类中定义的;

在调用状态栏对象Create函数创建状态栏后,接着调用SetIndicators函数设置状态栏指示器,其中用到一个数组参数:indicators;,这个数组在框架类的源文件定义的,

数组的元素其实就是ID(状态栏指示器),后面三个ID其实就是MFC预先为我们定义好的字符串资源ID;

 

//获取时间

CTime t = CTime::GetCurrentTime();

CString str = t.Format("%H:%M:%S");

//将它显示在状态栏上

m_wndStatusBar.SetPaneText(1,str);//1是索引

 

 

 

 

 

       //不知道索引的情况下,可通过ID来得到相应的索引  

       CTimet = CTime::GetCurrentTime();

       CStringstr = t.Format("%H:%M:%S");

      

       intindex =0;

       index= m_wndStatusBar.CommandToIndex(IDS_TIMER);

 

       m_wndStatusBar.SetPaneText(index,str);

      

 

 

/*

       //获取足够的宽度来显示时间

       CTimet = CTime::GetCurrentTime();

       CStringstr = t.Format("%H:%M:%S");

       CClientDCdc(this);

       CSizesz = dc.GetTextExtent(str);

       intindex =0;

       index= m_wndStatusBar.CommandToIndex(IDS_TIMER);

       //把窗体风格,宽度再加大些

       m_wndStatusBar.SetPaneInfo(index,IDS_TIMER,SBPS_NOBORDERS,sz.cx);

       m_wndStatusBar.SetPaneText(index,str);

       */

 

7.      进度栏编程

 

在窗口中创建进度栏

先定义一个CProgressCtrl类型的成员变量:m_progress,然后在OnCreate函数中创建;

 

m_progress.Create(WS_CHILD | WS_VISIBLE,CRect(100,100,120,120),this,123);

//显示当前进度

m_progress.SetPos(50);

 

 

8.      在状态栏的窗格中创建进度栏

 

首先要获得该窗格的区域,然后将这个区域的大小作为进度栏的大小;GetItemRect函数

 

 

框架类的OnCreate函数是在响应框架窗口的WM_CREATE消息时候调用的;

 

 

为了避免我们自定义的这条消息与其他已有消息发生冲突,应用利用windows提供的一个常量:WM_USER,我们只需要加1就可以用了;(我们自定义的消息最好用UM_为前缀)

 

 

 

命令消息是用ON_COMMAND宏将消息与消息响应函数关联起来,而对于自定义的消息来说,是使用ON_MESSAGE宏来实现这一功能的;

 

 

 

编写状态栏最好在响应WM_PAINT的消息函数中:

 

 

CRect rect;

m_wndStatusBar.GetItemRect(2,&rect);

//判断是否已经创建进度栏

if (!m_progress.m_hWnd)

{

        m_progress.Create(WS_CHILD | WS_VISIBLE|PBS_SMOOTH,rect,&m_wndStatusBar,123);

}

else

{

        //把进度栏移动到目标矩形区域中

        m_progress.MoveWindow(rect);

}

m_progress.SetPos(50);

 

 

自动增加步长,可在响应定时器消息中:

 

m_progress.StepIt();

 

 

 

14,在状态栏中显示鼠标当前位置(视类中实现)

 

       视类没有包含框架类中的头文件,要引用框架类中定义的东西,必须得在视类中包含进来;

 

响应鼠标移动的消息

 

       CStringstr;

       str.Format("x=%d,y=%d",point.x,point.y);

       //第一种要改m_wndStatusBar的权限

       ((CMainFrame*)GetParent())->m_wndStatusBar.SetWindowText(str);

       //或者用另外一个函数

       //((CMainFrame*)GetParent())->SetMessageText(str);

       //第三种方法,用GetMessageBar()返回状态栏对象的指针,从而不用改权限

       //((CMainFrame*)GetParent())->GetMessageBar()->SetWindowText(str);

 

      

       状态栏不属于视类窗口,它属于框架类窗口;

      

       CMainFrame类派生于CFrameWnd类;

 

 

15,启动画面(利用组件Splash screen)

 

       在CSplashWnd类的OnCreate函数中,可以看到它设置了一个定时器;

 

 

100天学习MFC 读书笔记 060719 经过一轮的徘徊,灰心,..........................之后,暂定100天,看看能否入门,为了记念大学时的梦想,为了兴趣.学习内容按孙鑫的教程,>(暂不论这本书好坏,就是贵了点)(后记,原来已经有很多人作这个笔记了...............................................................)白天正常上班,学习只能抽空了 阅读详情

相关推荐

VC++网络资源集合

http://www.jizhuomi.com/software/257.html     第一部分:VS2010/MFC开发环境     第二部分:VS2010/MFC应用程序框架     第三部分:对话框     第四部分:常用控件     第五部分:菜单、工具栏与状态栏     第六部分:文档、视图和框架     第七部分:MFC常用类     第八部分:字体和文本输出  

bcbobo21cn的专栏 2298

孙鑫VC++深入详解:Lesson9 Part3---模拟动画图标

让应用程序标题栏的图标按照时间轮换 思路: 1) SetClassLong函数在窗口建成后调用图标文件(事先准备好3个图标文件),在OnCreate中处理 2) 在OnCreate中放置一个SetTimer 3)处理WM_TIIMER消息即OnTime函数 知识点: 用三种方法获取应用程序实例hInstance句柄 1) AfxGetInstanceHandle() 2)t

-----------------------------不要在跟自己无关的事情上浪费时间 1491

生物信息学新手必看:MAFFT多序列比对从安装到实战(附参数优化技巧)

本文为生物信息学新手提供了MAFFT多序列比对工具的完整指南。从Linux环境下的安装部署,到核心算法策略(如FFT-NS-i、L-INS-i)的选择逻辑,再到空位罚分等关键参数的深度解析与优化技巧,手把手教你完成从原始序列到高质量比对结果的实战流程,为后续进化树构建等分析奠定坚实基础。

weixin_29230773的博客 486

孙鑫VC++深入详解全书总结

孙鑫VC++视频笔记列表(全) 简 介 第一课Windows程序内部运行机制 第二课MFC 程序框架的剖析 第三课MFC 消息映射机制和DC的获取 第四课简单字处理软件 第五课菜单编程 第六课对话框编程1 第七课对话框编程2 第八课MFC 中各类指针的获取 第九课应用程序外观修改 第十课图形绘制与通用对话框 第十一课图形保存和重绘 第十二课文件操作 第十三课文档和串行化

xiao__C的专栏 1244

ArcGIS供地图斑图形及属性入库操作(附练习数据)

已知数据: 供地图斑位置图。 供地图斑表格 成果要求:将供地图斑导入mdb数据库并将供地图斑表格的属性进行挂接。 接下来我们开始操作: 1、 打开arcmap,在目录内连接的文件夹内找到供地图斑位置图。图片 2、 将annotation和polygon添加到arcmap图片 3、 右击文件所在文件夹新建mdb数据库图片 4、 右击数据库新建要素数据集。(要素数据集非常重要,稍后所有操作都在数据集内进行)选择图斑投影方式及代号。图片 5、 右击要素数据集—导入(将图层内的数据导入数据库)图片 6、 数据导入.

qq_43173805的博客 8132

用迅为RK3588开发板DIY无人机飞控:从电路设计到PID调参全记录

本文详细记录了使用迅为RK3588开发板DIY无人机飞控的全过程,从硬件选型、PCB设计到实时系统构建和PID调参。RK3588核心板凭借其强大的AI算力和丰富接口,成为高性能无人机控制解决方案的理想选择。文章还分享了视觉导航系统集成和实际飞行测试经验,为硬件爱好者提供实用参考。

weixin_29053577的博客 434

孙鑫vc++学习笔记

VC++深入详解学习笔记... 1 Lesson1: Windows程序运行原理及程序编写流程... 1 Lesson2: 掌握C++基本语法... 6 Lesson3: MFC框架程序剖析... 7 Lesson4: 简单绘图... 9 Lesson5: 文本编程... 12 Lesson6: 菜单编程... 15 Lesson7: 对话框编程...

backer 4211

禅道18.3版本二开避坑指南:手把手教你扩展自定义报表功能

本文详细介绍了禅道18.3版本的二次开发实践,重点讲解如何扩展自定义报表功能。通过zentaoPHP框架的深度定制,从开发环境搭建到核心数据模型扩展,再到可视化配置和性能优化,手把手教你构建多维报表分析系统,满足企业级项目管理需求。

day7的博客 370

孙鑫VC++视频学习笔记之9: 应用程序外观修改

转自:http://webbery.tianyablog.com  阅读本文前,我们假设您已经:   1,知道如何创建一个单文档的App Wizard   2,知道C++ 类、函数重载等简单知识   3,知道如何给View类或者Doc文档添加成员变量   4,会用MFC的IDE调试工具最好,那么本文的程序您可以

yx601的专栏 780

手把手教你用STM32F103C8T6驱动HUB75 LED点阵屏(附74HC595级联代码)

本文详细介绍了如何使用STM32F103C8T6开发板驱动HUB75接口的LED点阵屏,包括硬件连接、74HC595级联代码、时序控制及灰度显示实现。通过实战案例展示动态文字显示和性能优化技巧,帮助开发者快速掌握LED点阵屏驱动技术。

weixin_42623010的博客 342

【音视频基础】一篇搞懂视频的各种封装格式

在现代多媒体处理中,视频封装格式扮演着至关重要的角色。不同的封装格式决定了视频文件的存储方式、兼容性以及功能特性。无论是观看高清视频、编辑电影剪辑,还是在互联网上流式传输内容,理解各种视频封装格式的基础知识都是必不可少的。在这篇文章中,我们将详细介绍常见的视频封装格式,探讨为什么需要这些格式,以及它们各自的功能和区别,帮助你在选择和使用视频格式时做出更明智的决定。WEBM理解各种视频封装格式的功能和区别对于选择合适的格式至关重要。

m0_62599305的博客 2483

孙鑫VC++深入详解:Lesson9 Part1---修改应用程序窗口

一. 在窗口创建之前修改:       要在MainFrame中的虚函数PreCreateWindow(CREATESTRUCT& cs)中修改CREATESTRUCT      修改窗口标题,2个步骤    step1:抹去窗口样式中的FWS_ADDTOTITLE,该样式是指示框架将文档标题添加到窗口标题中          cs.style &=~FWS_ADDTOTITLE;

-----------------------------不要在跟自己无关的事情上浪费时间 1250

基于Python的彭博社新闻高效爬取实战:最新技术与完整代码解析

本文将详细介绍如何使用Python最新技术构建一个高效的彭博社(Bloomberg)新闻爬虫系统。我们将从爬虫基础概念讲起,逐步深入到高级反反爬技术、异步抓取、数据解析与存储等核心环节。文章包含完整的代码实现,采用最新的aiohttp、Playwright等技术栈,并特别关注法律合规性和数据质量保障。通过本文,读者将掌握一个完整的商业新闻爬虫开发流程,并能够根据实际需求进行定制化开发。关键词:Python爬虫、彭博社、Bloomberg、新闻采集、aiohttp、Playwright、反反爬技术。

2201_76125261的博客 1503

孙鑫C++学习笔记

孙鑫视频VC++深入详解学习笔记    VC++深入详解学习笔记 Lesson1: Windows程序运行原理及程序编写流程 Lesson2: 掌握C++基本语法 Lesson3: MFC框架程序剖析 Lesson4: 简单绘图 Lesson5: 文本编程 Lesson6: 菜单编程 Lesson7: 对话框编程 Lesson9: 定制应用程

相见不如怀念 8330

SAP-MM-供应商对账平台(功能集合)

(1)集成OA审批,线上核销,结果写入SAP; (2)集成SRM,线上与供应商对账确认,写入SAP; (3)集成财务付款结果确认写入,OA回传结果,定时同步SRM供应商平台。 欢迎留言交流,功能完善,如需要页面设计,请订阅专栏

qq_32198063的博客 749

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

孙鑫VC视频教程笔记之第九课“程序外观修改及工具栏状态栏编程”

 1.      在窗口创建之前修改窗口外观: The framework calls PreCreateWindow just prior to creating the window. By modifying the CREATESTRUCT parameter to PreCreateWindow, your application can change the attributes

Roger Ge 的专栏 2236

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

孙鑫vc视频教程笔记(二)

1.  当在vc++中预览一个窗口,出现无法关闭窗口的情况时:使用快捷键:Ctrl+PauseBreak2.  VC中出现类丢失的情况,可以删除aps、ncb、clw这三个文件,然后打开工程,ctrl+w,按提示来。3.  CWnd::PreCreateWindow:在窗口没有附着在CWnd之前被框架调用。通过修改CREATESTRUCT这个结构体(CREATESTRUCT定义传递给窗口过

mingyuan's workspace 1052

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

孙鑫C++教学视频

视频百度云:https://pan.baidu.com/s/1jKf6GoY 在线观看:http://list.youku.com/albumlist/show?id=3567028&ascending=0&page=1 内容介绍: 教程1:Windows程序运行原理及程序编写流程,窗口产生过程,句柄原理,消息队列,回调函数,窗口关闭与应用程序退出的工作关系,使用V...

aizongsai2251的博客 202
上一篇: 孙鑫VC++第8章对话框(二)
下一篇: 孙鑫VC++第10章绘图控制
C__Monkey
博客等级 码龄14年 12粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值