最近学习flex4,就做了一个和QQ一样的窗体,实现了最大化 最小化 关闭 拖动改变大小,在这里记录下来,要是以后要用也可以在这里来查,本人属于flex4新手,有什么地方写的不好的请大家指出来,也好有所改进。
这个窗体的实际大小是比看到的要大 ,只是它被隐藏到了,显示出来的只是一个id叫main的 group
而这个group又被分成了两部分:标题部分(id = windowTitle)和内容部分(id = content).
要添加内容都加到这两个部分。
窗体中还有三个button,是用来拖动控制窗体的bottomHButton(//下边的button) resizeButton (//右下角) rightVButton(//窗口右边的button)
<?xml version="1.0" encoding="utf-8"?>
<s:Window xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:button="components.button.*"
creationComplete="initComplete(event)"
showStatusBar="false"
systemChrome="none"
transparent="true"
width="900"
height="700"
mouseDown="startMoveWindow(event)"
skinClass="skin.window.ApplicationSkin"
>
<fx:Declarations>
<!-- 将非可视元素(例如服务、值对象)放在此处 -->
</fx:Declarations>
<fx:Script>
<![CDATA[
///import 省略
//窗口的菜单项
private var _titleText:String = "";
[Bindable]
private var _windowWidth:Number = 400;
[Bindable]
private var _windowHeight:Number = 300;
private var _controlButtons:ArrayList = new ArrayList();
[Embed(source="images/cursor/leftRight.png")]
public var leftRight:Class;
[Embed(source="images/cursor/leftTop.png")]
public var leftTop:Class;
[Embed(source="images/cursor/bottomTop.png")]
public var bottomTop:Class;
//控制窗口是不是可以resize
private var _isResize:Boolean = true;
//光标的id
private var buttonOverId:Number = 0;
private var buttonDownId:Number = 0;
//原来的坐标位置
private var oPoint:Point = new Point;
//新坐标的位置
private var nPoint:Point = new Point;
private var _mW:Number = 300;
private var _mH:Number = 300;
//窗体周围的button
private var resizeButton:Button;
private var bottomHButton:Button;
private var rightVButton:Button;
//用来判断窗体周围的哪个下button被按下
private var flag:String;
/*移动窗口*/
protected function startMoveWindow(event:MouseEvent):void
{
this.nativeWindow.startMove();
}
//添加控制按键
public function addWindowControlButton(button:Button,index:int):void{
controlButtons.addItemAt(button,index);
}
protected function initComplete(event:FlexEvent):void
{
//把controlButtons中的buttons取出来 放到Group control上
for(var i:int=0;i<controlButtons.length;i++){
control.addElement(controlButtons.getItemAt(i) as Button);
}
if(_isResize){
//窗口可以改变大小 resize
addResizeButtons();
}
}
private function addResizeButtons():void{
//窗口右边的button
rightVButton = new Button;
rightVButton.right = 0;
rightVButton.verticalCenter = 0;
rightVButton.width = 4;
rightVButton.percentHeight = 98;
rightVButton.setStyle("skinClass",skin.button.VerticalButton);
rightVButton.setStyle("skinClass",skin.button.HorizontalButton);
rightVButton.addEventListener(MouseEvent.MOUSE_DOWN,rightVButtonDown);
rightVButton.addEventListener(MouseEvent.MOUSE_OVER,buttonOver)
rightVButton.addEventListener(MouseEvent.MOUSE_OUT,buttonOut);
//下边的button
bottomHButton = new Button;
bottomHButton.bottom = 0;
bottomHButton.horizontalCenter = 0;
bottomHButton.percentWidth = 98;
bottomHButton.height = 4;
bottomHButton.setStyle("skinClass",skin.button.HorizontalButton);
bottomHButton.addEventListener(MouseEvent.MOUSE_DOWN,bottomHButtonDown);
bottomHButton.addEventListener(MouseEvent.MOUSE_OVER,buttonOver)
bottomHButton.addEventListener(MouseEvent.MOUSE_OUT,buttonOut);
//右下角
resizeButton = new Button;
resizeButton.right = 0;
resizeButton.bottom = 0;
resizeButton.setStyle("skinClass",skin.button.RightBottomButtonSkin);
resizeButton.width = 14;
resizeButton.height = 14;
resizeButton.addEventListener(MouseEvent.MOUSE_DOWN,resizeButtonDown);
resizeButton.addEventListener(MouseEvent.MOUSE_OVER,buttonOver)
resizeButton.addEventListener(MouseEvent.MOUSE_OUT,buttonOut);
main.addElement(resizeButton);
main.addElement(rightVButton);
main.addElement(bottomHButton);
}
protected function resizeButtonDown(event:MouseEvent):void
{
// 右下角button的鼠标按下事件
event.stopPropagation();
flag = "rightBottom";
resizeDown(this.leftTop);
}
protected function bottomHButtonDown(event:MouseEvent):void
{
// 下边button donw 事件
event.stopPropagation();
flag = "bottomHButton";
resizeDown(this.bottomTop);
}
protected function rightVButtonDown(event:MouseEvent):void
{
// 右边的button down事件
event.stopPropagation();
flag = "rightVButton";
resizeDown(this.leftRight);
}
protected function buttonOver(event:MouseEvent):void
{
switch(event.target)
{
case resizeButton:
//右下角
// 左下图标 鼠标浮动事件
buttonOverId = (event.target as Button).cursorManager.setCursor(this.leftTop,2,-20,-20);
break;
case bottomHButton:
//右下角
// 左下图标 鼠标浮动事件
buttonOverId = (event.target as Button).cursorManager.setCursor(this.bottomTop,2,-20,-20);
break;
case rightVButton:
buttonOverId = (event.target as Button).cursorManager.setCursor(this.leftRight,2,-20,-20);
break;
}
}
private function resizeDown(cursor:Class):void{
// 鼠标按下的事件
this.parent.addEventListener(MouseEvent.MOUSE_MOVE, resizeWindowMoveHandler);
this.parent.addEventListener(MouseEvent.MOUSE_UP, resizeWindowUpHandler);
//设置在parentWindow下的光标样式
buttonDownId = this.cursorManager.setCursor(cursor,2,-20,-20);
oPoint.x = mouseX;
oPoint.y = mouseY;
oPoint = this.localToGlobal(oPoint);
}
protected function resizeWindowMoveHandler(event:MouseEvent):void
{
// 改变窗体大小的移动事件
// 移动splitButton 来改变显示区域的大小
nPoint.x = mouseX;
nPoint.y = mouseY;
nPoint = this.localToGlobal(nPoint);
var xPlus:Number = nPoint.x - this.oPoint.x;
var yPlus:Number = nPoint.y - this.oPoint.y;
switch(flag)
{
case "rightBottom":
if (this.windowWidth + xPlus > this.mW) {
this.width = this.width + xPlus;
this.windowWidth = this.windowWidth + xPlus;
}
if (this.windowHeight + yPlus > this.mH) {
this.height = this.height + yPlus;
this.windowHeight = this.windowHeight + yPlus;
}
break;
case "bottomHButton":
if (this.windowHeight + yPlus > this.mH) {
this.height = this.height + yPlus;
this.windowHeight = this.windowHeight + yPlus;
}
break;
case "rightVButton":
if (this.windowWidth + xPlus > this.mW) {
this.width = this.width + xPlus;
this.windowWidth = this.windowWidth + xPlus;
}
break;
}
oPoint.x = mouseX;
oPoint.y = mouseY;
oPoint = this.localToGlobal(oPoint);
}
protected function resizeWindowUpHandler(event:MouseEvent):void
{
// 鼠标弹起事件
// 移除绑定的事件 和 光标样式
this.parent.removeEventListener(MouseEvent.MOUSE_MOVE, resizeWindowMoveHandler);
this.parent.removeEventListener(MouseEvent.MOUSE_UP, resizeWindowUpHandler);
this.cursorManager.removeCursor(this.buttonDownId);
}
protected function buttonOut(event:MouseEvent):void
{
// 鼠标移开事件
(event.target as Button).cursorManager.removeCursor(buttonOverId);
}
//get set方法省略
]]>
</fx:Script>
<s:Group id="main" width="{_windowWidth}" height="{_windowHeight}" horizontalCenter="0" top="8">
<!-- 设置边框 --><!-- 设置圆角 -->
<s:Rect left="0" right="0" top="0" bottom="0" radiusX="5" radiusY="5">
<s:stroke>
<s:SolidColorStroke color="#3A4B5E"/>
</s:stroke>
<s:fill>
<s:SolidColor color="#84A8CE"/>
</s:fill>
</s:Rect>
<!-- 设置背景图片 -->
<s:Group width="100%" height="100%" minWidth="0" minHeight="0">
<s:layout>
<s:VerticalLayout paddingBottom="2" paddingLeft="2" paddingRight="2" paddingTop="2"/>
</s:layout>
<s:BitmapImage width="100%" height="100%" alpha="1" source="images/login.jpg"/>
</s:Group>
<s:VGroup width="100%" height="100%" gap="0">
<!-- 标题部分 -->
<s:Group id="windowTitle"
width="100%">
<s:Group id="titleToolbar">
</s:Group>
<s:HGroup id="control" gap="0"
right="1">
</s:HGroup>
</s:Group>
<!-- 主要的内容部分 -->
<s:Group id="content"
width="100%" height="100%">
</s:Group>
</s:VGroup>
</s:Group>
</s:Window>
下面说下怎么用这个窗体:
var lw:SimpleWindow = new SimpleWindow;
var quit:QuitButton = new QuitButton;
var min:MinButton = new MinButton();
var max:MaxButton = new MaxButton;
max.simpleWindow = lw;
lw.addWindowControlButton(min,0);
lw.addWindowControlButton(max,1);
lw.addWindowControlButton(quit,2);
lw.open();
上面有三个button 是最大化 最小化 关闭 ,最小化也可以到托盘,不过要设置一个属性值(_isSystemTray),这是个boolean类型 。 具体看代码。
上面用的到组件皮肤都在附件中,最大化 最小化 关闭的皮肤可以合并使用一个,在皮肤中可以用getStyle方法来得到 相应的图片,就可以合并了,我这里就不想改了。
- 大小: 438.4 KB
- 大小: 589.6 KB
- 大小: 446.2 KB
- 大小: 819.3 KB
分享到:
相关推荐
在标题“flex panel窗体有最小化最大化关闭”中,我们关注的是Flex Panel的基本功能,即允许用户最小化、最大化和关闭窗体,同时窗体还具有可移动性。 1. **Flex Panel组件**:Flex Panel是Flex SDK中的一个基础...
"flex最大化最小化关闭"这个标题指的是如何在Flex4环境下为窗体添加最大化、最小化和关闭的功能。下面将详细介绍如何实现这些功能。 1. **Flex4 Window基础知识**: Flex4引入了Spark组件库,其中`s:Window`和`s:...
总结来说,这个Flex项目展示了如何创建一个功能丰富的TitleWindow,它包含最大化、最小化按钮,并且支持用户通过拖动来调整窗口大小。这个TitleWindow的实现涉及ActionScript 3编程,事件监听,以及对Flex容器特性的...
TitleWindow是Flex中的一种容器类,它类似于操作系统中的窗口,通常包含一个标题栏,可以显示标题,并提供一些基本操作,如关闭、最小化、最大化和还原。在本例中,我们讨论的是一个自定义的TitleWindow组件,它增加...
在Flex编程中,一个常见的需求是为用户界面的组件,如Panel,提供基本的窗口操作功能,包括最小化、最大化和关闭。这个资源的主题就是针对Flex Panel进行的增强,解决了原生面板在这些功能上存在的问题,并且加入了...
ResizableTitleWindow这个名字暗示了这个组件不仅支持预设的最大化、最小化和关闭操作,还可能支持用户手动拖动边框来改变窗口大小。这样的功能通常需要用到鼠标拖动事件和实时计算新的窗口尺寸,以确保内容能够适配...
在本文中,我们将深入探讨如何使用Flex组件实现放大、缩小、拖动、最大化和最小化功能,这些都是现代Web应用中常见的交互元素。 首先,让我们理解Flex的基础概念。在CSS中,Flex布局(Flexible Box Layout)允许...
"flex 窗体拖拽,可以自由拖拽,最大化,最小化等等"这一主题涉及到Flex中如何实现窗口的各种动态操作,包括但不限于窗体的移动、大小调整、最大化与最小化的功能。以下是对这些知识点的详细说明: 1. **窗体拖拽**...
本教程将详细讲解如何使用Flex来实现窗口的拖拽、最大化、最小化以及关闭功能,这些都是构建交互式用户界面的重要元素。 首先,让我们了解Flex的基本概念。Flex布局允许开发者对容器内的子元素进行灵活的排版,通过...
在Flex编程中,TitleWindow是一种常用的组件,它用于创建具有标题栏、关闭、最小化和最大化按钮的标准窗口样式。在Flex应用中,我们可能需要对TitleWindow的行为进行自定义,例如改变其默认的最大化和最小化功能。本...
在Flex中,我们可以使用`scaleX`和`scaleY`属性来改变组件的缩放比例。 在模拟地图中,限制拖动范围是确保用户体验的重要部分。这通常通过设置边界条件来实现。在每次更新组件位置时,我们需要检查新位置是否超出...
标题中的“flex 多图 最小化 任务栏 最大化布局”涉及到的是前端开发中的Flex布局技术,特别是在处理多图像展示以及窗口最大化和最小化时的布局优化问题。Flex布局是CSS3的一种布局模式,它允许容器动态调整其子元素...
这些组件提供了基本的窗口功能,如标题、关闭按钮、拖动以及调整大小的能力。在Flex中,你可以通过MXML或者ActionScript来定义和控制这些属性。 1. **窗口拖动**:在Flex中,`MX:Window`组件默认具有拖动功能。当...
flex4舞台尺寸随浏览器窗口大小改变.rar
在Flex开发中,创建和管理窗口是常见的任务。"flex弹出另一个窗体"这个话题主要涉及如何在Flex应用程序中动态...记得根据实际需求调整代码,以确保良好的用户体验,比如调整新窗体的位置、大小以及是否允许用户拖动等。
在Flex开发中,窗体间的通信是至关重要的,特别是在构建复杂的应用程序时,需要不同组件之间共享数据和状态。本文将详细阐述如何在Flex中实现父窗体与子窗体之间的数据传输,以及如何在子窗体数据变化时更新父窗体的...
在图片拖动的场景中,我们可以将图片作为一个flex项目,利用flexbox的特性来调整图片的位置和尺寸。 图片画线则可能涉及SVG(Scalable Vector Graphics)技术。SVG是一种基于XML的矢量图像格式,它可以被用来创建可...
标题中的“带最小化、最大化、关闭按钮的titlewindow”指的是开发者为了提高用户体验,对原有的TitleWindow组件进行了自定义扩展,添加了这些常用的窗口操作功能。这在ActionScript或Flex等技术中是常见的做法,因为...
4. **百分比尺寸和约束布局**:在设计界面时,使用百分比尺寸和约束布局可以使组件随窗口大小变化而自动调整大小。例如,可以设置组件的宽度和高度为相对于其父容器的百分比,这样当界面最大化时,组件也会相应地...