66RPG
本站首页
制作教程
文章作品
制作素材
原创游戏区
周边下载
本站论坛
 ※ 站内搜索
栏 目:
方 式:
关键词:
  
 ※ 教程分类
 RMXP 图文教学
 初级教学
 中级教学
 高级教学
 个人创意与研究
 RMXP 录像教学
 新人入门录像
 零散录像教学
 商业素材使用录像 ★
 周边教学
 美工 与 音乐
 RMXP 脚本发布
 游戏系统修改
 地图效果类
 战斗系统相关
 全新系统类
 API与高难度类
 RMVX 制作教学
 RMVX 初级教学
 RMVX 中级教程
 RMVX 高级教程
 RMVX 综合制作展
 ※ 无图目录 (按点击量横排序)


-- 66RPG全内容文字目录 --


 ※ 近期特色教学
免DLL的输入法 ( 66RPG, RPG MAKER XP教程 )
 本站首页→制作教程→API与高难度类

免DLL的输入法


教程作者:神思
首发网址:点此进入本教学的原始帖
适宜用户:RMXP用户
技术通用度:★★★★
技术应用复杂度:60 (满分150分)
学习的理解难度:70 (满分150分)

 作者的话:

参考于
http://bbs.66rpg.com/forumTopicRead.asp?id=91233&ntime=2008%2D7%2D9+19%3A46%3A04

 教学正文:

#------------------------------------------------------------------------------
# Moonlight INN
# http://cgi.members.interq.or.jp/aquarius/rasetsu/
# RaTTiE
# rasetsu@aquarius.interq.or.jp
#------------------------------------------------------------
# EasyConv::s2u(text) : S-JIS -> UTF-8
# EasyConv::u2s(text) : UTF-8 -> S-JIS
#==============================================
module EasyConv
# API梡掕悢掕媊
   CP_ACP = 0
   CP_UTF8 = 65001

