Windows port: add a base CToolWindow class and a toolwindow handler.

This commit is contained in:
luigi__ 2009-09-05 19:08:51 +00:00
parent 54f771536e
commit 998787e921
3 changed files with 215 additions and 4 deletions

View File

@ -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,10 +97,126 @@ void UnregWndClass(string name)
return;
// Otherwise unreg the class and remove its name from the list
UnregisterClass(name.c_str(), hAppInst);
// 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);
}
WINCLASS::WINCLASS(LPSTR rclass, HINSTANCE hInst)
{

View File

@ -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
{

View File

@ -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();