Could the fact that you're requesting fullscreen be causing a problem? w = new cog::Window(100, 100, 16, TRUE);
If it helps, this works in my code base:
HWND impl::window_impl::create_window_(
window_impl* window // associated window object
) {
auto const INSTANCE = ::GetModuleHandleW(L"");
WNDCLASSEXW const wc = {
sizeof(WNDCLASSEXW),
CS_OWNDC | CS_HREDRAW | CS_VREDRAW,
window_impl::top_level_wnd_proc_,
0,
0,
INSTANCE,
nullptr,
::LoadCursorW(nullptr, MAKEINTRESOURCE(IDC_ARROW)),
nullptr,
nullptr,
CLASS_NAME,
nullptr
};
::RegisterClassExW(&wc); // ignore return value
auto const result = ::CreateWindowExW(
0,
CLASS_NAME,
L"window",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
(HWND)nullptr ,
(HMENU)nullptr,
INSTANCE,
window
);
return result;
}
[edit] I think your call to CreateWindowExW has the params in the wrong order -- specifically the instance paramater. Do you compile with STRICT on? It should detect this kind of problem.
[edit] Not directly related, but your implementation won't work when compiled as 64bit code, and it doesn't check for possible errors -- you should use something like:
//--------------------------------------------------------------------------
//! Get the userdata for the window given by @c hwnd (our window object).
//! @throw bklib::platform::windows_exception
//--------------------------------------------------------------------------
impl::window_impl* get_window_ptr(HWND hwnd) {
::SetLastError(0);
auto const result = ::GetWindowLongPtrW(hwnd, GWLP_USERDATA);
if (result == 0) {
auto const e = ::GetLastError();
if (e) {
BOOST_THROW_EXCEPTION(bklib::platform::windows_exception()
<< bklib::platform::windows_error_code(e)
);
}
}
return reinterpret_cast<impl::window_impl*>(result);
}
//--------------------------------------------------------------------------
//! Set the userdata for the window given by @c hwnd to be our
//! window object.
//! @throw bklib::platform::windows_exception
//--------------------------------------------------------------------------
void set_window_ptr(HWND hwnd, impl::window_impl* ptr) {
::SetLastError(0);
auto const result = ::SetWindowLongPtrW(hwnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(ptr));
if (result == 0) {
auto const e = ::GetLastError();
if (e) {
BOOST_THROW_EXCEPTION(bklib::platform::windows_exception()
<< bklib::platform::windows_error_code(e)
);
}
}
}
[edit] More code in case it helps
//------------------------------------------------------------------------------
//! Top level window procedure which forwards messages to the appropriate
//! impl::window_impl instance.
//! @throw noexcept
//! Swallows all exceptions at the API boundary.
//------------------------------------------------------------------------------
LRESULT CALLBACK impl::window_impl::top_level_wnd_proc_(
HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam
) try {
// set the instance pointer for the window given by hwnd if it was just created
if (msg == WM_NCCREATE) {
auto const cs =
reinterpret_cast<CREATESTRUCTW const*>(lParam);
auto const window_ptr =
reinterpret_cast<window_impl*>(cs->lpCreateParams);
set_window_ptr(hwnd, window_ptr);
}
// the window object to forward the message to
auto const window = get_window_ptr(hwnd);
if (window) {
return window->window_proc_(hwnd, msg, wParam, lParam);
} else {
// it's possible we will receive some messages beofre WM_NCCREATE;
// use the default handler
return ::DefWindowProcW(hwnd, msg, wParam, lParam);
}
} catch (std::exception&) {
::PostQuitMessage(-1);
return 0;
} catch (...) {
::PostQuitMessage(-1);
return 0;
}
//------------------------------------------------------------------------------
//! Called by the top level window proc. Dispatches messages to their
//! appropriate handler function.
//------------------------------------------------------------------------------
LRESULT impl::window_impl::window_proc_(
HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam
) {
return ::DefWindowProcW(hwnd, msg, wParam, lParam);
}
//------------------------------------------------------------------------------
void impl::window_impl::create() {
handle_ = create_window_(this);
}
//------------------------------------------------------------------------------
void impl::window_impl::show(bool visible) {
::ShowWindow(handle_, SW_SHOWDEFAULT);
::InvalidateRect(handle_, nullptr, FALSE);
::UpdateWindow(handle_);
}