Project1

标题: AVG用,为RM添加系统菜单 [打印本页]

作者: 神思    时间: 2009-11-29 22:16
标题: AVG用,为RM添加系统菜单
本帖最后由 神思 于 2009-11-29 22:44 编辑

更新一下..!!!!!
请重新下载

-___-|||........
最经一直在研究VC....

在VX环境下.重载WNDPROC会出问题。。
所以...截取菜单消息也无能了....

Menu.JPG (48.27 KB, 下载次数: 28)

Menu.JPG

Project7.rar

230.04 KB, 下载次数: 591


作者: 玄月    时间: 2009-11-29 22:21
哟,真是有趣的东西,改写了RGSSPlayer?
作者: dukesward    时间: 2009-11-29 22:24
有相当大的发展空间....
作者: 神思    时间: 2009-11-29 22:26
不是...
-___-今天发现动态连接库里能放MENU...
-_______-然后又发现又SetMenu这玩意...
然后又然后..前几天写了个重载窗口过程函数的东西.....发现有的搞...

不过有点很奇怪的..
就是F2跟全屏的消息都是0x0111= =|||...
菜单的消息都是0x0111
作者: 神思    时间: 2009-11-29 22:35
发现那范例有个问题..

作者信息的ID是40006.
-____-但RM里匹配的是40005..需要自己手动改一下..

还有..必须要把截取WM_ACTIVATEAPP消息的那段代码注释掉....

-_______-|||哎..我还是更新一下好了..
作者: 紫苏    时间: 2009-11-30 02:50
MSDN 关于 SetWindowLong 有如下一段:
Calling SetWindowLong with the GWL_WNDPROC index creates a subclass of the window class used to create the window. An application can subclass a system class, but should not subclass a window class created by another process. The SetWindowLong function creates the window subclass by changing the window procedure associated with a particular window class, causing the system to call the new window procedure instead of the previous one. An application must pass any messages not processed by the new window procedure to the previous window procedure by calling CallWindowProc. This allows the application to create a chain of window procedures.


而关于 CallWindowProc 有如下一段:
lpPrevWndFunc [in] Pointer to the previous window procedure. If this value is obtained by calling the GetWindowLong function with the nIndex parameter set to GWL_WNDPROC or DWL_DLGPROC, it is actually either the address of a window or dialog box procedure, or a special internal value meaningful only to CallWindowProc.


所以正确做法应该是调用 CallWindowProc,这样 VX 也能替换窗口过程了~(不过替换之后通过 RGSSEval 解释 VX 脚本的话还会有一些诡异的现象,至今不明原因,神思可以研究下)
或许是在 XP 中,SetWindowLong 返回的刚好是一个函数指针,而在 VX 中返回的就是一个只对 CallWindowProc 有意义的特殊值

消息一般分两种,一种是以 WM 开头,但并非 WM_COMMAND 的消息,这类消息是标准消息;0x0111 即 WM_COMMAND,这个消息可以表示两种消息,一种是命令消息,一种是通告消息
命令消息来自菜单、加速键和各种按钮,虽然消息都是 WM_COMMAND ,但可以通过菜单、加速键或者工具栏按钮的一个唯一的标识来区分;后者是由控件发送的,作用一般是通知父窗口某个事件的发生,但仅仅是通知,并不是让父窗口来处理这个消息,因为处理这个消息的应该是子窗口,即控件本身

这里 SetMenu 之后的就是窗口的菜单,每个菜单项都有一个唯一的标识,当系统从消息队列中获取到 WM_COMMAND 后,会把这个标示传递给 wParam,然后一并传递给窗口过程函数处理
这个标识是在调用 AppendMenu 时传递给 uIDNewItem 参数的一个 UINT,或者是 InsertMenuItem 时传递给第二个 uItem 参数的一个 UINT
F2 和全屏都属于加速键,所以都是 WM_COMMAND~




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1