| // Copyright 2011 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package main | |
| import ( | |
| "syscall" | |
| "unsafe" | |
| ) | |
| func loadDll(fname string) syscall.Handle { | |
| h, e := syscall.LoadLibrary(fname) | |
| if e != 0 { | |
| abortf("LoadLibrary(%s) failed with err=%d.\n", fname, e) | |
| } | |
| return h | |
| } | |
| func getSysProcAddr(m syscall.Handle, pname string) uintptr { | |
| p, e := syscall.GetProcAddress(m, pname) | |
| if e != 0 { | |
| abortf("GetProcAddress(%s) failed with err=%d.\n", pname, e) | |
| } | |
| return uintptr(p) | |
| } | |
| type Wndclassex struct { | |
| Size uint32 | |
| Style uint32 | |
| WndProc uintptr | |
| ClsExtra int32 | |
| WndExtra int32 | |
| Instance uint32 | |
| Icon uint32 | |
| Cursor uint32 | |
| Background uint32 | |
| MenuName *uint16 | |
| ClassName *uint16 | |
| IconSm uint32 | |
| } | |
| type Point struct { | |
| X int32 | |
| Y int32 | |
| } | |
| type Msg struct { | |
| Hwnd uint32 | |
| Message uint32 | |
| Wparam int32 | |
| Lparam int32 | |
| Time uint32 | |
| Pt Point | |
| } | |
| const ( | |
| // Window styles | |
| WS_OVERLAPPED = 0 | |
| WS_POPUP = 0x80000000 | |
| WS_CHILD = 0x40000000 | |
| WS_MINIMIZE = 0x20000000 | |
| WS_VISIBLE = 0x10000000 | |
| WS_DISABLED = 0x8000000 | |
| WS_CLIPSIBLINGS = 0x4000000 | |
| WS_CLIPCHILDREN = 0x2000000 | |
| WS_MAXIMIZE = 0x1000000 | |
| WS_CAPTION = WS_BORDER | WS_DLGFRAME | |
| WS_BORDER = 0x800000 | |
| WS_DLGFRAME = 0x400000 | |
| WS_VSCROLL = 0x200000 | |
| WS_HSCROLL = 0x100000 | |
| WS_SYSMENU = 0x80000 | |
| WS_THICKFRAME = 0x40000 | |
| WS_GROUP = 0x20000 | |
| WS_TABSTOP = 0x10000 | |
| WS_MINIMIZEBOX = 0x20000 | |
| WS_MAXIMIZEBOX = 0x10000 | |
| WS_TILED = WS_OVERLAPPED | |
| WS_ICONIC = WS_MINIMIZE | |
| WS_SIZEBOX = WS_THICKFRAME | |
| // Common Window Styles | |
| WS_OVERLAPPEDWINDOW = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | |
| WS_TILEDWINDOW = WS_OVERLAPPEDWINDOW | |
| WS_POPUPWINDOW = WS_POPUP | WS_BORDER | WS_SYSMENU | |
| WS_CHILDWINDOW = WS_CHILD | |
| WS_EX_CLIENTEDGE = 0x200 | |
| // Some windows messages | |
| WM_CREATE = 1 | |
| WM_DESTROY = 2 | |
| WM_CLOSE = 16 | |
| WM_COMMAND = 273 | |
| // Some button control styles | |
| BS_DEFPUSHBUTTON = 1 | |
| // Some color constants | |
| COLOR_WINDOW = 5 | |
| COLOR_BTNFACE = 15 | |
| // Default window position | |
| CW_USEDEFAULT = 0x80000000 - 0x100000000 | |
| // Show window default style | |
| SW_SHOWDEFAULT = 10 | |
| ) | |
| var ( | |
| // Some globally known cursors | |
| IDC_ARROW = MakeIntResource(32512) | |
| IDC_IBEAM = MakeIntResource(32513) | |
| IDC_WAIT = MakeIntResource(32514) | |
| IDC_CROSS = MakeIntResource(32515) | |
| // Some globally known icons | |
| IDI_APPLICATION = MakeIntResource(32512) | |
| IDI_HAND = MakeIntResource(32513) | |
| IDI_QUESTION = MakeIntResource(32514) | |
| IDI_EXCLAMATION = MakeIntResource(32515) | |
| IDI_ASTERISK = MakeIntResource(32516) | |
| IDI_WINLOGO = MakeIntResource(32517) | |
| IDI_WARNING = IDI_EXCLAMATION | |
| IDI_ERROR = IDI_HAND | |
| IDI_INFORMATION = IDI_ASTERISK | |
| ) | |
| //sys GetModuleHandle(modname *uint16) (handle uint32, errno int) = GetModuleHandleW | |
| //sys RegisterClassEx(wndclass *Wndclassex) (atom uint16, errno int) = user32.RegisterClassExW | |
| //sys CreateWindowEx(exstyle uint32, classname *uint16, windowname *uint16, style uint32, x int32, y int32, width int32, height int32, wndparent uint32, menu uint32, instance uint32, param uintptr) (hwnd uint32, errno int) = user32.CreateWindowExW | |
| //sys DefWindowProc(hwnd uint32, msg uint32, wparam int32, lparam int32) (lresult int32) = user32.DefWindowProcW | |
| //sys DestroyWindow(hwnd uint32) (errno int) = user32.DestroyWindow | |
| //sys PostQuitMessage(exitcode int32) = user32.PostQuitMessage | |
| //sys ShowWindow(hwnd uint32, cmdshow int32) (wasvisible bool) = user32.ShowWindow | |
| //sys UpdateWindow(hwnd uint32) (errno int) = user32.UpdateWindow | |
| //sys GetMessage(msg *Msg, hwnd uint32, MsgFilterMin uint32, MsgFilterMax uint32) (ret int32, errno int) [failretval==-1] = user32.GetMessageW | |
| //sys TranslateMessage(msg *Msg) (done bool) = user32.TranslateMessage | |
| //sys DispatchMessage(msg *Msg) (ret int32) = user32.DispatchMessageW | |
| //sys LoadIcon(instance uint32, iconname *uint16) (icon uint32, errno int) = user32.LoadIconW | |
| //sys LoadCursor(instance uint32, cursorname *uint16) (cursor uint32, errno int) = user32.LoadCursorW | |
| //sys SetCursor(cursor uint32) (precursor uint32, errno int) = user32.SetCursor | |
| //sys SendMessage(hwnd uint32, msg uint32, wparam int32, lparam int32) (lresult int32) = user32.SendMessageW | |
| //sys PostMessage(hwnd uint32, msg uint32, wparam int32, lparam int32) (errno int) = user32.PostMessageW | |
| func MakeIntResource(id uint16) *uint16 { | |
| return (*uint16)(unsafe.Pointer(uintptr(id))) | |
| } |