设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2361|回复: 7
打印 上一主题 下一主题

[已经解决] 关于win32api的createwindow的问题

[复制链接]

Lv4.逐梦者

梦石
0
星屑
13559
在线时间
2753 小时
注册时间
2014-10-4
帖子
756

R考场第七期纪念奖

1
发表于 2020-2-16 19:55:26 | 显示全部楼层
本帖最后由 SixRC 于 2020-2-16 20:01 编辑

首先 CreateWindow 并非这个api的真名 大多数api都分 A(ansi) 和 W(unicode) 两个版本
用哪个版本要基于你传入参数是什么编码的 纯英文就用A 因为 RM 好像是 utf-8 和 ansi 在英文区域不冲突的
然后这个api有点特殊。。
"CreateWindow is implemented as a call to the CreateWindowEx function, as shown below."
C 代码复制
  1. #define CreateWindowA(lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)\
  2. CreateWindowExA(0L, lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)
  3.  
  4. #define CreateWindowW(lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)\
  5. CreateWindowExW(0L, lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)
  6.  
  7. #ifdef UNICODE
  8. #define CreateWindow  CreateWindowW
  9. #else
  10. #define CreateWindow  CreateWindowA
  11. #endif

所以其实你需要调用的是 CreateWindowExA
其实Win32API 能否取到api只和api名字是否正确有关  后面的和传参相关 不对程序可能崩掉
然后看参数
CreateWindowExA
RM是32位的 32位传参 int 就是 long  DWORD 是 unsigned long 用 L 吧(其实 l 也没事的)
句柄 HANDLE 是 void* 其实也是 l
l的意义是原值传入 p的意义是把ruby字符串的地址传入
也可以都写 l 字符串传入 [str].pack("p").unpack("l")[0] 就行
所以我们有 依次 LppLllllllll
RUBY 代码复制
  1. c=Win32API.new("user32","CreateWindowExA","LppLllllllll","l")
  2. p c.call(0,"Button","hi",0x10000000 | 0x00040000,400,400,250,150,0,0,0x400000,0)

假如有些参数需要指向结构体 你需要利用ruby字符串来建构它 会稍微麻烦一点
大概就是这样

评分

参与人数 2星屑 +200 +1 收起 理由
正太君 + 200 认可答案
proudmor + 1 认可答案

查看全部评分

回复 支持 1 反对 0

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
13559
在线时间
2753 小时
注册时间
2014-10-4
帖子
756

R考场第七期纪念奖

2
发表于 2020-2-17 19:59:41 | 显示全部楼层
本帖最后由 SixRC 于 2020-2-17 20:09 编辑
proudmor 发表于 2020-2-17 19:11
现在获取输入的内容和销毁窗口搞定了,就剩中文显示的问题了。


昨天没看到 点评一下我 或者 @一下我吧...不然我不知道你回了啊啊
RM默认应该是utf-8编码
所以对于A版本的函数 你需要用
MultiByteToWideChar 把字符串转换成unicode 再用
WideCharToMultiByte 转成 ansi
第一个参数代码页你需要写常数 不能写CP_ACP 你应该懂的
缓存区域你可以 buf = "0" * size
size通过上面的函数返回
具体看函数说明
对于转换到unicode 需要 buf = "0" * size * 2
具体看函数说明 要看仔细
看他返回的单位是 字节数 还是 字数
我给你写个例子

RUBY 代码复制
  1. MultiByteToWideChar = Win32API.new("kernel32","MultiByteToWideChar","llplpl","l")
  2. WideCharToMultiByte = Win32API.new("kernel32","WideCharToMultiByte","llplplll","l")
  3. UTF8 = 0xFDE9
  4. CPACP = 0
  5. def utf8ToAnsi(str)
  6.   len = MultiByteToWideChar.call(UTF8, 0, str, -1, "", 0)
  7.   buf = "00" * len
  8.   MultiByteToWideChar.call(UTF8, 0, str, -1, buf, len)
  9.   len = WideCharToMultiByte.call(CPACP, 0, buf, -1, "", 0, 0, 0)
  10.   retbuf = "0" * len
  11.   WideCharToMultiByte.call(CPACP, 0, buf, -1, retbuf, len, 0, 0)
  12.   retbuf
  13. end
  14.  
  15. title = utf8ToAnsi("测试")
  16. c=Win32API.new("user32","CreateWindowExA","LppLllllllll","l")
  17. p c.call(0,"Button",title,0x10000000 | 0x00040000,400,400,250,150,0,0,0x400000,0)


你改改就能用了

评分

参与人数 2星屑 +200 +1 收起 理由
proudmor + 1 认可答案
正太君 + 200 精品文章

查看全部评分

回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-5-4 04:31

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表