現(xiàn)在游戲的UI五花八門,什么需求都有,特別是涉及到充值那塊,對內(nèi)嵌網(wǎng)頁要求就更多。
那么怎么實現(xiàn)一個UI里的內(nèi)嵌網(wǎng)頁呢?這個網(wǎng)頁還要跟著這個UI移動。
關(guān)于內(nèi)嵌網(wǎng)頁,網(wǎng)上已經(jīng)有不少介紹,就是利用CAxWindow,在這里我就不多介紹了,大家可以百度一下這個控件。
如果要在游戲UI中顯示網(wǎng)頁,那把CAxWindow作為游戲主窗口的子窗口(WM_CHILD)創(chuàng)建并設(shè)置到相應(yīng)的位置即可。
至于它要跟著游戲UI移動,這些也是消息響應(yīng)的問題,在這里也不多說了。
最關(guān)鍵的是,這個窗口要不被游戲內(nèi)容擋著,又不占整個屏幕,那要如何弄呢?
其實答案很簡單,但要對win32比較熟悉,只需要把windowstyle設(shè)置成WS_CLIPCHILDREN就可以了。
我的做法是:一但開啟這種窗口
執(zhí)行:
LONG dwWindowStyle = ::GetWindowLong(主窗口);
dwWindowStyle |= WS_CLIPCHILDREN;
::SetWindowLongW(主窗口, GWL_STYLE, dwWindowStyle);
這樣可以保持原來窗口樣式不變。
但網(wǎng)頁內(nèi)嵌到游戲UI有個缺點:就是這種UI一定要排在最前面,因為顯示網(wǎng)頁的窗口是不會被其他東西擋著的。
補充:遇到一個非常奇怪的問題,在release版本下,當(dāng)內(nèi)嵌網(wǎng)頁窗口拖動的時候,網(wǎng)頁有部分像素沒被刷新,但debug卻一點問題也沒有。
這個問題到現(xiàn)在還沒查出具體原因。解決方法如下:
在這個窗口的拖動過程中添加如下函數(shù),
::RedrawWindow(m_hWnd, NULL, NULL, RDW_INVALIDATE| RDW_UPDATENOW | RDW_ERASE | RDW_ALLCHILDREN); m_hWnd是CAxWindow的窗口句柄。