// // WindowProcedureInit // LRESULT WINAPI TaskbarListHandler::WindowProcedureInit(HWND window, UINT msg, WPARAM wParam, LPARAM lParam) { if (msg == WM_CREATE) { SetWindowLongPtr(window, 0, (LONG_PTR)((LPCREATESTRUCT)lParam)->lpCreateParams); SetWindowLongPtr(window, GWLP_WNDPROC, (LONG_PTR)&TaskbarListHandler::WindowProcedure); return WindowProcedure(window, msg, wParam, lParam); } return DefWindowProc(window, msg, wParam, lParam); }
LRESULT NativeWindowHolder::ExecuteWindowProcedure(UINT message, WPARAM wParam, LPARAM lParam) { return WindowProcedure(message, wParam, lParam); }
/** * Program start point, build the windows GUI, initialise the emulator. * Enter the program main loop, and tidy up when finished. */ int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil) { static const char szClassName[] = "WindowsApp"; MSG messages = {0}; /**< Here messages to the application are saved */ WNDCLASSEX wincl; /**< Data structure for the windowclass */ hinstance=hThisInstance; /* The Window structure */ wincl.hInstance = hThisInstance; wincl.lpszClassName = szClassName; wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */ wincl.style = CS_DBLCLKS; /* Catch double-clicks */ wincl.cbSize = sizeof (WNDCLASSEX); /* Use custom icon and default mouse-pointer */ wincl.hIcon = LoadIcon(hThisInstance, "allegro_icon"); wincl.hIconSm = LoadIcon(hThisInstance, "allegro_icon"); wincl.hCursor = LoadCursor (NULL, IDC_ARROW); wincl.lpszMenuName = NULL; /* No menu */ wincl.cbClsExtra = 0; /* No extra bytes after the window class */ wincl.cbWndExtra = 0; /* structure or the window instance */ /* Use Windows's default color as the background of the window */ wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND; /* Register the window class, and if it fails quit the program */ if (!RegisterClassEx (&wincl)) return 0; /* Load Menu from resources file */ menu=LoadMenu(hThisInstance,TEXT("MainMenu")); /* Add in CDROM links to the settings menu dynamically */ initmenu(); /* The class is registered, let's create the program*/ ghwnd = CreateWindowEx ( 0, /* Extended possibilites for variation */ szClassName, /* Classname */ "RPCEmu v" VERSION, /* Title Text */ WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX, /* overlapped window with no sizing frame */ CW_USEDEFAULT, /* Windows decides the position */ CW_USEDEFAULT, /* where the window ends up on the screen */ 640 + (GetSystemMetrics(SM_CXFIXEDFRAME) * 2), /* The window width */ 480 + (GetSystemMetrics(SM_CYFIXEDFRAME) * 2) + GetSystemMetrics(SM_CYMENU) + GetSystemMetrics(SM_CYCAPTION), /* and height in pixels */ HWND_DESKTOP, /* The window is a child-window to desktop */ menu, /* Menu handle */ hThisInstance, /* Program Instance handler */ NULL /* No Window Creation data */ ); /* Make the window visible on the screen */ ShowWindow (ghwnd, nFunsterStil); win_set_window(ghwnd); allegro_init(); /* allegro */ /* Allegro does not appear to read the window position until it receives a window move message. This results in the mousehack pointer being offset incorrectly until the window is moved. To workaround this issue, we generate a window move message to the window's current position. */ { WINDOWINFO wi; GetWindowInfo(ghwnd, &wi); PostMessage(ghwnd, WM_MOVE, 0, MAKELPARAM(wi.rcClient.left, wi.rcClient.top)); } /* Initialise the emulation and read the config file */ if (startrpcemu()) return -1; /* Initialise the podules */ opendlls(); /* Based on the contents of config file, dynamically update the Windows GUI items */ if (config.cdromtype > 2) { WindowProcedure(ghwnd, WM_COMMAND, IDM_CDROM_DISABLED + config.cdromtype, 0); } CheckMenuItem(menu, IDM_CDROM_DISABLED + config.cdromtype, MF_CHECKED); CheckMenuItem(menu, IDM_MOUSE_TWOBUTTON, config.mousetwobutton ? MF_CHECKED : MF_UNCHECKED); CheckMenuItem(menu, IDM_CPUIDLE, config.cpu_idle ? MF_CHECKED : MF_UNCHECKED); if (config.mousehackon) { CheckMenuItem(menu, IDM_MOUSE_FOL, MF_CHECKED); } else { CheckMenuItem(menu, IDM_MOUSE_CAP, MF_CHECKED); } /* Return the mouse clipping to normal on program exit */ atexit(releasemousecapture); // SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST); install_int_ex(vblupdate, BPS_TO_TIMER(config.refresh)); drawscre=0; /* Program main loop */ while (!quited) { /* Execute the emulation */ execrpcemu(); /* Update title with mips speed */ if (updatemips) { char title[128]; if (mousehack) { sprintf(title, "RPCEmu v" VERSION " - MIPS: %.1f, AVG: %.1f", perf.mips, perf.mips_total / perf.mips_count); } else { sprintf(title, "RPCEmu v" VERSION " - MIPS: %.1f, AVG: %.1f - %s", perf.mips, perf.mips_total / perf.mips_count, (mousecapture) ? "Press CTRL-END to release mouse" : "Click to capture mouse"); } SetWindowText(ghwnd, title); updatemips=0; } if (handle_sigio) { handle_sigio = 0; sig_io(1); } /* Exit full screen? */ if ((key[KEY_LCONTROL] || key[KEY_RCONTROL]) && key[KEY_END] && fullscreen) { togglefullscreen(0); mousecapture=0; } /* Release mouse from mouse capture mode? */ if ((key[KEY_LCONTROL] || key[KEY_RCONTROL]) && key[KEY_END] && mousecapture && !config.mousehackon) { ClipCursor(&oldclip); mousecapture=0; updatemips=1; } /* Handle Windows events */ if (PeekMessage(&messages,NULL,0,0,PM_REMOVE)) { if (messages.message==WM_QUIT) { quited=1; } /* Translate virtual-key messages into character messages */ TranslateMessage(&messages); /* Send message to WindowProcedure */ DispatchMessage(&messages); } } /* Program has exited. Tidy up */ endrpcemu(); /* The program return-value is 0 - The value that PostQuitMessage() gave */ return messages.wParam; }