mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-24 14:49:42 -06:00
Some changes to the debugger, added a DSP HLE debugging window. I moved the initialization of DLLdebugger from Core.cpp to the debugging window. (I hope this doesn't break the LLE debugger in any way, or does it have to be started right after LoadPlugin?). Also added a ShowOnStart saved setting to the debugger. And a MainWindow saved setting that set the position and size of the main window when it's started. I may have broken things in the debugger by allowing disabling of for example the Jit window. Please accept my apologies if that is the case.
There's an annoying problem with the DSP HLE wx window that blocks some input and places it in a queue. For example if you have loaded the window and press X on the main window, that action is blocked an placed in some kind of queue and not executed until you have closed the debugging window. This is also why the main Dolphin-Debugger window does not show up until you close the sound window. If someone find a fix to this I guess it could be convenient. There is another way to show the window, m_frame->Show() that is normally supposed to remove this kind of on-focus lock, but in a dll it seemingly breaks because it makes Dllmain call DLL_PROCESS_DETACH immediately after DLL_PROCESS_ATTACH so the window has to be killed or we crash. Also, otherwise unnecessarily I had to disable the new DSP HLE debug window in Release mode because I could not access the SConfig::GetInstance().m_LocalCoreStartupParameter.m_strDSPPlugin.c_str() string that I need to start it (if I tried it crashed). Very annoying and strange. I could not access m_strDSPPlugin or m_strVideoPlugin either, but all other values in m_LocalCoreStartupParameter seemed to work fine. I'll have to leave it to someone else to figure out why. TODO: Later I'll add function to the debugging buttons, currently only update have a function. I'll add some option to show a custom console window (that actually worked better that the wx window to show the current parameters status, it had less flicker on frequent updates). I'll also add some custom log file saving option. Also, the reason I placed Logging.cpp in its own dir is because I plan to add more files to it. There were problems with some build modes, win32 with debugging crashed on booting a game, I don't know if it's my fault. And I could not build Debug win64 because of some wx linking problem. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@722 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
193
Source/Plugins/Plugin_DSP_HLE/Src/Debugger/Debugger.cpp
Normal file
193
Source/Plugins/Plugin_DSP_HLE/Src/Debugger/Debugger.cpp
Normal file
@ -0,0 +1,193 @@
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Licensetype: GNU General Public License (GPL)
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, version 2.0.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License 2.0 for more details.
|
||||
//
|
||||
// A copy of the GPL 2.0 should have been included with the program.
|
||||
// If not, see http://www.gnu.org/licenses/
|
||||
//
|
||||
// Official SVN repository and contact information can be found at
|
||||
// http://code.google.com/p/dolphin-emu/
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "Debugger.h"
|
||||
#include "PBView.h"
|
||||
#include "IniFile.h"
|
||||
|
||||
|
||||
|
||||
// =======================================================================================
|
||||
// Declare events
|
||||
BEGIN_EVENT_TABLE(CDebugger,wxDialog)
|
||||
EVT_CLOSE(CDebugger::OnClose)
|
||||
EVT_BUTTON(ID_UPD,CDebugger::OnUpdate)
|
||||
END_EVENT_TABLE()
|
||||
// =======================================================================================
|
||||
|
||||
|
||||
CDebugger::CDebugger(wxWindow *parent, wxWindowID id, const wxString &title,
|
||||
const wxPoint &position, const wxSize& size, long style)
|
||||
: wxDialog(parent, id, title, position, size, style)
|
||||
, m_GPRListView(NULL)
|
||||
{
|
||||
CreateGUIControls();
|
||||
|
||||
// load ini...
|
||||
IniFile file;
|
||||
file.Load("Debugger.ini");
|
||||
this->Load(file);
|
||||
}
|
||||
|
||||
CDebugger::~CDebugger()
|
||||
{
|
||||
// empty
|
||||
IniFile file;
|
||||
file.Load("Debugger.ini");
|
||||
|
||||
this->Save(file);
|
||||
file.Save("Debugger.ini");
|
||||
}
|
||||
|
||||
void CDebugger::Save(IniFile& _IniFile) const
|
||||
{
|
||||
_IniFile.Set("SoundWindow", "x", GetPosition().x);
|
||||
_IniFile.Set("SoundWindow", "y", GetPosition().y);
|
||||
_IniFile.Set("SoundWindow", "w", GetSize().GetWidth());
|
||||
_IniFile.Set("SoundWindow", "h", GetSize().GetHeight());
|
||||
}
|
||||
|
||||
|
||||
void CDebugger::Load(IniFile& _IniFile)
|
||||
{
|
||||
int x,y,w,h;
|
||||
_IniFile.Get("SoundWindow", "x", &x, GetPosition().x);
|
||||
_IniFile.Get("SoundWindow", "y", &y, GetPosition().y);
|
||||
_IniFile.Get("SoundWindow", "w", &w, GetSize().GetWidth());
|
||||
_IniFile.Get("SoundWindow", "h", &h, GetSize().GetHeight());
|
||||
SetSize(x, y, w, h);
|
||||
}
|
||||
|
||||
void CDebugger::CreateGUIControls()
|
||||
{
|
||||
SetTitle(wxT("Sound Debugging"));
|
||||
SetIcon(wxNullIcon);
|
||||
SetSize(8, 8, 400, 370);
|
||||
Center();
|
||||
|
||||
m_GPRListView = new CPBView(this, ID_GPR, wxDefaultPosition, GetSize(),
|
||||
wxLC_REPORT | wxSUNKEN_BORDER | wxLC_ALIGN_LEFT | wxLC_SINGLE_SEL | wxLC_SORT_ASCENDING);
|
||||
|
||||
wxBoxSizer* sMain;
|
||||
wxButton* m_Upd;
|
||||
wxButton* m_SelC;
|
||||
wxButton* m_Presets;
|
||||
|
||||
wxStaticBoxSizer* sLeft;
|
||||
|
||||
wxListCtrl* m_MemcardList[2];
|
||||
wxTimer* m_Timer;
|
||||
|
||||
|
||||
// declarations
|
||||
wxCheckBox *m_Check[2];
|
||||
wxRadioButton *m_Radio[6];
|
||||
wxPanel *m_Controller;
|
||||
|
||||
// checkboxes
|
||||
m_Check[0] = new wxCheckBox(this, IDC_CHECK0, wxT("Save to file"),
|
||||
wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
||||
m_Check[1] = new wxCheckBox(this, IDC_CHECK1, wxT("Show updated"),
|
||||
wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
||||
|
||||
|
||||
m_Radio[0] = new wxRadioButton(this, IDC_RADIO0, wxT("Show base 10"),
|
||||
wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
||||
m_Radio[1] = new wxRadioButton(this, IDC_RADIO1, wxT("Show base 16"),
|
||||
wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
||||
|
||||
|
||||
m_Radio[2] = new wxRadioButton(this, IDC_RADIO2, wxT("Never"),
|
||||
wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
||||
m_Radio[3] = new wxRadioButton(this, IDC_RADIO3, wxT("5 times/s"),
|
||||
wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
||||
m_Radio[4] = new wxRadioButton(this, IDC_RADIO4, wxT("10 times/s"),
|
||||
wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
||||
|
||||
|
||||
m_Upd = new wxButton(this, ID_UPD, wxT("Update"),
|
||||
wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
||||
m_SelC = new wxButton(this, ID_SELC, wxT("Select Columns"),
|
||||
wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
||||
m_Presets = new wxButton(this, ID_PRESETS, wxT("Presets"),
|
||||
wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
||||
|
||||
sLeft = new wxStaticBoxSizer(wxVERTICAL, this, wxT("Current Status"));
|
||||
|
||||
|
||||
wxBoxSizer* sButtons;
|
||||
sButtons = new wxBoxSizer(wxVERTICAL);
|
||||
|
||||
sButtons->AddStretchSpacer(1);
|
||||
|
||||
sButtons->Add(m_Upd, 0, 0, 5);
|
||||
sButtons->Add(m_SelC, 0, 0, 5);
|
||||
sButtons->Add(m_Presets, 0, 0, 5);
|
||||
|
||||
sButtons->AddStretchSpacer(1);
|
||||
|
||||
sButtons->Add(m_Check[0], 0, 0, 5);
|
||||
sButtons->Add(m_Check[1], 0, 0, 5);
|
||||
|
||||
sButtons->AddStretchSpacer(1);
|
||||
|
||||
sButtons->Add(m_Radio[0], 0, 0, 5);
|
||||
sButtons->Add(m_Radio[1], 0, 0, 5);
|
||||
|
||||
sButtons->AddStretchSpacer(1);
|
||||
|
||||
sButtons->Add(m_Radio[2], 0, 0, 5);
|
||||
sButtons->Add(m_Radio[3], 0, 0, 5);
|
||||
sButtons->Add(m_Radio[4], 0, 0, 5);
|
||||
|
||||
sButtons->AddStretchSpacer(1);
|
||||
|
||||
|
||||
sLeft->Add(m_GPRListView, 1, wxEXPAND|wxALL, 5);
|
||||
|
||||
|
||||
sMain = new wxBoxSizer(wxHORIZONTAL);
|
||||
sMain->Add(sLeft, 1, wxEXPAND|wxALL, 5);
|
||||
sMain->Add(sButtons, 0, wxEXPAND, 0);
|
||||
|
||||
this->SetSizer(sMain);
|
||||
sMain->SetSizeHints(this);
|
||||
|
||||
NotifyUpdate();
|
||||
}
|
||||
|
||||
void CDebugger::OnClose(wxCloseEvent& /*event*/)
|
||||
{
|
||||
EndModal(0);
|
||||
}
|
||||
|
||||
void CDebugger::OnUpdate(wxCommandEvent& /*event*/)
|
||||
{
|
||||
this->NotifyUpdate();
|
||||
}
|
||||
|
||||
void CDebugger::NotifyUpdate()
|
||||
{
|
||||
if (m_GPRListView != NULL)
|
||||
{
|
||||
m_GPRListView->Update();
|
||||
}
|
||||
}
|
85
Source/Plugins/Plugin_DSP_HLE/Src/Debugger/Debugger.h
Normal file
85
Source/Plugins/Plugin_DSP_HLE/Src/Debugger/Debugger.h
Normal file
@ -0,0 +1,85 @@
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Licensetype: GNU General Public License (GPL)
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, version 2.0.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License 2.0 for more details.
|
||||
//
|
||||
// A copy of the GPL 2.0 should have been included with the program.
|
||||
// If not, see http://www.gnu.org/licenses/
|
||||
//
|
||||
// Official SVN repository and contact information can be found at
|
||||
// http://code.google.com/p/dolphin-emu/
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __CDebugger_h__
|
||||
#define __CDebugger_h__
|
||||
|
||||
|
||||
#include "../Globals.h"
|
||||
|
||||
class CPBView;
|
||||
class IniFile;
|
||||
|
||||
// =======================================================================================
|
||||
// Window settings - I'm not sure what these do. I just copied them gtom elsewhere basically.
|
||||
#undef CDebugger_STYLE
|
||||
|
||||
#define CDebugger_STYLE wxDEFAULT_FRAME_STYLE | wxCLIP_CHILDREN | wxNO_FULL_REPAINT_ON_RESIZE
|
||||
// =======================================================================================
|
||||
|
||||
class CDebugger : public wxDialog
|
||||
{
|
||||
private:
|
||||
DECLARE_EVENT_TABLE();
|
||||
|
||||
public:
|
||||
CDebugger(wxWindow *parent, wxWindowID id = 1, const wxString &title = wxT("Sound Debugger"),
|
||||
const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
|
||||
long style = CDebugger_STYLE);
|
||||
|
||||
virtual ~CDebugger();
|
||||
|
||||
void Save(IniFile& _IniFile) const;
|
||||
void Load(IniFile& _IniFile);
|
||||
|
||||
void NotifyUpdate();
|
||||
void OnUpdate(wxCommandEvent& event);
|
||||
|
||||
CPBView* m_GPRListView;
|
||||
|
||||
|
||||
private:
|
||||
// ---------------------------------------------------------------------------------------
|
||||
// WARNING: Make sure these are not also elsewhere, for example in resource.h.
|
||||
enum
|
||||
{
|
||||
IDC_CHECK0 = 2000,
|
||||
IDC_CHECK1,
|
||||
IDC_RADIO0,
|
||||
IDC_RADIO1,
|
||||
IDC_RADIO2,
|
||||
IDC_RADIO3,
|
||||
IDC_RADIO4,
|
||||
ID_UPD,
|
||||
ID_SELC,
|
||||
ID_PRESETS,
|
||||
ID_GPR,
|
||||
ID_DUMMY_VALUE_ //don't remove this value unless you have other enum values
|
||||
|
||||
};
|
||||
// ---------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
void OnClose(wxCloseEvent& event);
|
||||
void CreateGUIControls();
|
||||
};
|
||||
|
||||
#endif
|
168
Source/Plugins/Plugin_DSP_HLE/Src/Debugger/PBView.cpp
Normal file
168
Source/Plugins/Plugin_DSP_HLE/Src/Debugger/PBView.cpp
Normal file
@ -0,0 +1,168 @@
|
||||
// Copyright (C) 2003-2008 Dolphin Project.
|
||||
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, version 2.0.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License 2.0 for more details.
|
||||
|
||||
// A copy of the GPL 2.0 should have been included with the program.
|
||||
// If not, see http://www.gnu.org/licenses/
|
||||
|
||||
// Official SVN repository and contact information can be found at
|
||||
// http://code.google.com/p/dolphin-emu/
|
||||
|
||||
|
||||
#include "PBView.h"
|
||||
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
|
||||
|
||||
|
||||
// ---------------------------------------------------------------------------------------
|
||||
// external declarations
|
||||
extern const char* GetGRPName(unsigned int index);
|
||||
|
||||
// No buttons or events so far
|
||||
BEGIN_EVENT_TABLE(CPBView, wxListCtrl)
|
||||
|
||||
END_EVENT_TABLE()
|
||||
// ---------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
CPBView::CPBView(wxWindow* parent, const wxWindowID id, const wxPoint& pos, const wxSize& size, long style)
|
||||
: wxListCtrl(parent, id, pos, size, style)
|
||||
{
|
||||
InsertColumn(1, wxT("upd4"), wxLIST_FORMAT_LEFT, 90);
|
||||
InsertColumn(1, wxT("upd3"), wxLIST_FORMAT_LEFT, 90);
|
||||
InsertColumn(1, wxT("upd2"), wxLIST_FORMAT_LEFT, 90);
|
||||
InsertColumn(1, wxT("upd1"), wxLIST_FORMAT_LEFT, 90);
|
||||
InsertColumn(1, wxT("upd0"), wxLIST_FORMAT_LEFT, 90);
|
||||
|
||||
InsertColumn(1, wxT("r_lo"), wxLIST_FORMAT_LEFT, 90);
|
||||
InsertColumn(1, wxT("r_hi"), wxLIST_FORMAT_LEFT, 90);
|
||||
InsertColumn(1, wxT("ratio"), wxLIST_FORMAT_LEFT, 90);
|
||||
|
||||
InsertColumn(1, wxT("frac"), wxLIST_FORMAT_LEFT, 90);
|
||||
|
||||
InsertColumn(1, wxT("coef"), wxLIST_FORMAT_LEFT, 90);
|
||||
InsertColumn(1, wxT("src_t"), wxLIST_FORMAT_LEFT, 90);
|
||||
InsertColumn(1, wxT("form"), wxLIST_FORMAT_LEFT, 90);
|
||||
|
||||
InsertColumn(1, wxT("isstr"), wxLIST_FORMAT_LEFT, 90);
|
||||
|
||||
InsertColumn(1, wxT("yn2"), wxLIST_FORMAT_LEFT, 90);
|
||||
InsertColumn(1, wxT("yn1"), wxLIST_FORMAT_LEFT, 90);
|
||||
InsertColumn(1, wxT("pred_s"), wxLIST_FORMAT_LEFT, 90);
|
||||
InsertColumn(1, wxT("isloop"), wxLIST_FORMAT_LEFT, 90);
|
||||
InsertColumn(1, wxT("volr"), wxLIST_FORMAT_LEFT, 90);
|
||||
InsertColumn(1, wxT("voll"), wxLIST_FORMAT_LEFT, 90);
|
||||
InsertColumn(1, wxT("loopto"), wxLIST_FORMAT_LEFT, 90);
|
||||
InsertColumn(1, wxT("end"), wxLIST_FORMAT_LEFT, 90);
|
||||
InsertColumn(0, wxT("pos"), wxLIST_FORMAT_LEFT, 90);
|
||||
InsertColumn(0, wxT("run"), wxLIST_FORMAT_RIGHT, 50);
|
||||
InsertColumn(0, wxT("Block"), wxLIST_FORMAT_CENTER, 40);
|
||||
|
||||
SetFont(wxFont(8, wxSWISS, wxNORMAL, wxNORMAL, false, wxT("Segoe UI")));
|
||||
|
||||
for (int i = 0; i < 64; i++)
|
||||
{
|
||||
|
||||
// Print values from 0 to 63
|
||||
char buffer [33];
|
||||
itoa(i, buffer, 10);
|
||||
sprintf(buffer, "%02i", i);
|
||||
int Item = InsertItem(0, buffer);
|
||||
|
||||
|
||||
wxListItem item;
|
||||
item.SetId(Item);
|
||||
item.SetBackgroundColour(0xFFFFFF);
|
||||
item.SetData(i);
|
||||
SetItem(item);
|
||||
}
|
||||
|
||||
// This is a wx call that leads to MSWDrawSubItem
|
||||
Refresh();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
CPBView::Update()
|
||||
{
|
||||
|
||||
Refresh();
|
||||
|
||||
}
|
||||
|
||||
|
||||
bool
|
||||
CPBView::MSWDrawSubItem(wxPaintDC& rPainDC, int item, int subitem)
|
||||
{
|
||||
bool Result = false;
|
||||
|
||||
// don't change 0, it has the block values
|
||||
if(subitem > 0)
|
||||
{
|
||||
//#ifdef __WXMSW__ // what's this? should I use that?
|
||||
|
||||
// =======================================================================================
|
||||
const wxChar* bgColor = _T("#ffffff");
|
||||
wxBrush bgBrush(bgColor);
|
||||
wxPen bgPen(bgColor);
|
||||
|
||||
wxRect SubItemRect;
|
||||
this->GetSubItemRect(item, subitem, SubItemRect);
|
||||
rPainDC.SetBrush(bgBrush);
|
||||
rPainDC.SetPen(bgPen);
|
||||
rPainDC.DrawRectangle(SubItemRect);
|
||||
// =======================================================================================
|
||||
|
||||
// =======================================================================================
|
||||
// A somewhat primitive attempt to show the playing history for a certain block.
|
||||
// ---------------------------------------------------------------------------------------
|
||||
wxString text;
|
||||
// ---------------------------------------------------------------------------------------
|
||||
if(subitem == 1)
|
||||
{
|
||||
char cbuff [33];
|
||||
|
||||
sprintf(cbuff, "%08i", m_CachedRegs[subitem][item]);
|
||||
std::string c = cbuff;
|
||||
int n[8];
|
||||
|
||||
for (int j = 0; j < 8; j++)
|
||||
{
|
||||
|
||||
n[j] = atoi( c.substr(j, 1).c_str());
|
||||
// 149 = dot, 160 = space
|
||||
if (n[j] == 1){
|
||||
n[j] = 149;} else {n[j] = 160;}
|
||||
}
|
||||
// pretty neat huh?
|
||||
text.Printf(wxT("%c%c%c%c%c%c%c%c"), n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7]);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
text.Printf(wxT("0x%08x"), m_CachedRegs[subitem][item]);
|
||||
}
|
||||
rPainDC.DrawText(text, SubItemRect.GetLeft() + 10, SubItemRect.GetTop() + 4);
|
||||
// =======================================================================================
|
||||
|
||||
|
||||
return(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
// what does this mean?
|
||||
return(Result);
|
||||
}
|
||||
}
|
||||
|
||||
|
46
Source/Plugins/Plugin_DSP_HLE/Src/Debugger/PBView.h
Normal file
46
Source/Plugins/Plugin_DSP_HLE/Src/Debugger/PBView.h
Normal file
@ -0,0 +1,46 @@
|
||||
// Copyright (C) 2003-2008 Dolphin Project.
|
||||
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, version 2.0.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License 2.0 for more details.
|
||||
|
||||
// A copy of the GPL 2.0 should have been included with the program.
|
||||
// If not, see http://www.gnu.org/licenses/
|
||||
|
||||
// Official SVN repository and contact information can be found at
|
||||
// http://code.google.com/p/dolphin-emu/
|
||||
|
||||
#ifndef __PBView_h__
|
||||
#define __PBView_h__
|
||||
|
||||
#include <wx/listctrl.h>
|
||||
|
||||
#include "Common.h"
|
||||
|
||||
class CPBView
|
||||
: public wxListCtrl
|
||||
{
|
||||
public:
|
||||
|
||||
CPBView(wxWindow* parent, const wxWindowID id, const wxPoint& pos, const wxSize& size, long style);
|
||||
|
||||
void Update();
|
||||
|
||||
u32 m_CachedRegs[64][92];
|
||||
|
||||
|
||||
private:
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
|
||||
bool m_CachedRegHasChanged[64];
|
||||
|
||||
virtual bool MSWDrawSubItem(wxPaintDC& rPainDC, int item, int subitem);
|
||||
};
|
||||
|
||||
#endif
|
Reference in New Issue
Block a user