Tôi đoán bạn phải thực hiện một số thay đổi trong mã libRocket để vượt qua việc tạo Window. Tôi không chắc có cách nào khác không nhưng tôi chắc chắn đoạn mã này sẽ hoạt động! và tôi giả sử bạn đang phát triển cho một hệ thống windows, nếu bạn đang nhắm mục tiêu một nền tảng khác thì có một bước tương tự nhưng với các biến và chức năng thay đổi khác nhau!
trước hết bạn cần phải có một trình xử lý cho cửa sổ mà SDL tạo ra. đoạn mã này trích xuất giá trị CTNH yêu cầu (theo đây :
#include <SDL_syswm.h>
struct SDL_SysWMinfo wmInfo;
SDL_VERSION(&wmInfo.version);
if(-1 == SDL_GetWMInfo(&wmInfo))
throw AVException(SDL_GetError());
HWND hwndSDL = wmInfo.window;
bây giờ chúng ta cần đảm bảo libRocket sử dụng cùng một cửa sổ để hiển thị, sau khi tìm kiếm một chút trong các tệp tôi đã tìm thấy một tệp hg/shell/src/win32/ShellWin32.cpp
(địa chỉ dựa trên googlecode) có chứa các chức năng tạo cửa sổ. ở đó bạn sẽ thấy một chức năng được đặt tên bool Shell::OpenWindow(const char* name, bool attach_opengl)
. đó là chức năng chính chịu trách nhiệm tạo cửa sổ. để làm cho libRocket sử dụng lại hwndSDL
biến của chúng tôi, bạn phải xóa / nhận xét tất cả các dòng trong hàm đó ngoại trừ:
if (attach_opengl)
{
opengl_attached = AttachOpenGL();
if (!opengl_attached)
return false;
}
và ngay trước khi những dòng này thêm đoạn mã này:
window_handle = hwndSDL;
Tôi biết đó có thể không phải là cách tốt nhất để làm việc nhưng tôi chắc chắn nó sẽ hoạt động. và nếu bạn đang nhắm mục tiêu bất cứ thứ gì ngoài cửa sổ, bạn chỉ cần tìm các giá trị tương đương cho giá trị HWND và chức năng tạo lại. họ chắc chắn ở đâu đó trong mã vì hầu hết tất cả các hệ thống cửa sổ hoặc cửa sổ hoặc không phải cửa sổ đều có chung logic.