diff options
Diffstat (limited to 'window_windows.c')
| -rw-r--r-- | window_windows.c | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/window_windows.c b/window_windows.c new file mode 100644 index 0000000..2d047b0 --- /dev/null +++ b/window_windows.c @@ -0,0 +1,84 @@ +// 17 july 2014 + +#include "winapi_windows.h" +#include "_cgo_export.h" + +#define windowclass L"gouiwindow" + +#define windowBackground ((HBRUSH) (COLOR_BTNFACE + 1)) + +static LRESULT CALLBACK windowWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + void *data; + RECT r; + LRESULT lResult; + + data = (void *) getWindowData(hwnd, uMsg, wParam, lParam, &lResult, storeWindowHWND); + if (data == NULL) + return lResult; + if (sharedWndProc(hwnd, uMsg, wParam, lParam, &lResult)) + return lResult; + switch (uMsg) { + case WM_PRINTCLIENT: + // the return value of this message is not documented + // just to be safe, do this first, returning its value later + lResult = DefWindowProcW(hwnd, uMsg, wParam, lParam); + if (GetClientRect(hwnd, &r) == 0) + xpanic("error getting client rect for Window in WM_PRINTCLIENT", GetLastError()); + if (FillRect((HDC) wParam, &r, windowBackground) == 0) + xpanic("error filling WM_PRINTCLIENT DC with window background color", GetLastError()); + return lResult; + case WM_SIZE: + if (GetClientRect(hwnd, &r) == 0) + xpanic("error getting client rect for Window in WM_SIZE", GetLastError()); + windowResize(data, &r); + return 0; + case WM_CLOSE: + windowClosing(data); + return 0; + default: + return DefWindowProcW(hwnd, uMsg, wParam, lParam); + } + xmissedmsg("Window", "windowWndProc()", uMsg); + return 0; // unreached +} + +DWORD makeWindowWindowClass(char **errmsg) +{ + WNDCLASSW wc; + + ZeroMemory(&wc, sizeof (WNDCLASSW)); + wc.lpfnWndProc = windowWndProc; + wc.hInstance = hInstance; + wc.hIcon = hDefaultIcon; + wc.hCursor = hArrowCursor; + wc.hbrBackground = windowBackground; + wc.lpszClassName = windowclass; + if (RegisterClassW(&wc) == 0) { + *errmsg = "error registering Window window class"; + return GetLastError(); + } + return 0; +} + +HWND newWindow(LPWSTR title, int width, int height, void *data) +{ + HWND hwnd; + + hwnd = CreateWindowExW( + 0, + windowclass, title, + WS_OVERLAPPEDWINDOW, + CW_USEDEFAULT, CW_USEDEFAULT, + width, height, + NULL, NULL, hInstance, data); + if (hwnd == NULL) + xpanic("Window creation failed", GetLastError()); + return hwnd; +} + +void windowClose(HWND hwnd) +{ + if (DestroyWindow(hwnd) == 0) + xpanic("error destroying window", GetLastError()); +} |
