nuclear@0: #include "nucwin.h" nuclear@0: #include nuclear@0: #include nuclear@0: nuclear@0: #ifndef WM_MOUSEWHEEL nuclear@0: #define WM_MOUSEWHEEL 0x020A nuclear@0: #endif // WM_MOUSEWHEEL nuclear@0: nuclear@0: MainLoopMode loopmode; nuclear@0: char *Arguments; nuclear@0: nuclear@0: int (*KeyHandlerFunc)(Widget*, int) = 0; nuclear@0: int (*CloseHandlerFunc)(Widget*, int) = 0; nuclear@0: int (*MouseHandlerFunc)(Widget*, int, int, bool, bool, bool) = 0; nuclear@0: int (*MouseUpHandlerFunc)(Widget*, int, int, bool, bool, bool) = 0; nuclear@0: int (*MouseWheelHandlerFunc)(Widget*, int, int, int) = 0; nuclear@0: int (*WinMoveHandlerFunc)(Widget*, int, int) = 0; nuclear@0: int (*PaintHandlerFunc)(Widget*) = 0; nuclear@0: nuclear@0: void (*RealTimeLoopFunc)() = 0; nuclear@0: nuclear@0: void SetHandler(HandlerType htype, int (*Handler)(Widget*, int)) { nuclear@0: switch(htype) { nuclear@0: case HANDLER_KEY: nuclear@0: KeyHandlerFunc = Handler; nuclear@0: break; nuclear@0: nuclear@0: case HANDLER_CLOSE: nuclear@0: CloseHandlerFunc = Handler; nuclear@0: break; nuclear@0: nuclear@0: case HANDLER_MOUSE: nuclear@0: MouseHandlerFunc = (int (*)(Widget*, int, int, bool, bool, bool))Handler; nuclear@0: break; nuclear@0: nuclear@0: case HANDLER_MOUSEUP: nuclear@0: MouseUpHandlerFunc = (int (*)(Widget*, int, int, bool, bool, bool))Handler; nuclear@0: break; nuclear@0: nuclear@0: case HANDLER_WHEEL: nuclear@0: MouseWheelHandlerFunc = (int (*)(Widget*, int, int, int))Handler; nuclear@0: break; nuclear@0: nuclear@0: case HANDLER_WINMOVE: nuclear@0: WinMoveHandlerFunc = (int (*)(Widget*, int, int))Handler; nuclear@0: break; nuclear@0: nuclear@0: case HANDLER_PAINT: nuclear@0: PaintHandlerFunc = (int (*)(Widget*))Handler; nuclear@0: break; nuclear@0: nuclear@0: default: break; nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: void SetMainLoopFunc(void (*func)()) { nuclear@0: RealTimeLoopFunc = func; nuclear@0: } nuclear@0: nuclear@0: int NWMainLoop(MainLoopMode mode) { nuclear@0: nuclear@0: MSG msg; nuclear@0: loopmode = mode; nuclear@0: nuclear@0: if(mode == RealTimeLoop) { nuclear@0: while(1) { nuclear@0: if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) { nuclear@0: if(msg.message == WM_QUIT) break; nuclear@0: TranslateMessage(&msg); nuclear@0: DispatchMessage(&msg); nuclear@0: } else { nuclear@0: if(RealTimeLoopFunc) RealTimeLoopFunc(); nuclear@0: } nuclear@0: } nuclear@0: } else { nuclear@0: while(GetMessage(&msg, 0, 0, 0)) { nuclear@0: TranslateMessage(&msg); nuclear@0: DispatchMessage(&msg); nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: return (int)msg.wParam; nuclear@0: } nuclear@0: nuclear@0: bool NWCheckForMessages() { nuclear@0: MSG msg; nuclear@0: return (bool)PeekMessage(&msg, 0, 0, 0, PM_NOREMOVE); nuclear@0: } nuclear@0: nuclear@0: nuclear@0: LRESULT CALLBACK MainHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { nuclear@0: switch(msg) { nuclear@0: case WM_KEYDOWN: nuclear@0: if(KeyHandlerFunc) return KeyHandlerFunc(hWnd, (int)wParam); nuclear@0: break; nuclear@0: nuclear@0: case WM_CLOSE: nuclear@0: if(CloseHandlerFunc) CloseHandlerFunc(0, 0); nuclear@0: DestroyWindow(hWnd); nuclear@0: PostQuitMessage(0); nuclear@0: return 0; nuclear@0: break; nuclear@0: nuclear@0: case WM_MOUSEMOVE: nuclear@0: if(MouseHandlerFunc) MouseHandlerFunc(hWnd, LOWORD(lParam), HIWORD(lParam), (bool)(wParam & MK_LBUTTON), (bool)(wParam & MK_MBUTTON), (bool)(wParam & MK_RBUTTON)); nuclear@0: break; nuclear@0: nuclear@0: case WM_LBUTTONDOWN: nuclear@0: if(MouseHandlerFunc) MouseHandlerFunc(hWnd, LOWORD(lParam), HIWORD(lParam), true, false, false); nuclear@0: break; nuclear@0: nuclear@0: case WM_MBUTTONDOWN: nuclear@0: if(MouseHandlerFunc) MouseHandlerFunc(hWnd, LOWORD(lParam), HIWORD(lParam), false, true, false); nuclear@0: break; nuclear@0: nuclear@0: case WM_RBUTTONDOWN: nuclear@0: if(MouseHandlerFunc) MouseHandlerFunc(hWnd, LOWORD(lParam), HIWORD(lParam), false, false, true); nuclear@0: break; nuclear@0: nuclear@0: case WM_LBUTTONUP: nuclear@0: if(MouseUpHandlerFunc) MouseUpHandlerFunc(hWnd, LOWORD(lParam), HIWORD(lParam), true, false, false); nuclear@0: break; nuclear@0: nuclear@0: case WM_MBUTTONUP: nuclear@0: if(MouseUpHandlerFunc) MouseUpHandlerFunc(hWnd, LOWORD(lParam), HIWORD(lParam), false, true, false); nuclear@0: break; nuclear@0: nuclear@0: case WM_RBUTTONUP: nuclear@0: if(MouseUpHandlerFunc) MouseUpHandlerFunc(hWnd, LOWORD(lParam), HIWORD(lParam), false, false, true); nuclear@0: break; nuclear@0: nuclear@0: case WM_MOUSEWHEEL: nuclear@0: if(MouseWheelHandlerFunc) MouseWheelHandlerFunc(hWnd, LOWORD(lParam), HIWORD(lParam), (short)HIWORD(wParam)); nuclear@0: break; nuclear@0: nuclear@0: case WM_MOVE: nuclear@0: if(WinMoveHandlerFunc) WinMoveHandlerFunc(hWnd, LOWORD(lParam), HIWORD(lParam)); nuclear@0: break; nuclear@0: nuclear@0: case WM_PAINT: nuclear@0: if(PaintHandlerFunc) PaintHandlerFunc(hWnd); nuclear@0: } nuclear@0: nuclear@0: return DefWindowProc(hWnd, msg, wParam, lParam); nuclear@0: } nuclear@0: nuclear@0: Point NWGetScreenSize() { nuclear@0: return Point(GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN)); nuclear@0: } nuclear@0: nuclear@0: void NWCloseWindow(Widget *win) { nuclear@0: PostMessage(win, WM_CLOSE, 0, 0); nuclear@0: } nuclear@0: nuclear@0: std::string NWFileSaveChooser(Widget *win, const char *title, const char *filetypes, const char *defext) { nuclear@0: nuclear@0: char fname[512]; nuclear@0: fname[0] = 0; nuclear@0: nuclear@0: OPENFILENAME ofn; nuclear@0: memset(&ofn, 0, sizeof(OPENFILENAME)); nuclear@0: ofn.lStructSize = sizeof(OPENFILENAME); nuclear@0: ofn.hwndOwner = win; nuclear@0: ofn.lpstrFilter = filetypes; nuclear@0: ofn.lpstrFile = fname; nuclear@0: ofn.nMaxFile = 512; nuclear@0: ofn.lpstrTitle = title; nuclear@0: ofn.lpstrDefExt = defext; nuclear@0: ofn.Flags = OFN_PATHMUSTEXIST; nuclear@0: nuclear@0: if(!GetSaveFileName(&ofn)) return ""; nuclear@0: nuclear@0: return fname; nuclear@0: }