86 lines
2.2 KiB
C
86 lines
2.2 KiB
C
|
// 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);
|
||
|
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;
|
||
|
// don't do this on WM_WINDOWPOSCHANGING; weird redraw issues will happen
|
||
|
case WM_WINDOWPOSCHANGED:
|
||
|
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());
|
||
|
}
|