use unicode flavors of RegisterClass et al

This commit is contained in:
David Rose 2011-08-30 15:56:41 +00:00
parent a40d6cfc36
commit 6154c9b431
2 changed files with 31 additions and 21 deletions

View File

@ -283,7 +283,9 @@ set_properties_now(WindowProperties &properties) {
if (properties.has_title()) { if (properties.has_title()) {
string title = properties.get_title(); string title = properties.get_title();
_properties.set_title(title); _properties.set_title(title);
SetWindowText(_hWnd, title.c_str()); TextEncoder encoder;
wstring title_w = encoder.decode_text(title);
SetWindowTextW(_hWnd, title_w.c_str());
properties.clear_title(); properties.clear_title();
} }
@ -953,9 +955,10 @@ bool WinGraphicsWindow::
open_graphic_window(bool fullscreen) { open_graphic_window(bool fullscreen) {
DWORD window_style = make_style(fullscreen); DWORD window_style = make_style(fullscreen);
string title; wstring title;
if (_properties.has_title()) { if (_properties.has_title()) {
title = _properties.get_title(); TextEncoder encoder;
title = encoder.decode_text(_properties.get_title());
} }
if (!_properties.has_size()) { if (!_properties.has_size()) {
@ -999,11 +1002,12 @@ open_graphic_window(bool fullscreen) {
} }
if (!_hparent) { // This can be a regular window or a fullscreen window if (!_hparent) { // This can be a regular window or a fullscreen window
_hWnd = CreateWindow(wclass._name.c_str(), title.c_str(), window_style, cerr << "wclass is " << wclass._name << ", title is + " << title << "\n";
metrics.x, metrics.y, _hWnd = CreateWindowW(wclass._name.c_str(), title.c_str(), window_style,
metrics.width, metrics.x, metrics.y,
metrics.height, metrics.width,
NULL, NULL, hinstance, 0); metrics.height,
NULL, NULL, hinstance, 0);
} else { // This is a regular window with a parent } else { // This is a regular window with a parent
int x_origin = 0; int x_origin = 0;
int y_origin = 0; int y_origin = 0;
@ -1013,11 +1017,11 @@ open_graphic_window(bool fullscreen) {
y_origin = _properties.get_y_origin(); y_origin = _properties.get_y_origin();
} }
_hWnd = CreateWindow(wclass._name.c_str(), title.c_str(), _hWnd = CreateWindowW(wclass._name.c_str(), title.c_str(),
WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS , WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS ,
x_origin, y_origin, x_origin, y_origin,
_properties.get_x_size(), _properties.get_y_size(), _properties.get_x_size(), _properties.get_y_size(),
_hparent, NULL, hinstance, 0); _hparent, NULL, hinstance, 0);
if (_hWnd) { if (_hWnd) {
// join our keyboard state with the parents // join our keyboard state with the parents
@ -1723,6 +1727,12 @@ window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {
// supposed to come in through WM_CHAR, too, but there seems to // supposed to come in through WM_CHAR, too, but there seems to
// be a bug in Win2000 in that it only sends question mark // be a bug in Win2000 in that it only sends question mark
// characters through here.) // characters through here.)
// Actually, probably that "bug" was due to the fact that we were
// previously using the ANSI versions of RegisterClass etc., in
// which case the actual value passed to WM_CHAR seems to be
// poorly defined. Now we are using RegisterClassW etc., which
// means WM_CHAR is absolutely supposed to be utf-16.
if (!_ime_open) { if (!_ime_open) {
_input_devices[0].keystroke(wparam); _input_devices[0].keystroke(wparam);
} }
@ -2114,7 +2124,7 @@ window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {
(*it)->wnd_proc(this, hwnd, msg, wparam, lparam); (*it)->wnd_proc(this, hwnd, msg, wparam, lparam);
} }
return DefWindowProc(hwnd, msg, wparam, lparam); return DefWindowProcW(hwnd, msg, wparam, lparam);
} }
@ -2142,7 +2152,7 @@ static_window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {
// Oops, we weren't creating a window! Don't know how to handle the // Oops, we weren't creating a window! Don't know how to handle the
// message, so just pass it on to Windows to deal with it. // message, so just pass it on to Windows to deal with it.
return DefWindowProc(hwnd, msg, wparam, lparam); return DefWindowProcW(hwnd, msg, wparam, lparam);
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
@ -2690,8 +2700,8 @@ static HCURSOR get_cursor(const Filename &filename);
const WinGraphicsWindow::WindowClass &WinGraphicsWindow:: const WinGraphicsWindow::WindowClass &WinGraphicsWindow::
register_window_class(const WindowProperties &props) { register_window_class(const WindowProperties &props) {
WindowClass wcreg(props); WindowClass wcreg(props);
ostringstream wclass_name; wostringstream wclass_name;
wclass_name << "WinGraphicsWindow" << _window_class_index; wclass_name << L"WinGraphicsWindow" << _window_class_index;
wcreg._name = wclass_name.str(); wcreg._name = wclass_name.str();
pair<WindowClasses::iterator, bool> found = _window_classes.insert(wcreg); pair<WindowClasses::iterator, bool> found = _window_classes.insert(wcreg);
@ -2705,12 +2715,12 @@ register_window_class(const WindowProperties &props) {
// We have not yet created this window class. // We have not yet created this window class.
_window_class_index++; _window_class_index++;
WNDCLASS wc; WNDCLASSW wc;
HINSTANCE instance = GetModuleHandle(NULL); HINSTANCE instance = GetModuleHandle(NULL);
// Clear before filling in window structure! // Clear before filling in window structure!
ZeroMemory(&wc, sizeof(WNDCLASS)); ZeroMemory(&wc, sizeof(wc));
wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
wc.lpfnWndProc = (WNDPROC)static_window_proc; wc.lpfnWndProc = (WNDPROC)static_window_proc;
wc.hInstance = instance; wc.hInstance = instance;
@ -2721,7 +2731,7 @@ register_window_class(const WindowProperties &props) {
wc.lpszMenuName = NULL; wc.lpszMenuName = NULL;
wc.lpszClassName = wclass._name.c_str(); wc.lpszClassName = wclass._name.c_str();
if (!RegisterClass(&wc)) { if (!RegisterClassW(&wc)) {
windisplay_cat.error() windisplay_cat.error()
<< "could not register window class " << wclass._name << "!" << endl; << "could not register window class " << wclass._name << "!" << endl;
return wclass; return wclass;

View File

@ -242,7 +242,7 @@ private:
INLINE WindowClass(const WindowProperties &props); INLINE WindowClass(const WindowProperties &props);
INLINE bool operator < (const WindowClass &other) const; INLINE bool operator < (const WindowClass &other) const;
string _name; wstring _name;
HICON _icon; HICON _icon;
}; };