#--------------------------------------------------------------------------
# 仠 S-JIS -> UTF-8
#--------------------------------------------------------------------------
def s2u(text)
# API掕媊
   m2w = Win32API.new('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
   w2m = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')

# S-JIS -> Unicode
   len = m2w.call(CP_ACP, 0, text, -1, nil, 0);
   buf = "\0" * (len*2)
   m2w.call(CP_ACP, 0, text, -1, buf, buf.size/2);

# Unicode -> UTF-8
   len = w2m.call(CP_UTF8, 0, buf, -1, nil, 0, nil, nil);
   ret = "\0" * len
   w2m.call(CP_UTF8, 0, buf, -1, ret, ret.size, nil, nil);
  
   return ret
end
# module_function偲偟偰岞奐
module_function :s2u
#--------------------------------------------------------------------------
# 仠 UTF-8 -> S-JIS
#--------------------------------------------------------------------------
def u2s(text)
# API掕媊
   m2w = Win32API.new('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
   w2m = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')

# UTF-8 -> Unicode
   len = m2w.call(CP_UTF8, 0, text, -1, nil, 0);
   buf = "\0" * (len*2)
   m2w.call(CP_UTF8, 0, text, -1, buf, buf.size/2);

# Unicode -> S-JIS
   len = w2m.call(CP_ACP, 0, buf, -1, nil, 0, nil, nil);
   ret = "\0" * len
   w2m.call(CP_ACP, 0, buf, -1, ret, ret.size, nil, nil);
  
   return ret
end
# module_function偲偟偰岞奐
module_function :u2s
end

#========================================
# 本脚本来自www.66rpg.com
#========================================

 

 

#==============================================================================
# ■ TextBox
#------------------------------------------------------------------------------
#  设置输入窗口
#==============================================================================
class TextBox
# 获取程序模块
GetModuleHandle = Win32API.new("kernel32", "GetModuleHandle", "p", "l")
# 创建窗口
CreateWindowEx = Win32API.new("user32", "CreateWindowExA", "lppllllllllp", "l")
# 销毁窗口
DestroyWindow = Win32API.new("user32", "DestroyWindow", "l", "l")
# 控制窗口显示
ShowWindow = Win32API.new("user32", "ShowWindow", "ll", "l")
# 设置输入焦点
SetFocus = Win32API.new("user32", "SetFocus", "l", "l")
# 获取活动的窗口
GetActiveWindow = Win32API.new("user32", "GetActiveWindow", nil, "l")
# 获取控件文字
GetWindowText = Win32API.new("user32", "GetWindowTextA", "lpl", "l")
# 获取控件文字长度
GetWindowTextLength = Win32API.new("user32", "GetWindowTextLength", "l", "l")
# 设置控件文字
SetWindowTextA = Win32API.new("user32", "SetWindowTextA", "lp", "l")
# 刷新窗口
UpdateWindow = Win32API.new("user32", "UpdateWindow", "l", "l")
# 常数
WS_CHILD = 0x40000000
#--------------------------------------------------------------------------
# ● 初始化
#--------------------------------------------------------------------------
def initialize(w, h)
    @wnd = CreateWindowEx.call(1, "Edit", "", WS_CHILD, 0,0,w,h,GetActiveWindow.call,1,GetModuleHandle.call(nil),1)
    SetFocus.call(@wnd)
    ShowWindow.call(@wnd,0)
end
#--------------------------------------------------------------------------
# ● 释放窗口
#--------------------------------------------------------------------------
def dispose
    DestroyWindow.call(@wnd)
end
#--------------------------------------------------------------------------
# ● 获取txt
#--------------------------------------------------------------------------
def txt
    length = GetWindowTextLength.call(@wnd)
    lpstring = Array.new(length+1).pack("C*")
    GetWindowText.call(@wnd, lpstring, length)
    lpstring.delete!("\0")
    t = EasyConv::s2u(lpstring)
    return t
end
#--------------------------------------------------------------------------
# ● 设置txt
#--------------------------------------------------------------------------
def set_txt(txt)
    str = EasyConv::u2s(txt)
    SetWindowTextA.call(@wnd, str)
end
#--------------------------------------------------------------------------
# ● 刷新
#--------------------------------------------------------------------------
def update
    UpdateWindow.call(@wnd)
    SetFocus.call(@wnd)
end
end

t = TextBox.new(320, 24)
v = Viewport.new(160, 228, 320 , 24)
sprite = Sprite.new(v)
sprite.bitmap = Bitmap.new(320,24)
sprite.bitmap.fill_rect(0,0,320,24,Color.new(0,0,0))
sprite.bitmap.fill_rect(1,1,318,22,Color.new(255,255,255))
cou = Sprite.new(v)
cou.bitmap = Bitmap.new(1, 22)
cou.bitmap.fill_rect(0, 0, 1, 22, Color.new(0,255,255))
cou.y = 1
s = t.txt
loop {
Graphics.update
Input.update
t.update
cou.visible = Time.now.sec % 2 == 0
if s != t.txt
cou.visible = true
s = t.txt
sprite.bitmap.clear
sprite.bitmap.font.size = 18
sprite.bitmap.font.color.set(0,0,0)
sprite.bitmap.fill_rect(0,0,320,24,Color.new(0,0,0))
sprite.bitmap.fill_rect(1,1,318,22,Color.new(255,255,255))
sprite.bitmap.draw_text(0,0,320,24,s)
cou.x = 1 + sprite.bitmap.text_size(s).width
end
}



关键字:

发布日期:2008-8-6 21:26:54 点击量:1


 上一篇:纸娃娃V0.1
 下一篇:角色选择界面
关于我们
支援本站
友情连接
站点目录
站内搜索



WWW.66RPG.COM,2005-2013 ^o^

备案序号:京ICP备05035415号



 
Web www.66rpg.com bbs.66rpg.com