一个简单图形界面框架XYGui的设计与实现 (一)

(同步个人博客http://sxysxy.org/blogs/67 到csdn..)

前传

和dram神犇做了个交♂易,我来发布一些关于制作一个Gui库的教程。借用林则徐的两句名言来描述我现在的心情:(这里省略14个字)

简介

这里我以半年多前我开坑的 XYGui 为讲解的对象。XYGui是一个几乎完全使用ruby语言开发的,简洁快速的,支持opengl等高级功能的Gui框架,是我学OI颓废之时抽空制作的….

你需要准备:

windows系统,ruby 2.x(32位),devkit for ruby(ruby需要的这些东西都可以在 这里 下载到)+不怕折腾的强大内心。

先说点别的

  • 为什么我要做这个gui库

受不了tk难看的界面和低下的执行效率(在windows下),受不了fxruby非native的界面与对中文不良好的支持(fxruby编码的问题好像在win和Linux上都有)…(为此甚至我都与fxruby维护者要撕起来啦(x))。希望有一个自己高度理解,掌握的gui库(这样我就能快速开发出图形界面应用)。于是我一怒之下就自己写了个(x

  • 为什么选择ruby语言

除了作为我编程语言上的”母语”所带来的的特殊感情外,还有这样的原因: (就我所言) 优美的函数式编程的支持(之后泥萌将会看到,XYGui的example代码充满函数式的倾向);成熟的技术(在制作这个gui库之前,我向兰兰姐姐(泥萌说的”花姐”)学到了ruby与机器语言互相调用的姿势);想搞”大”新闻的心思(hh)

准备发车

配好环境,我们先来一发ruby调用windows api函数创建窗口的程序(注意请使用32位ruby解释器!,64位的解决办法我以后会给出)

假设你是会用一点ruby的,也会些windows api,那么复制下面的代码,到window_test.rb,执行它。代码看起来还让人觉得很麻烦呢。

require 'win32api'

TITLE = "Window_Test"  #窗口标题
CLASS_NAME = "Window_Test_Class"  #窗口类

# API 
def callAPI(dll, procname, *arg)
    Win32API.new(dll, procname, arg.map{|e| e.is_a?(String)? "p":"L"}.join, "L").call *arg
end

#prepare
hInstance = callAPI("kernel32", "GetModuleHandle", 0)
DefProc = callAPI("kernel32", "GetProcAddress", callAPI("kernel32", "GetModuleHandle", "user32"), "DefWindowProcA")

#window class
wndclass = [0, DefProc, #lpfnWndProc
    0, 0, hInstance,
    callAPI("user32", "LoadIcon", hInstance, 32512), #Icon
    callAPI("user32", "LoadCursor", 0, 32512), #IDC_ARROW
    6, #COLOR_WINDOW_FRAME
    0, CLASS_NAME].pack("LLLLLLLLLp")

if callAPI("user32", "RegisterClass", wndclass) == 0
    callAPI("user32", "MessageBox", 0, "Window class Error", "Error", 0)
    exit 
end

hWnd = callAPI("user32", "CreateWindowEx", 0, CLASS_NAME, TITLE,
        0xcf0000 | 0x10000000, #WS_OVERLAPPEDWINDOW | WS_VISIBLE
        100, 100, 400, 300, 0, 0, hInstance, 0)

msg = "\0"*28 #MSG
while callAPI("user32", "GetMessage", msg, 0, 0, 0) 
    callAPI("user32", "TranslateMessage", msg)
    callAPI("user32", "DispatchMessage", msg)
end

不出意外的话,会出现这样一个窗口

能拖拽,缩放。但是如果你是在命令行里面启动这个脚本的话,点击窗口右上角的x,然后会发现其实脚本并没有退出,因为我们是并没有处理按下x退出这样的事件的。。。所以只是关掉了窗口,程序并没有退出。但是至少窗口出来了!

但是

显然你是不希望每次都要写那么多的,你是希望能够把它封装起来,成为Gui库。好我当然会继续讲的….

第(一)节就到这里啦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,我可以为您介绍一种使用工厂方法设计模式的图形编辑系统。 首先,我们需要定义一个图形接口,包含绘制和移动两个方法: ```java public interface Shape { void draw(); void move(int x, int y); } ``` 然后,我们可以定义具体的图形类,如矩形和圆形: ```java public class Rectangle implements Shape { @Override public void draw() { System.out.println("Drawing a rectangle"); } @Override public void move(int x, int y) { System.out.println("Moving a rectangle to (" + x + ", " + y + ")"); } } public class Circle implements Shape { @Override public void draw() { System.out.println("Drawing a circle"); } @Override public void move(int x, int y) { System.out.println("Moving a circle to (" + x + ", " + y + ")"); } } ``` 接下来,我们可以使用工厂方法模式来创建这些图形对象。我们可以定义一个工厂接口,用于创建图形对象: ```java public interface ShapeFactory { Shape createShape(); } ``` 然后,我们可以实现具体的工厂类,用于创建特定的图形对象: ```java public class RectangleFactory implements ShapeFactory { @Override public Shape createShape() { return new Rectangle(); } } public class CircleFactory implements ShapeFactory { @Override public Shape createShape() { return new Circle(); } } ``` 使用时,我们可以根据需要创建不同的工厂对象,然后使用工厂对象创建相应的图形对象: ```java ShapeFactory rectFactory = new RectangleFactory(); ShapeFactory circleFactory = new CircleFactory(); Shape rect = rectFactory.createShape(); Shape circle = circleFactory.createShape(); rect.draw(); circle.draw(); rect.move(100, 100); circle.move(200, 200); ``` 这样我们就可以通过工厂方法模式创建和操作不同的图形对象了。 ### 回答2: 图形编辑系统是一种用于创建、编辑和操作图形对象的软件工具。设计模式是一种解决常见软件设计问题的经验总结,可以提高系统的可维护性、可扩展性和可复用性。 在设计图形编辑系统时,可以使用以下几种设计模式: 1. 单例模式:使用单例模式可以确保系统中只有一个图形编辑器实例。这样可以避免多个编辑器之间的数据冲突,并方便全局访问。 2. 工厂模式:使用工厂模式可以方便地创建不同类型的图形对象,如:圆形、矩形、三角形等。每个对象可以有各自的绘制方法和属性。 3. 命令模式:使用命令模式可以将用户的操作封装成一个命令对象,并将其添加到命令队列中。通过执行命令队列,可以实现撤销、重做、保存等功能。 4. 观察者模式:使用观察者模式可以在图形对象发生变化时通知其他相关的对象。例如,当一个图形对象的位置改变时,可以通知其他对象更新其显示状态。 5. 组合模式:使用组合模式可以将多个图形对象组合成一个复合图形。这样可以方便地对整个复合图形进行操作,如移动、旋转、缩放等。 6. 策略模式:使用策略模式可以动态地切换图形对象的绘制算法。例如,可以使用不同的算法实现线条的绘制,如直线绘制、曲线绘制等。 通过综合运用以上设计模式,我们可以设计实现一个简单而功能完善的图形编辑系统。用户可以通过系统界面创建、编辑和删除各种类型的图形对象,并通过系统提供的工具栏实现绘制、选择、编辑等操作。系统还可以提供图形对象的导入和导出功能,方便用户保存和分享自己的作品。通过良好的设计实现图形编辑系统可以提供友好的用户体验,并方便用户进行各种图形操作和设计。 ### 回答3: 图形编辑系统是一种常见的软件,它允许用户创建、编辑和操作各种图形对象。为了提高系统的可扩展性和可重用性,我们可以使用设计模式来设计实现这样一个简单图形编辑系统。 首先,我们可以使用工厂模式来创建不同类型的图形对象。通过定义一个抽象图形类和多个具体图形子类,每个子类实现自己的显示和编辑方法,然后使用一个工厂类通过传入不同的参数来创建具体的图形对象。 其次,我们可以使用观察者模式来实现图形编辑系统的事件处理机制。定义一个抽象的观察者接口和一个主题类,主题类维护一个观察者列表,并在发生改变时通知观察者。例如,当用户操作某个图形对象时,主题类可以通知所有观察者进行相应的处理。 另外,我们可以使用命令模式来实现撤销和重做的功能。定义一个抽象命令类和多个具体命令子类,每个子类实现自己的执行和撤销方法。然后,图形编辑系统可以维护一个命令历史记录,记录用户的操作命令,以便可以撤销或重做这些命令。 此外,我们还可以使用装饰器模式来扩展图形对象的功能。定义一个抽象装饰器类和多个具体装饰器子类,每个子类可以在原有功能的基础上添加一些额外的功能。例如,我们可以为图形对象添加颜色、边框等装饰器。 最后,我们可以使用组合模式来实现图形对象的层级结构。定义一个抽象图形组件类和多个具体图形组件子类,每个子类可以实现自己的绘制和操作方法。然后,图形组件可以通过组合的方式形成一个树状结构,使得用户可以进行组合和分解操作。 通过利用设计模式,我们可以设计实现一个简单但具有高扩展性和可重用性的图形编辑系统。这些设计模式可以帮助我们解决一些常见的问题,并且使系统更加灵活和易于维护。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值