现在游戏的UI五花八门,什么需求都有,特别是涉及到充值那块,对内嵌网页要求就更多。
那么怎么实现一个UI里的内嵌网页呢?这个网页还要跟着这个UI移动。
关于内嵌网页,网上已经有不少介绍,就是利用CAxWindow,在这里我就不多介绍了,大家可以百度一下这个控件。
如果要在游戏UI中显示网页,那把CAxWindow作为游戏主窗口的子窗口(WM_CHILD)创建并设置到相应的位置即可。
至于它要跟着游戏UI移动,这些也是消息响应的问题,在这里也不多说了。
最关键的是,这个窗口要不被游戏内容挡着,又不占整个屏幕,那要如何弄呢?
其实答案很简单,但要对win32比较熟悉,只需要把windowstyle设置成WS_CLIPCHILDREN就可以了。
我的做法是:一但开启这种窗口
执行:
LONG dwWindowStyle = ::GetWindowLong(主窗口);
dwWindowStyle |= WS_CLIPCHILDREN;
::SetWindowLongW(主窗口, GWL_STYLE, dwWindowStyle);
这样可以保持原来窗口样式不变。
但网页内嵌到游戏UI有个缺点:就是这种UI一定要排在最前面,因为显示网页的窗口是不会被其他东西挡着的。
补充:遇到一个非常奇怪的问题,在release版本下,当内嵌网页窗口拖动的时候,网页有部分像素没被刷新,但debug却一点问题也没有。
这个问题到现在还没查出具体原因。解决方法如下:
在这个窗口的拖动过程中添加如下函数,
::RedrawWindow(m_hWnd, NULL, NULL, RDW_INVALIDATE| RDW_UPDATENOW | RDW_ERASE | RDW_ALLCHILDREN); m_hWnd是CAxWindow的窗口句柄。