VC++的UI设计实例
轻松实现类VC界面
轻松实现类VC界面下图是一个类似VC的界面,左边、底下有两个可浮动、可变大小的控制窗口。
许多朋友都希望在自己的程序中实现类似的界面,因为此种类型的界面用途很广、通用性很强,所以笔者总结了一下实现的步骤,辑此一文,并提供源代码供大家参考!下载本文示例工程一、实现原理图中两个窗口的实现类是从CControlBar派生出来的,我们并不需要从头到尾实现该类,因为Cristi Posea 先生已经为我们实现了一个称为CSizingControlBar的类,而且做得相当完美!我们所要做的便是好好地利用该类,为了尽可能地简洁,笔者将CSizingControlBar类修改了一下并命名为CCoolBar,接下来我们将详细介绍如何利用该类实现我们所需的界面。
二、实现步骤示例[1]前期准备新建一个名为BarDemo的MFC工程,SDI界面,其它选项默认。
将本文示例代码中的sizecbar.h sizecbar.cpp scbarg.h scbarg.cpp 四个文件复制到工程目录下。
在菜单Project->Add to project->Files将四个文件加入工程中,此时在ClassView中将出现了一个称为CCoolBar的类。
在stdafx.h文件中加上#include "sizecbar.h"#include "scbarg.h"[2]开始编码2.1 为CMainFrame增加成员变量CCoolBar m_wndMyBar1;///我们将它作为左边的窗口CCoolBar m_wndMyBar2;///停靠在下方的窗口以下代码需要添加到CMainFrame::OnCreate中,方法与普通工具条的创建没有太大的区别!2.2 创建ControlBarif (!m_wndMyBar1.Create(_T("我的控制条"),this,123)){ TRACE0("Failed to create mybar\n"); return -1; }if (!m_wndMyBar2.Create(_T("我的控制条2"),this,CSize(100,100),TRUE,124)){ TRACE0("Failed to create mybar\n"); return -1; }2.3 停靠控制m_wndMyBar1.SetBarStyle(m_wndMyBar1.GetBarStyle() | CBRS_TOOLTIPS |CBRS_FLYBY | CBRS_SIZE_DYNAMIC);m_wndMyBar2.SetBarStyle(m_wndMyBar2.GetBarStyle() | CBRS_TOOLTIPS |CBRS_FLYBY | CBRS_SIZE_DYNAMIC);m_wndMyBar1.EnableDocking(CBRS_ALIGN_ANY);m_wndMyBar2.EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_wndMyBar1, AFX_IDW_DOCKBAR_LEFT);///停靠在左边DockControlBar(&m_wndMyBar2, AFX_IDW_DOCKBAR_BOTTOM);///停靠在右边此时我们已经生成了两个控制条窗口,但窗口中还没有任何东西!让我们来做最后一件事情:往窗口添加所需部件!2.4 添加我的控件这个问题看似有些麻烦其实相当简单:我们只要在创建这些控件时将控制条窗口指针作为父窗口指针赋值给这些控件即可!请看如下例子(1)将编辑控件放入下面那个控制条窗口中在CMainFrame类中添加成员变量CEdit m_wndEdit;在创建ControlBar后创建编辑控件m_wndEdit.Create(WS_VSCROLL|WS_CHILD|WS_VISIBLE|ES_AUTOVSCROLL|ES_MULTILINE|ES_WANTRETURN,CRect(0,0,0,0),&m_wndMyBar2,101);m_wndEdit.ModifyStyleEx(0,WS_EX_CLIENTEDGE);(2)将树型控件放入左边那个控制条窗口中 在CMainFrame类中添加成员变量 CTreeCtrl m_wndTree;;在创建ControlBar后创建树型控件/////////////这一段代码创建树型控件////////////if (!m_wndTree.Create(WS_CHILD|WS_VISIBLE|TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT,CRect(0, 0, 0, 0), &m_wndMyBar1, 100)){TRACE0("Failed to create instant bar child\n");return -1;}m_wndTree.ModifyStyleEx(0, WS_EX_CLIENTEDGE);////往树型控件添加内容///HTREEITEM hti = m_wndTree.InsertItem(_T("VC知识库在线杂志"));m_wndTree.InsertItem(_T("电子文档"));m_wndTree.InsertItem(_T("在线杂志第一期"), hti);m_wndTree.InsertItem(_T("在线杂志第二期"), hti);(3)将对话框放入控制条中首先在资源编辑器里制作一个CHILD类型的无BORDER对话框,ID为IDD_DIALOGBAR,并以此作为模板生成CVCKBASEDlg类,并在CMainFrame中添加成员变量 CVCKBASEDlg m_wndVCKBASE;然后在创建ControlBar后用如下代码创建对话框m_wndVCKBASE.Create(IDD_DIALOGBAR,&m_wndMyBar1);m_wndVCKBASE.ShowWindow(SW_SHOW);至此我们已经大功告成!我们可以编译运行一下看看两个控制条有没有创建成功。
VC面向对象开发分析与设计实例解析
风之韵■ yesky 众所周知,面向对象的程序设计更适合对现实生活中的描述,更加体现了软件的工业化的精神,所以现在大部分的软 件开发工作都围绕 OOP 的思想来进行的。但是在对现实生活中的实际问题,如何对所研究的系统进行面向对象的分析与设 计呢?本篇文章以一个实际的例子,向大家介绍一下如何对实际问题进行分析和设计。 一.问题描述: 该实例是一个电梯载客问题,问题的描述如下: 某贸易中心共 10 层,设有载客电梯 1 部。为了处理问题的方便,有以下的限定条件: (1) 电梯的运行规则是:可到达每层。 (2) 每部电梯的最大乘员量均为 K 人(K 值可以根据仿真情况在 10~20 人之间确定)。 (3) 仿真开始时,电梯随机地处于其符合运行规则的任意一层,为空梯。 (4) 仿真开始后,有 N 人(>20 人)在该国际贸易中心的 1 层,开始乘梯活动。 (5) 每个人初次所要到达的楼层是随机的,开始在底层等待电梯到来。 (6) 每个人乘坐电梯到达指定楼层后,再随机地去往另一楼层,依此类推,当每人乘坐过 L 次(L 值可以根据仿真 情况在 3~10 次之间确定)电梯后,第 L+1 次为下至底层并结束乘梯行为。到所有人结束乘梯行为时,本次仿真结束。 (7) 电梯运行速度为 S 秒/层(S 值可以根据仿真情况在 1~5 之间确定),每人上下时间为 T 秒(T 值可以根据仿真 情况在 2~10 之间确定)。 (8) 电梯运行的方向由先发出请求者决定,不允许后发出请求者改变电梯的当前运行方向,除非是未被请求的空梯。 最后开发的软件要求: (1) 设计一个易于理解的界面,动态显示各梯的载客与运行情况(上、下或停止),动态显示各楼层的人员停留情况与要 求乘梯情况;动态显示从仿真开始到目前的时间。 (2) 可变动的参数(K、N、M、L、S、T)应在程序开始时从对话框输入 二.系统分析与设计: 采用 OOP 分析的关键就是要对问题的对象空间的分类 (类的分析与设计, 这一点跟面向过程的流程图设计不太一样) , 也就是在整个系统中包括那几个类,每个类包含那些属性特征和行为特征。对于上面的电梯问题,很明显有两个类:即电
VC 的UI设计实例
Visual C 6.0程序设计(章 (6)
第6章 非客户区界面设计 (4) 在Messages列表框中选择消息,然后单击“Add Function…”按钮,增加消息处理函数。一般都是用 ClassWizard提供的缺省函数名。 (5) 单击“确定”按钮,关闭ClassWizard对话框,添加消 息处理函数。
第6章 非客户区界面设计
图6-3 为菜单项添加消息
第6章 非客户区界面设计
表 6-3 系统自动分配的 ID 号
标题
ID 号
显示系统时间
ID_SHOWTIME
禁止
ID_PREVENT
激活
ID_ACTIVE
பைடு நூலகம்
第6章 非客户区界面设计 (9) 运行该程序,可见应用程序菜单如图6-10所示。 需要注意的是,这里所有子菜单选项均为灰色,即无效状态。 要想对应的子菜单处于有效状态,就要为相应的菜单项添加消息 处理函数,即具体的操作功能。
第6章 非客户区界面设计
图6-6 菜单属性对话框
第6章 非客户区界面设计
图6-7 添加子菜单后菜单显示
第6章 非客户区界面设计
图6-8 菜单属性对话框
第6章 非客户区界面设计
图6-9 菜单属性对话框
第6章 非客户区界面设计 (7) 在“分隔符”菜单项下添加“禁止”菜单项,快捷键为 “Alt+P”,提示为“禁止菜单功能”。 (8) 在“禁止”菜单项下增加“激活”菜单项,快捷键为 “Alt+A”,提示为“激活菜单功能”。 请注意,在菜单中用鼠标左键双击新添加的子菜单项,在弹 出的属性窗口中的ID号为系统自动分配的ID号,为了便于寻找可 将其修改为便于记忆的ID号。 系统自动分配的ID号如表6-3所示。
第6章 非客户区界面设计
第6章 非客户区界面设计
VC超级经典实例
第1部分实验实验实验目的和要求(1)熟悉Visual C++ 6.0的开发环境(工具栏及各种窗口)。
(2)显示和隐藏工具栏。
(3)用应用程序向导创建一个控制台应用项目Ex_Hello。
(4)输入并编译一个新的C++程序。
实验准备和说明(1)在第一次上课时进行本次实验。
(2)熟悉Windows 2000操作系统的环境和基本操作。
(3)熟悉实验报告的书写格式,这里给出下列建议:实验报告采用A4大小纸张,封面一般包含实验目次、实验题目、班级、姓名、日期和机构名称。
报告内容一般包括实验目的和要求、实验步骤、实验思考和总结。
需要指出的是,实验步骤不是书本内容的复制,而是自己结合实验内容进行探索的过程。
教师也可根据具体情况提出新的实验报告格式。
(4)阅读下列关于Visual C++的说明:Visual C++是Microsoft公司推出的目前使用极为广泛的基于Windows平台的可视化编程环境。
Visual C++ 6.0是在以往版本不断更新的基础上形成的,由于其功能强大、灵活性好、完全可扩展以及具有强有力的Internet支持,在各种C++语言开发工具中脱颖而出,成为目前最为流行的C++语言集成开发环境。
Visual C++ 6.0分为标准版、专业版和企业版3种,但其基本功能是相同的。
Visual C++ 6.05中文版是在Visual C++ 6.0基础上进行汉化的一个版本,本书以此版本作为编程环境。
为统一起见,本书仍称为Visual C++ 6.0,并以Windows 2000作为操作系统。
Visual C++实训2实验内容和步骤1.启动Windows 2000操作系统打开计算机,启动Windows 2000操作系统。
2.创建工作文件夹创建Visual C++ 6.0的工作文件夹“…\Visual C++程序\实验”(…表示自己的文件夹),在文件夹“实验”下再创建一个文件夹“实验0”,下一次实验就在“实验”文件夹下创建子文件夹“实验1”,依此类推。
VC++基础控件案例图详解
V C++基础控件案例图详解-CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIAN一.简单MFC应用程序开发。
例1. 编写如下图的程序,若单击“复制”按钮,则把上面的编辑框中的内容复制到下面的编辑框中;若单击“结束”按钮,则退出程序的运行。
(1)工程创建①选择“文件|新建”命令;②在“工程”选项卡中,选定“MFC App Wizard(exe),输入工程名称TEST,单击“确定”按钮;③选定“D基本对话框”即创建基于对话框的应用程序,单击“完成”按钮。
(2)放置控件,先删除原有的控件,然后放置本例需要的控件,本例共涉及4个控件:2个编辑框和2个命令按钮。
编辑框主要用来输入数据,也可以用来显示数据;命令按钮用来执行有关操作。
(3)设置控件的属性,控件添加后就要设置其有关的属性。
上编辑框的属性设置:选定“Multiline”复选框,编辑框中可以输入多行文本;选定“Vertical scroll和Auto VScroll,编辑框将有垂直滚动条;选定“Want Return”。
下编辑框的属性设置同上编辑框,但可不选定“Want Return”。
(4)连接变量,为控件连接变量就是为控件起一个名字。
每一个控件都是一个对象,调用MFC类库中的函数都是通过对象来实现的。
编辑框属于CEdit类,一个具体的编辑框就是一个CEdit类的对象,如上IDC_EDIT1和IDC_EDIT2。
这些对象必须有名称才能对它们进行操作,所以要给每一个对象连接一个变量,作为对象的名称。
这个变量将成为类中的一个数据成员。
现在为IDC_EDIT1连接一个变量m_e1。
①在IDC_EDIT1编辑框中右击鼠标出现快捷菜单选择“建立类向导”,如下图所示。
②在上图中选择“创建类向导”后,弹出如下图所示的MFC ClassWizard对话框,在“Member Variables”中,选定“IDC_EDIT1”,再选择“Add Variable”按钮。
VC界面设计(20120707103318)
创建漂亮的应用程序界面刘汇丹facteur@1. 首先在VC里面建立基于对话框的可执行应用程序工程,命名为demo。
2. 在主窗体对话框属性里取消Title bar属性,去掉对话框标题栏。
在对话框窗体里面添加如下图所示的各个控件实例。
靠右侧的那个Edit控件设置了只读属性。
3. 为两个Edit、Slider和进度条设置相应的映射变量。
在CDemoDlg::OnInitDialog()函数中设置初始值。
4. 使用位图作为窗体的背景。
使用绘图软件制作出喜欢的图片,保存为位图文件back.bmp,如下图所示。
注意制作的图片要和对话框窗体大小一致,本例中图片的大小为(380px,260px),背景色为RGB(127, 169, 255)。
将此位图文件拷贝到res文件夹下,并导入到工程里面,设置ID为IDB_BACKBMP,为CDemoDlg类添加保护成员变量CBitmapm_back,并在CDemoDlg::OnInitDialog()函数里面添加如下代码:在CDemoDlg::OnPaint()函数里面,以如下代码替换原来自动生成的代码:经过以上步骤以后,编译运行应用程序,可以看到如下图所示的效果:可以看到,窗体中各个控件的背景颜色和背景图片的颜色不一致。
我们需要做进一步的调整。
5. 统一设置控件的背景颜色:在CDemoApp::InitInstance()函数中int nResponse = dlg.DoModal()语句前插入如下代码:运行应用程序,效果如下图所示:此时,大部分控件的背景颜色已经和背景图片的颜色一致,已经基本形成了比较漂亮的图形界面。
但是我们要做得完美一些。
6.这一步,我们实现漂亮的按钮。
制作三个图片分别表示“确定”按钮正常、获取焦点和鼠标按下时的状态,如下面各图所示:将此三个图片保存为bmp格式的文件并导入到工程中,设置ID分别为IDB_OKUP,IDB_OKFOCUS,IDB_OKDOWN。
桌面精灵vc课程设计
桌面精灵vc课程设计2.3 系统模块划分图2-1系统模块流程图3. 模块设计3.1主窗体设计3.1.1概述桌面精灵的主窗体是以阴历和阳历相结合的方式显示的日历,其中还包含二十四节气以及一些中西方节日。
这些特殊的日期都用不同的颜色进行标注,使用户一眼就可以看出不同。
桌面精灵的主窗体运行效果如图3-1所示。
图3-1 桌面精灵主窗体3.1.2界面设计桌面精灵主窗体的界面设计过程如下:(1)创建1个基于对话框的应用程序。
(2)向工程中导入1个位图资源和31个图标资源,分别用于绘制背景和系统托盘图标。
(3)向对话框中添加控件,包括1个组合框控件和2个按钮控件。
控件的属性设置如表3.1所示。
表3.1 控件属性设置表3.1.2 实现过程(参见源代码)3.2 新建备忘录模块设计3.2.1概述新建备忘录模块用来为用户创建提醒。
用户可以选择一次提醒和循环提醒两种方式,其中,循环提醒还包括按天、周、月、年提醒。
用户设置备忘录名称,选择提醒方式,并设置提醒时间和备忘录描述后,单击“确定”按钮就可以保存备忘录名称,选择提醒方式,并设置提醒时间和备忘录描述后,单击“确定”按钮就可以保存备忘录了。
新建备忘录模块运行效果如图3-2所示。
图3-2 新建备忘录模块运行效果3.2.2界面设计(1)新建1个对话框资源。
(2)向工程中导入1个位图资源,修改位图ID。
(3)向对话框中添加控件,包括1个图片控件、5个静态文本控件、3个文本框、2个时间控件、1个组合框控件、2个单选按钮控件和2个按钮控件。
控件的属性设置如表3-2所示。
表3-2 控件属性设置表3.2.3 实现过程(参见源代码)3.3 新建纪念日模块设计3.3.1 概述用户可以通过新建纪念日模块创建一些具有特殊意义的日期。
在设置时,用户可以选择当天提醒、提前一天提醒、提前三天提醒、提前一周提醒和提前一个月提醒,并且可以时行多项选择,这样就避免了用户忘记重要的日子。
通过提前得到提醒,用户可以有充足的时间为纪念日做准备。
VC图像编程教案第四章:搭建动态交互界面的基础知识
IntroductionDynamic interactive interfaces are a key element of modern software development. Creating a user interface (UI) that is both functional and visually appealing is essential for any software that is intended to be user-friendly. VC++is a versatile programming language that is widely used for developing user interfaces thanks to its powerful graphics engine and robust support for multimedia applications.The fourth chapter in the VC++ image programming tutorial is dedicated to teaching students how to build dynamic interactive interfaces. In this chapter, students will learn how to create graphical user interfaces (GUIs) that are responsive and easy to use. This knowledge is essential for anyone who wants to create software that is user-friendly and visually appealing.In this article, we will explore the basics of building dynamic interactive interfaces using VC++ and highlight some of the key concepts covered in the tutorial.BasicsBefore you start building dynamic interactive interfaces, it is important to understand some basic concepts. First, you need to understand the difference between a static anddynamic interface. A static interface is one that does not change unless the user interacts with it. In contrast, a dynamic interface is one that changes automatically or in response to user input.Another important concept to understand is the role of events in dynamic interfaces. Events are actions that are triggered by the user or system. For example, clicking abutton on a GUI is an event that triggers a specific action.Finally, it is important to understand the concept of controls. Controls are the visual elements that make up auser interface, such as buttons, labels, and text boxes.Creating Dynamic InterfacesCreating a dynamic interface in VC++ involves several steps. First, you need to create a GUI using drag-and-drop tools. VC++ provides a wide range of pre-built controls that you can use to create your interface, such as buttons, labels, and text boxes.Once you have created your basic interface, you need to add code that will make it dynamic. This code typically involves handling events, such as button clicks, and updating the interface in response to these events.One approach to creating dynamic interfaces is to use a loop that constantly updates the interface in response to user input. This approach can be effective for simple interfaces, but it can be inefficient and may cause performance issues with more complex interfaces.A more efficient approach is to use event-driven programming. Event-driven programming is based on the concept of reacting to events as they occur, rather than constantly polling the interface for changes. This approach is more efficient and allows for more complex interaction between the user and the interface.Key ConceptsThere are several key concepts covered in the fourth chapter of the VC++ image programming tutorial. One of the most important of these is the use of event-drivenprogramming. This approach is essential for building dynamic interfaces that are responsive and efficient.Another important concept covered in the tutorial is the use of controls. Controls are the building blocks of a GUI and are essential for creating a functional and visually appealing interface. Learning how to use and manipulate controls is a key skill for anyone working in VC++.The tutorial also covers the use of graphics and multimedia in dynamic interfaces. Using graphics and multimedia elements, such as images, videos, and audio, can greatly enhance the user experience and make a dynamic interface more engaging.ConclusionBuilding dynamic interactive interfaces is an essential skill for any software developer. In the fourth chapter of the VC++ image programming tutorial, students are introduced to the basics of creating dynamic interfaces using event-driven programming and controls.By understanding these concepts and learning how to use them effectively, students can build interfaces that areuser-friendly, visually appealing, and responsive to user input. With this knowledge, they can create software that can compete in a market that demands high-quality and dynamic interfaces.。
VC 多文档用户界面设计
if (m_pDoc1 != NULL) //已经打开则激活
{
POSITION pos;
pos =m_pDoc1->GetFirstViewPosition();
CView* pView = m_pDoc1->GetNextView(pos);
pView->GetParentFrame()->ActivateFrame();
2)这里给出的是一个示例代码,实际开发中可以通过参考实现获得自己想要实现的具体应用情况(例如视图类的不同、数量不同,更重要的还有业务逻辑的不同实现等);
3)运行的结果为:
RUNTIME_CLASS(CMISView));
AddDocTemplate(pDocTemplate);*/
改为:(注意将CMultiDocTemplate*去掉,否则你是新建了一个CMultiDocTemplate*的对象)
m_pDocTemplate1 = new CMultiDocTemplate(
VC之美化界面篇
VC之美化界面篇本文专题讨论VC中的界面美化,适用于具有中等VC水平的读者。
读者最好具有以下VC基础:1. 大致了解MFC框架的基本运作原理;2. 熟悉Windows消息机制,熟悉MFC的消息映射和反射机制;3. 熟悉OOP理论和技术;本文根据笔者多年的开发经验,并结合简单的例子一一展开,希望对读者有所帮助。
正文1. 美化界面之开题篇相信使用过《金山毒霸》、《瑞星杀毒》软件的读者应该还记得它们的精美界面:图1 瑞星杀毒软件的精美界面程序的功能如何如何强大是一回事,它的用户界面则是另一回事。
千万不要忽视程序的用户界面,因为它是给用户最初最直接的印象,丑陋的界面、不友好的风格肯定会影响用户对软件程序的使用。
“受之以鱼,不若授之以渔”,本教程并不会向你推荐《瑞星杀毒软件》精美界面的具体实现,而只是向你推荐一些常用的美化方法。
2. 美化界面之基础篇美化界面需要先熟悉Windows下的绘图操作,并明白Windows的幕后绘图操作,才能有的放矢,知道哪些可以使用,知道哪些可以避免……2.1 Windows下的绘图操作熟悉DOS的读者可能就知道:DOS下面的图形操作很方便,进入图形模式,整个屏幕就是你的了,你希望在哪画个点,那个地方就会出现一个点,红的、或者黄的,随你的便。
你也可以花点时间画个按钮,画个你自己的菜单,等等…… Windows本身就是图形界面,所以Windows下面的绘图操作功能更丰富、简单。
要了解Windows下的绘图操作,要实现Windows界面的美化,就必须了解MFC封装的设备环境类和图形对象类。
2.1.1 设备环境类Windows下的绘图操作说到底就是DC操作。
DC(Device Context设备环境)对象是一个抽象的作图环境,可能是对应屏幕,也可能是对应打印机或其它。
这个环境是设备无关的,所以你在对不同的设备输出时只需要使用不同的设备环境就行了,而作图方式可以完全不变。
这也就是Windows的设备无关性。
【精品文档】vc程序设计范例-推荐word版 (15页)
本文部分内容来自网络整理,本司不为其真实性负责,如有异议或侵权请及时联系,本司将立即删除!== 本文为word格式,下载后可方便编辑和修改! ==vc程序设计范例篇一:VC++编程实例与技巧//如何确定窗口的最大最小值以及如何定位窗口//Modify the Application Class1.初始化application’s window 的最大、最小值。
先找到InitInstance()函数:pMainFrame->ShowWindow(SW_SHOWMAXIMIZED);//者 SW_SHOWMINIMIZED pMainFrame->UpdateWindow();//Modify the Mainframe Class1) modify the PreCreateWindow() functionBOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs){// 2) to center window at 90% of full screenint xSize = ::GetSystemMetrics (SM_CXSCREEN); // 3) to keep document title out of main window's captioncs.style &= ~ FWS_ADDTOTITLE;// 4) to remove min/max boxescs.style &= ~(WS_MAXIMIZEBOX|WS_MINIMIZEBOX);// 5) to fix your application's window sizecs.style &= ~WS_THICKFRAME;return CMDIFrameWnd::PreCreateWindow(cs);}int ySize = ::GetSystemMetrics (SM_CYSCREEN);cs.cx = xSize*9/10;cs.cy = ySize*9/10;cs.x = (xSize-cs.cx)/2;cs.y = (ySize-cs.cy)/2;//an include file that defines a project's registry keys//Modify the Application Class// 1) locate the SetRegistryKey() function and change argument to company key // (failure to do this will cause your application's options to be saved to // a .ini file in your system's os directory)SetRegistryKey(COMPANY_KEY);// 2) replace the "pMainFrame->ShowWindow(m_nCmdShow);" line in the InitInstance() // function with the following://Modify the MainFrame Class UINT err; HKEY key; DWORD size, type; WINDOWPLACEMENT wp;if((err=RegOpenKeyEx( HKEY_CURRENT_USER,APPLICATION_KEY,0,KEY_READ,&k ey)) == { } if (err==ERROR_SUCCESS) { } else { } pMainFrame->UpdateWindow(); pMainFrame->ShowWindow(m_nCmdShow); pMainFrame->SetWindowPlacement(&wp); type = REG_BINARY; size =sizeof(WINDOWPLACEMENT);err=RegQueryValueEx( key,WINDOWPLACEMENT_KEY,0,&type,(LPBYTE)&wp,&siz e ); RegCloseKey( key ); ERROR_SUCCESS )// 1) load previous bar states at end of OnCreate()// 2) save toolbar state and screen size and position in OnClose()void CMainFrame::OnClose(){// save size of screen HKEY key; DWORD size, type, disposition; WINDOWPLACEMENT wp; if(RegOpenKeyEx( HKEY_CURRENT_USER,APPLICATION_KEY,0,{ RegCreateKeyEx( HKEY_CURRENT_USER,APPLICATION_KEY,0,"", // save state of control bars SaveBarState("Control Bar States"); LoadBarState("Control Bar States");KEY_WRITE,&key)!=ERROR_SUCCESS)}} REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&key,&disposition); type = REG_BINARY; size=sizeof(WINDOWPLACEMENT); GetWindowPlacement(&wp);RegSetValueEx( key,WINDOWPLACEMENT_KEY,0,type,(LPBYTE)&wp,size ); RegCloseKey( key ); CMDIFrameWnd::OnClose();//a CommandLineInfo class that parses for additional command line switches//Modify the Application Class1) use new CommandLineInfo classCWzdCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo);//Modify any class// 1) to change your application's icon// 2) to change any frame window's iconGetParentFrame()->SetIcon(AfxGetApp()->LoadIcon(IDI_STATUS_ICON),TRUE); AfxGetMainWnd()->SetIcon(AfxGetApp()->LoadIcon(IDI_STATUS_ICON),TRUE);//sample property page classes//Modify the MainFrame Class// 1) include "afxpriv.h" since we will be using the ON_MESSAGE_VOID macro// 2) add a declaration for a message which will be sent by the property sheet // when the user hits the "Apply" button// 3) add this handler to the message mapBEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)//{{AFX_MSG_MAP(CMainFrame) protected: //{{AFX_MSG(CMainFrame)//}}AFX_MSG afx_msg void OnApply(); DECLARE_MESSAGE_MAP()//}}AFX_MSG_MAP ON_MESSAGE_VOID(WM_APPLY,OnApply) END_MESSAGE_MAP()// 4) use the Dialog Editor to create property pages and the ClassWizard // to create classes for them (please refer to the book)// 5) embed these property page classes in your Mainframe Class// 6) add a menu command for "Preferences"// 7) use the ClassWizard to add a command handler for this command void CMainFrame::OnOptionsPreferences(){// 8) create the property sheet class// 9) create property page class objects// 10) add pages to sheet// 11) initialize the values in the pages// 12) create property sheet// 13) if user presses OK, call OnApply()}// 14) this function is called by "preferences" command and is a handler } delete m_pFirstPage; delete m_pSecondPage; OnApply(); if (sheet.DoModal()==IDOK) { m_pFirstPage->m_bOption1 = m_bFirstOption1; m_pFirstPage->m_sOption2 = m_sFirstOption2; m_pSecondPage->m_nOption1 = m_nSecondOption1; m_pSecondPage->m_sOption2 = m_sSecondOption2; sheet.AddPage(m_pFirstPage); sheet.AddPage(m_pSecondPage);m_pFirstPage=new CFirstPage; m_pSecondPage=new CSecondPage; CPropertySheet sheet(_T("Preferences"),this);// for the message sent when the user presses the "Apply" buttonvoid CMainFrame::OnApply()。
vc 软件框架窗口界面设计
vc++软件框架窗口界面设计.txt同志们:别炒股,风险太大了,还是做豆腐最安全!做硬了是豆腐干,做稀了是豆腐脑,做薄了是豆腐皮,做没了是豆浆,放臭了是臭豆腐!稳赚不亏呀!本文由zhoujc860206贡献ppt文档可能在WAP端浏览体验不佳。
建议您优先选择TXT,或下载源文件到本机查看。
第6章框架窗口界面设计章框架窗口界面设计6.1框架窗口 6.1框架窗口 6.2菜单 6.2菜单 6.3工具栏 6.3工具栏 6.4状态栏 6.4状态栏 6.5交互对象的动态更新 6.5交互对象的动态更新 6.6图标和光标 6.6图标和光标 6.1框架窗口 6.1框架窗口6.1.1单文档和多文档程序框架窗口单文档和多文档程序框架窗口文档应用程序的MFC类结构类结构文档应用程序的如图是单文档应用程序Ex_SDI和多文档应用程序Ex_MDI的MFC类结构。
CAboutDlg是每一个应用程序框架都有的,用来显示本程序的有关信息。
CEx_SDIApp 和CEx_MDIApp是应用程序类,是从CWinApp类派生而来,负责应用程序创建、运行和终止,每一个应用程序都需要这样的类。
CEx_SDIDoc和CEx_MDIDoc是文档类,它们是从CDocument 类派生而来,负责应用程序文档数据管理。
CEx_SDIView和CEx_MDIView是视图类,它们既可以从基类CView派生,也可以从CView派生类派生,负责数据的显示、绘制和其他用户交互。
CMainFrame类是用来负责主框架窗口的显示和管理,包括工具栏和状态栏等界面元素的初始化。
对于单文档应用程序来说,主框架窗口类是从CFrameWnd派生而来的,而对于多文档应用程序程序,主框架窗口是从CMDIFrameWnd派生的。
6.1框架窗口 6.1框架窗口CChildFrame类是从CMDIChildWnd派生而来,专门用来管理多文档应用程序中的文档窗口。
无论是 CMDIChildWnd 还是 CMDIFrameWnd 类,它们都是从 CFrameWnd 派生而来的。
VC++界面设计
位图处理
缓冲技术:即将需要展现的图形先绘制在缓存DC 中,待所有图形绘制完成再加载到界面。源码实 现:
pBoardWnd->UpdateWindow(); CDC MemDC; // 创建DC MemDC.CreateCompatibleDC( pboardDC); // 内存缓存DC m_BoardBmp.LoadBitmap(IDB_BOARD); // 加载位图 // 选择位图到缓存区 pOldBmp = MemDC.SelectObject(&m_BoardBmp);
void CGui_amazonsDlg::OnTbitem1() { MessageBox("工具栏按钮1, cnt-- ", NULL, MB_OK); mydata.subCnt(); this->DrawBoard(); }
运行结果
3Q
m_Queen.Create(IDB_CHESS, 40, 40, RGB(255,255,255));
(4) 绘制棋子:
pt.x = 60; pt.y = 60; m_Queen.Draw( &MemDC,1,pt,ILD_TRANSPARENT);
事件响应
类向导:右键->class wizard
接下来,就是往对话框中添加组件、绘制漂亮 的图形、添加消息处理、实现用户交互……
添加菜单
新建“菜单”: insert->resource->menu 可以选择new(新建)或import(导入)菜单 编辑“菜单”: 双击菜单项,弹出属性对话框后进行编辑。 注:a) ID的命名,保证唯一性以及规范性;b) 快捷键,如, 对文件选项添加快捷键为F,则Caption为:文件(&F) 加载“菜单”: 鼠标移动到当前对话框,右键属性,Menu项选中你所创建 的菜单的ID。
vc6schap05程序界面设计1
3. 添加消息响应函数
ID_TEST_MESSAGE1DLG OnTestDlgMessage1dlg()
ID_TEST_MESSAGE2DLG OnTestDlgMessage2dlg()
ID_TEST_CONNECT
OnTestConnect()
ID_TEST_BREAK
OnTestBreak()
1. 新建一单文档应用程序Ex05_1 2. 创建菜单
(1)打开IDR_MAINFRAME菜单
(2) 增加菜单:
菜单名:菜单测试
消息对话框1 ID_TEST_MESSAGE1DLG
消息对话框2 ID_TEST_MESSAGE2DLG
连接 ID_TEST_CONNECT
断开
ID_TEST_BREAK vc6schap05程序界面设计1
5.2.3 标准菜单
➢AppWizard自动生成的默认菜单 ➢在默认菜单上增添需要的菜单或删除无用的菜单。
➢ ClassWizard增加消息处理(WM_COMMAND)函数。
On+菜单名
➢ ClassWizard增加更新命令UI消息的处理 (UPDATE_COMMAND_UI)
On+Update+菜单名 vc6schap05程序界面设计1
vc6schap05程序界面设计1
(1)在MainFrm.h头文件中定义 Public: CToolBar m_DrawToolBar;
(2)在MainFrm.cpp实现文件中
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
//载入绘图工具栏
class CEx05_1View : public CView {…
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
用VC++实现FLASH的UI启动画面摘要介绍ActiveX控件在VC++应用程序的使用方法并通过使用Shockwave Flash Object控件实现了FLASH的UI启动画面,开发了一套友好美观的应用程序界面。
关键词VC++,Shockwave Flash Object控件,Flash一、应用概述VC是Microsoft的一个非常好用的C++编程工具,它的最大优势就是有一个对于程序员来说非常实用的MFC(微软基础类库,Microsoft Foundation Class),掌握和运用好MFC将会给C++编程带来非常高的开发效率,因此,大多数的C++程序员都喜欢用VC,不但开发环境友好,而且有强大的MFC支持。
然而,VC的界面设计和时间处理方法非常复杂,很多初学者对于Visual C++ UI设计感到十分的麻烦,无法在有限的时间内设计出美观、用户熟悉的操作界面。
UI即User Interface(用户界面)的简称。
UI设计则是指对软件的人机交互、操作逻辑、界面美观的整体设计。
好的UI设计不仅是让软件变得有个性有品味,还要让软件的操作变得舒适、简单、自由,充分体现软件的定位和特点。
软件界面设计就像工业产品中的工业造型设计一样,是产品的重要买点。
一个友好美观的界面会给人带来舒适的视觉享受,拉近人与电脑的距离,为商家创造卖点。
界面设计不是单纯的美术绘画,它需要定位使用者、使用环境、使用方式并且为最终用户而设计,是纯粹的科学性的艺术设计。
Macromedia公司推出了交互式矢量图和Web 动画的标准——Flash。
在业界,Flash被称为是“最为灵活的前台”,利用Flash可以做出创作出既漂亮又可改变尺寸的导航界面以及其他奇特的效果。
在我们所熟知的Flash应用于站点建设上,它的使用带来了各种优点,如全面的控制、无缝的导向跳转、更丰富的媒体内容、更体贴用户的流畅交互、跨平台和瘦客户端的支持、以及与其它Flash应用方案无缝连接集成等。
而在应用程序开发方面,由于Flash其独特的跨平台特性、灵活的界面控制以及多媒体特性的使用,使得用Flash制作的应用程序具有很强的生命力,在与用户的交流方面具有其它任何方式都无可比拟的优势。
在软件系统界面开发方面,Flash对于界面元素的可控性和它所表达的效果无疑具有很大的诱惑。
对于一个软件系统的界面,Flash所具有的特性完全可以为用户提供一个良好的接口。
本程序主要应用了Shockwave Flash Object控件在VC++下开发FLASH的应用软件UI启动画面。
二、控件简介在基于MFC开发应用程序界面时我们大量使用了Windows标准控件,其实在Windows里,还会常常接触到ActiveX控件,它来源于第三方,而非Windows操作系统。
这样的控件一般来说,功能丰富而且使用方便,从而大大简化了程序员的工作。
本文主要以程序中需要使用到的Flash控件为例细作阐述。
1.控件的注册不同于Windows标准控件,ActiveX控件需要注册才能使用,ActiveX一般以.OCX或者.DLL文件格式发布,可以使用VC附带的工具来注册某个控件,按照以下步骤:在VC的Tools菜单下启动ActiveX Control Test Container;在ActiveX Control Test Container里打开菜单File\Register Controls…;弹出窗口Register Controls显示系统中已注册的所有ActiveX控件,点击左下角的“Register…”按钮;选择待注册的控件文件,如:“C:\WINNT\system32\Macromed\Flash\swflash.ocx”即为Macromedia Flash的ShockwaveFlash控件文件;注册ActiveX控件方法如图1所示:图1 注册ActiveX控件还有一种简单一点的办法,使用regsvr32注册即可,如图2为注册画面:图2 使用regsvr32注册ActiveX控件Shockwave Flash Object控件是一种用于播放Flash动画的IE在插件,基于Microsoft Internet Explorer浏览网页并播放Flash时一般不需要进行额外的Flash播放软件的安装。
这是因为在安装Flash的时候就已经安装到你的系统上了,Flash5.0版本以下的文件名是swflash.ocx,Flash5.0以上版本的名字是Flash.ocx,在系统目录里面应该可以找到:如Windows XP在C:\WINDOWS\system32\Macromed\Flash下有Flash.ocx。
所以我们在本程序的编写过程中并不需要注册这个ActiveX控件。
图3中我们可以看到本系统已经注册了Flash9.0版本。
图3 已经注册了的Flash9.0版本ActiveX控件在VC++ MFC应用程序中引入了Shockwave Flash Object控件并命名后,程序代码中会自动产生CShockwaveFlash类,其框架如图4所示。
图4 CShockwaveFlash的类框架在VC中CShockwaveFlash的常用函数介绍如下:Play()播放动画StopPlay()停止动画IsPlaying()动画是否正在播放(true,false)GotoFrame(frame_number)跳转到某帧(frame_number+1)TotalFrames()获取动画总帧数CurrentFrame()回传当前动画所在帧数-1Rewind()使动画返回第一帧SetZoomRect(left,top,right,buttom)放大指定区域Zoom(percent)改变动画大小Pan(x_position,y_position,unit)使动画在x,y方向上平移PercentLoaded()返回动画被载入的百分比(0-100)LoadMovie(level_number,path)加载动画TGotoFrame(movie_clip,frame_number)movie_clip跳转到指定帧数TGotoLabel(muvie_clip,label_name)movie_clip跳转到指定标签TCurrentFrame(movie_clip)回传movie_clip当前帧-1TCurrentLabel(movie_clip)回传movie_clip当前标签TPlay(movie_clip)播放movie_clipTStopPlay(movie_clip)停止movie_clip的播放GetVariable(variable_name)获取变量SetVariable(variable_name,value)变量赋值TCallFrame(movie_clip,frame_number)call指定帧上的actionTCallLabel(movie_clip,label)call指定标签上的actionTGetProperty(movie_clip,property)获取movie_clip的指定属性TSetProperty(movie_clip,property,number)设置movie_clip的指定属性三、程序实现以及核心代码分析创建一个基于MFC的单文档(SDI)界面的应用程序,名为FlashCover。
创建对话框。
打开资源栏,建立一个新对话框,名称设定为IDD_FLASHCOVER_DIALOG,然后建立该对话框的类CFlashCoverDlg。
添加Shockwave Flash Object控件。
建立对话框应用程序后,在主菜单里选择“工程->添加至工程->components and controls”菜单选项,此时会弹出一个components and controls gallery文件选择对话框,里面有两个文件夹,一个是registered activex controls,一个是Visual C++ Components。
选择第一文件夹后会出现一系列系统上已注册过的activex控件。
在里面选择shockwave flash object,点击insert将它插入工程中。
因为在VC++中插入工程的控件要通过一个类来操作,所以VC++会提示你为这个控件指定一个类名,可以使用默认的类名就行了。
插入后VC++会自动把这个类加入工程里面。
具体步骤如图5、6所示。
图5 添加Shockwave Flash Object控件图6 为Shockwave Flash Object控件类命名在类CFlashCoverDlg的头文件中添加flash控件的头文件:#include "ShockwaveFlash.h"。
然后添加两个成员变量:CString m_FlashFileName; //flash动画的文件名CShockwaveFlash m_flashctrl; // flash控件的对象在类CFlashCoverDlg的实现文件中添加如下代码:CFlashCoverDlg::CFlashCoverDlg(CWnd* pParent /*=NULL*/) : CDialog(CFlashCoverDlg::IDD, pParent){//开始读取封面配置ini文件FILE *p_IniFile;char CoverFileName[80];CString strPath;//获取应用程序所在路径being//定义文件路径缓冲区TCHAR strCurDrt[_MAX_PATH];//获取文件路径::GetModuleFileName(NULL,strCurDrt,_MAX_PATH);char* p = strCurDrt;while(strchr(p,'\\')){p = strchr(p,'\\');p++;}*p = '\0';strPath = strCurDrt;//获取应用程序所在路径End//获取封面配置文件CString strIniPath = strPath + "Config\\FlashCover.ini";//判断封面配置文件是否存在if((p_IniFile = fopen(strIniPath,"r")) == NULL){AfxMessageBox("Faile to Open File!");return;}else{while(!feof(p_IniFile)){//读取配置文件内容fscanf(p_IniFile,"%s",CoverFileName);}}fclose(p_IniFile);//读取封面配置ini文件结束//将片头flash文件用播放对话框的成员变量来表示,为以后实现更换不同片头做准备m_FlashFileName = CoverFileName;}用类向导生成CFlashCoverDlg的ON_WM_INITDIALOG消息处理函数OnInitDialog,并添加如下代码:BOOL CFlashCoverDlg::OnInitDialog(){CDialog::OnInitDialog();//获取屏幕的宽和高int CX=::GetSystemMetrics(SM_CXSCREEN);int CY=::GetSystemMetrics(SM_CYSCREEN);//建立FLASH播放的窗口矩形CRect rect(0,0,CX,CY);::MoveWindow(GetSafeHwnd(),0,0,CX,CY,TRUE);GetClientRect(&rect);m_flashctrl.Create("FlashCover",WS_POPUP|WS_VISIBLE,rect,this,ID_FLASHWIN,NULL,FALSE,NULL);char szCurPath[_MAX_PATH];HINSTANCE hInst=NULL;GetModuleFileName(hInst,szCurPath,_MAX_PATH);char* p = szCurPath;while(strchr(p,'\\')){p = strchr(p,'\\');p++;}*p = '\0';CString strFilename = szCurPath;// 获取播放FLASH文件名strFilename += "flash\\"+m_FlashFileName;//播放FLASH动画m_flashctrl.SetMovie(strFilename);return TRUE;}在类CFlashCover的头文件中添加如下头文件:#include "FlashCoverDlg.h"//建立flash启动封面对话框变量CFlashCoverDlg flashDlg;//建立FLASH窗口启动标志BOOL nFlag;然后在CFlashCover的实现文件中的InitInstance函数中添加如下代码:BOOL CFlashCoverApp::InitInstance(){…//增加flash启动封面nFlag=TRUE;flashDlg.DoModal();SetRegistryKey(_T("计算机学院"));LoadStdProfileSettings(4); // 加载标准INI 文件选项(包括MRU)…}用类向导生成CFlashCoverApp的消息处理函数PreTranslateMessage。