From 998787e921619af5a604c2337c8aba96067b9682 Mon Sep 17 00:00:00 2001 From: luigi__ Date: Sat, 5 Sep 2009 19:08:51 +0000 Subject: [PATCH] Windows port: add a base CToolWindow class and a toolwindow handler. --- desmume/src/windows/CWindow.cpp | 141 +++++++++++++++++++++++++++++++- desmume/src/windows/CWindow.h | 76 +++++++++++++++++ desmume/src/windows/main.cpp | 2 +- 3 files changed, 215 insertions(+), 4 deletions(-) diff --git a/desmume/src/windows/CWindow.cpp b/desmume/src/windows/CWindow.cpp index 636908eda..4ec9bac4b 100644 --- a/desmume/src/windows/CWindow.cpp +++ b/desmume/src/windows/CWindow.cpp @@ -20,8 +20,27 @@ */ #include "CWindow.h" +#include "IORegView.h" #include "debug.h" +DWORD GetFontQuality() +{ + BOOL aaEnabled = FALSE; + UINT aaType = FE_FONTSMOOTHINGSTANDARD; + + SystemParametersInfo(SPI_GETFONTSMOOTHING, 0, &aaEnabled, 0); + if (aaEnabled == FALSE) + return NONANTIALIASED_QUALITY; + + if (SystemParametersInfo(SPI_GETFONTSMOOTHINGTYPE, 0, &aaType, 0) == FALSE) + return ANTIALIASED_QUALITY; + + if (aaType == FE_FONTSMOOTHINGCLEARTYPE) + return CLEARTYPE_QUALITY; + else + return ANTIALIASED_QUALITY; +} + //----------------------------------------------------------------------------- // Window class handling //----------------------------------------------------------------------------- @@ -56,7 +75,7 @@ bool RegWndClass(string name, WNDPROC wndProc, UINT style, HICON icon, int extra wc.hbrBackground = GetSysColorBrush(COLOR_BTNFACE); wc.style = style; wc.cbClsExtra = 0; - wc.cbWndExtra = extraSize; + wc.cbWndExtra = 8 + extraSize; wc.hIconSm = 0; if (RegisterClassEx(&wc) != 0) @@ -78,8 +97,124 @@ void UnregWndClass(string name) return; // Otherwise unreg the class and remove its name from the list - UnregisterClass(name.c_str(), hAppInst); - ReggedWndClasses.erase(it); + // ONLY if unregging was successful. Unregging will fail if one + // or more windows using the class still exist. + if (UnregisterClass(name.c_str(), hAppInst) != 0) + ReggedWndClasses.erase(it); +} + +//----------------------------------------------------------------------------- +// Base toolwindow class +//----------------------------------------------------------------------------- + +CToolWindow::CToolWindow(int ID, DLGPROC proc, char* title) + : hWnd(NULL) +{ + hWnd = CreateDialogParam(hAppInst, MAKEINTRESOURCE(ID), HWND_DESKTOP, proc, (LPARAM)this); + if (hWnd == NULL) + return; + + SetWindowText(hWnd, title); +} + +CToolWindow::~CToolWindow() +{ +} + +//----------------------------------------------------------------------------- +// Toolwindow handling +//----------------------------------------------------------------------------- + +CToolWindow* ToolWindowList = NULL; + +bool OpenToolWindow(CToolWindow* wnd) +{ + // A hWnd value of NULL indicates failure to create the window. + // In this case, just delete the toolwindow and return failure. + if (wnd->hWnd == NULL) + { + delete wnd; + return false; + } + + // Add the toolwindow to the list + if (ToolWindowList == NULL) + { + ToolWindowList = wnd; + wnd->prev = NULL; + wnd->next = NULL; + } + else + { + wnd->prev = NULL; + wnd->next = ToolWindowList; + wnd->next->prev = wnd; + ToolWindowList = wnd; + } + + // Show the toolwindow (otherwise it won't show :P ) + wnd->Show(); + + return true; +} + +void CloseToolWindow(CToolWindow* wnd) +{ + // Remove the toolwindow from the list + if (wnd == ToolWindowList) + { + ToolWindowList = wnd->next; + if (wnd->next) wnd->next->prev = NULL; + wnd->next = NULL; + } + else + { + wnd->prev->next = wnd->next; + if (wnd->next) wnd->next->prev = wnd->prev; + wnd->prev = NULL; + wnd->next = NULL; + } + + // Delete the toolwindow object + // its destructor will destroy the window + delete wnd; +} + +void CloseAllToolWindows() +{ + CToolWindow* wnd; + CToolWindow* wnd_next; + + wnd = ToolWindowList; + while (wnd) + { + wnd_next = wnd->next; + + wnd->prev = NULL; + wnd->next = NULL; + delete wnd; + + wnd = wnd_next; + } + + ToolWindowList = NULL; +} + +void RefreshAllToolWindows() +{ + CToolWindow* wnd; + + if (ToolWindowList == NULL) + return; + + EnterCriticalSection(&win_execute_sync); + wnd = ToolWindowList; + while (wnd) + { + wnd->Refresh(); + wnd = wnd->next; + } + LeaveCriticalSection(&win_execute_sync); } diff --git a/desmume/src/windows/CWindow.h b/desmume/src/windows/CWindow.h index 3e9879f99..df399e447 100644 --- a/desmume/src/windows/CWindow.h +++ b/desmume/src/windows/CWindow.h @@ -30,16 +30,92 @@ using namespace std; +extern CRITICAL_SECTION win_execute_sync; + +// GetFontQuality() +// Returns a font quality value that can be passed to +// CreateFont(). The value depends on whether font +// antialiasing is enabled or not. +DWORD GetFontQuality(); + //----------------------------------------------------------------------------- // Window class handling //----------------------------------------------------------------------------- +// RegWndClass() +// Registers a window class. +// Incase the class was already registered, the function +// just does nothing and returns true. +// Returns false if registration failed. bool RegWndClass(string name, WNDPROC wndProc, int extraSize = 0); bool RegWndClass(string name, WNDPROC wndProc, HICON icon, int extraSize = 0); bool RegWndClass(string name, WNDPROC wndProc, UINT style, HICON icon, int extraSize = 0); +// UnregWndClass() +// Unregisters a previously registered window class. +// This function will silently fail if one or more windows +// using the class still exist. void UnregWndClass(string name); +//----------------------------------------------------------------------------- +// Base toolwindow class +//----------------------------------------------------------------------------- + +class CToolWindow +{ +public: + // CToolWindow constructor #1 + // Creates a window from a dialog template resource. + // If the window creation failed for whatever reason, + // hWnd will be NULL. + CToolWindow(int ID, DLGPROC proc, char* title); + + // CToolWindow destructor + // Dummy destructor. The derivated toolwindow classes must + // destroy the window in their own destructors. Thus, they + // can unregister any window classes they use. + virtual ~CToolWindow(); + + // Show(), Hide() + // These ones are quite self-explanatory, I guess. + void Show() { ShowWindow(hWnd, SW_SHOW); } + void Hide() { ShowWindow(hWnd, SW_HIDE); } + + // Refresh() + // Refreshes the window. Called by RefreshAllToolWindows(). + void Refresh() { InvalidateRect(hWnd, NULL, FALSE); } + + // Double-linked toolwindow list. + CToolWindow* prev; + CToolWindow* next; + + // Handle to the window. + HWND hWnd; +}; + +//----------------------------------------------------------------------------- +// Toolwindow handling +//----------------------------------------------------------------------------- + +// OpenToolWindow() +// Adds the CToolWindow instance to the toolwindow list. +// The instance will be deleted if its hWnd member is NULL. +bool OpenToolWindow(CToolWindow* wnd); + +// CloseToolWindow() +// Removes the CToolWindow instance from the toolwindow list +// and deletes it. +void CloseToolWindow(CToolWindow* wnd); + +// CloseAllToolWindows() +// Deletes all the toolwindows in the list and flushes the list. +void CloseAllToolWindows(); + +// RefreshAllToolWindows() +// Refreshes all the toolwindows in the list. +// Called once per frame when the emu is running. +void RefreshAllToolWindows(); + class WINCLASS { diff --git a/desmume/src/windows/main.cpp b/desmume/src/windows/main.cpp index 4be01037f..666a909aa 100644 --- a/desmume/src/windows/main.cpp +++ b/desmume/src/windows/main.cpp @@ -1290,7 +1290,7 @@ static void StepRunLoop_User() tools_time_last = time_now; } if(SoundView_IsOpened()) SoundView_Refresh(); - //RefreshAllToolWindows(); + RefreshAllToolWindows(); Update_RAM_Watch(); Update_RAM_Search();