`
skandhas
  • 浏览: 35802 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

纯Ruby创建Win32窗口

    博客分类:
  • Ruby
阅读更多

前言

所谓纯Ruby是指只用Ruby代码调用API来创建出一个窗口。本文的例子使用了windows-pr和CStruct。 不熟悉的童鞋可以先看这篇文章:在Ruby中方便的调用Win32 API(使用windos-pr和CStruct) : 这里 这里

本文并不鼓励直接用API来做GUI程序,而是想借这个例子说明在Windows下, Ruby除了本身的强大之外,还可以很方便的使用API,充分利用Windows的资源,用来做Windows系统管理的脚本也是很方便的。

正文

win32的相关东东就不做普及了,相信大家都已很熟了。本文的例子就是创建一个窗口,显示一幅图片而已。具体请看源码。下面大体说说几个方法:

1. main

main方法创建一个窗口,并开始消息循环。创建窗口的具体工作是create_window来做的。
def main
   msg = MSG.new
   instance = GetModuleHandle 0
   create_window instance,SW_SHOW

   # message loop
   while( GetMessage( msg.data, 0, 0, 0 ))
     DispatchMessage( msg.data )
   end
end 
 

2.create_window

create_window 方法是创建窗口,里面调用了RegisterClass,CreateWindowEx,ShowWindow,UpdateWindow。熟悉win32的童鞋一看便知。
def create_window instance, cmd_show

   @ico_handle = LoadImageA(instance,"ruby.ico",IMAGE_ICON,16,16,LR_DEFAULTCOLOR|LR_LOADFROMFILE)
   @bk_bmp_handle = LoadImageA(instance,"ruby.bmp",IMAGE_BITMAP,299,299,LR_LOADFROMFILE)

   wc = WNDCLASSA.new
   wc.style = 0
   wc.lpfnWndProc = @window_proc.address
   wc.cbClsExtra = 0
   wc.cbWndExtra = 0
   wc.hInstance = instance
   wc.hIcon = @ico_handle
   wc.hCursor = 0
   wc.hbrBackground = (COLOR_WINDOW+1)
   wc.lpszMenuName = 0
   wc.lpszClassName = alloc_ansi_string_buffer 'MyWindowClass',256

   atom = RegisterClassA(wc.data)
   atom &=0x0000ffff
   return if atom == 0

   windows_style = WS_OVERLAPPEDWINDOW
   hwnd = CreateWindowEx(0,atom,"Pure Ruby Window", windows_style, 100, 100, 360,360, 0, 0, instance, 0)

   ShowWindow(hwnd, cmd_show)
   UpdateWindow(hwnd)

end 
 

3.window_proc

一个Win32 GUI程序当然少不了窗口过程函数,window_proc即是。就和用C写为Win32 GUI程序一样,只处理相关消息就可。本文示例处理了WM_PAINT消息,主要工作就是显示图片啦。

@window_proc = API::Callback.new('LLLL','I')do |hwnd, msg,wparam,lparam|
   ret = 0
   case msg
   when WM_PAINT
     ps = PAINTSTRUCT.new
     hdc = BeginPaint(hwnd, ps.data)
     mem_dc = CreateCompatibleDC(0)
     SelectObject(mem_dc,@bk_bmp_handle)
     BitBlt(hdc,20,20,299,299,mem_dc,0,0,SRCCOPY)
     EndPaint(hwnd, ps.data)
     DeleteDC(mem_dc)
   when WM_DESTROY
     PostQuitMessage 0
   else
     ret = DefWindowProc(hwnd,msg,wparam,lparam);
   end
   ret
end 
 

运行效果

示例代码的运行效果如下:


补充

之所以使用windows-pr,是因为它太方便了。但是也有一些函数和常量没有定义,所以在本例的代码中,需要自己动手定义。 还有一些Win32的结构体,需要用CStruct来定义。 另外,CStruct的Win32Struct也有几个类型没有定义,我扩充了一下。具体请参考源码。

下载

代码下载地址:pure_ruby_window.rar

结束

本文技术上无啥含量,众看官姑且看之吧。

 

1
0
分享到:
评论
1 楼 sevk 2010-11-27  
太方便了, 太智能了.

相关推荐

    win32ole mapi开发

    在Ruby编程中,利用`Win32OLE`库可以创建一个与Outlook的连接,执行诸如读取、编写和发送邮件,管理联系人,甚至控制Outlook窗口等任务。 文件列表中的几个`.mht`文件很可能包含了使用Ruby论坛中讨论的关于这些主题...

    fxruby:FXRuby 是 Ruby 的扩展模块,提供 FOX GUI 工具包的接口

    特点: FXRuby 支持 FOX 的一切,这在 Ruby 中很有用: MDI/SDI 应用程序窗口布局、浮动工具栏丰富的控件集(表格、图像列表、菜单、画布等) 灵活的布局管理多种格式的图像读/写支持通过 gem 嵌入 OpenGL 图形线程...

    memcached-win32

    Memcached-win32是一款专为Windows系统设计的内存对象缓存系统,它是Memcached的Windows移植版本。Memcached是一款高性能、分布式内存缓存系统,广泛应用于Web应用中以减轻数据库负载,提高数据访问速度。本安装包...

    ruby tk gem

    它基于Tcl/Tk库,允许开发者使用Ruby语法创建各种窗口、按钮、文本框等交互元素,为应用程序添加可视化功能。在Ruby 1.9版本中,安装这个gem可能会遇到一些特定的挑战,因此我们将详细讨论如何在Ruby 1.9环境下正确...

    ruby_on_rails&radrails环境配置.pdf

    - 安装完成后,在命令提示符窗口中输入`ruby -v`验证安装情况,如果输出类似`ruby 1.8.5`的信息,则表示安装成功。 - 检查环境变量PATH中是否包含Ruby的bin目录路径,如`D:\ruby\bin`。 #### 三、安装Rails ...

    完整版调用系统关于窗口.rar

    在Windows操作系统中,我们可以使用Win32 API函数来打开系统关于对话框。`ShellExecute()`函数是其中一个方法,可以用来执行这个操作。例如,在C++中,你可以这样写: ```cpp ShellExecute(NULL, "runas", "run...

    GTK for Windows

    在Windows上安装GTK,通常需要下载对应版本的GTK for Windows发行版,例如GTK4Win32。这个发行版包含了运行GTK应用所需的动态链接库、头文件和开发工具。安装过程相对简单,只需按照安装向导的指示操作即可。安装...

    chromedriver-win64_119.0.6029.0.zip

    【压缩包子文件的文件名称列表】中的"chromedriver-win64" 文件表示这个压缩包解压后包含的是适用于64位Windows系统的ChromeDriver可执行文件。通常,解压后,这个文件可以直接放在系统路径下,或者在运行Selenium...

    windows下安装jekyll

    3),在打开的记事本窗口中,于末尾添加新的一行- C:\Ruby200-x64,保存文件并退出。 4),回到命令行窗口内,审查(非必须)并安装。 ruby dk.rb review ruby dk.rb install 具体来说,步骤如下 1.下载证书。有...

    chromedriver-win64_127.0.6510.4.zip

    标题中的"chromedriver-win64_127.0.6510.4.zip"表明这是一个用于Windows 64位系统的Chrome浏览器自动化测试工具——ChromeDriver的版本127.0.6510.4的压缩包文件。ChromeDriver是Google Chrome浏览器的一个配套程序...

    chromedriver-win64_121.0.6130.0.zip

    2. 处理窗口和弹出框:最大化窗口,切换窗口或框架。 3. 控制浏览器导航:前进、后退、刷新页面,跳转到特定 URL。 4. 处理 cookies 和本地存储:添加、删除、读取 cookies。 5. JavaScript 执行:执行自定义的 ...

    chromedriver-win64_121.0.6102.0.zip

    3. **编程语言集成**:Selenium WebDriver 支持多种编程语言,包括 Java、Python、C#、Ruby 和 JavaScript 等。你需要根据你的项目需求选择合适的语言,并引入相应的 WebDriver 库。 4. **启动 ChromeDriver**:在...

    chromedriver-win64_117.0.5938.35.zip

    2. **自动化测试**:在Selenium测试脚本中,通过创建`RemoteWebDriver`实例,并指定ChromeDriver的URL,可以启动一个新的Chrome浏览器实例。然后,你可以使用Selenium的API来操纵这个浏览器,比如`driver.get(url)`...

    chromedriver-win64_126.0.6460.0.zip

    Selenium WebDriver 是一种接口,允许编程方式控制浏览器进行自动化测试,适用于多种编程语言,包括 Java、Python、C# 和 Ruby 等。ChromeDriver 与 Chrome 浏览器交互,执行诸如点击按钮、填写表单、导航网页等操作...

    chromedriver-win64_123.0.6269.2.zip

    5. **自动化测试脚本**:使用 ChromeDriver 进行自动化测试,首先需要创建一个 WebDriver 实例,然后设置浏览器选项,比如禁用弹出窗口、设置用户代理等。接着,通过 WebDriver 的方法来导航到网页、执行 JavaScript...

    chromedriver-win64_118.0.5959.0.zip

    4. 捕获网页快照:可以截取当前浏览器窗口的屏幕截图。 5. 支持多种编程语言:Java、Python、C#、Ruby 等。 三、ChromeDriver 安装与配置 1. 下载:访问 ChromeDriver 的官方网站 ...

Global site tag (gtag.js) - Google Analytics