www.pudn.com > EndpointDetection_Pitch.zip > RelDlg.cpp


// RelDlg.cpp : implementation file 
// 
#include "stdafx.h" 
#include "Pitch.h" 
#include "PitchDlg.h" 
#include "RelDlg.h" 
#include "scrdlg.h"     
#include "Prompt.h" 
#include  
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
#define PLAY_BUFFER_LENGTH 128 
 
extern unsigned int RelativeNoteResults[][15]; 
extern int LowPianoNote; 
extern int HighPianoNote; 
extern char NoteDescription[]; 
extern char NoteTable1[]; 
extern char MidiReturn[]; 
extern int HighNoteForSoundBlaster; 
extern int RelativeX, RelativeY, RelativeWidth, RelativeHeight; 
extern BYTE CurrentChannel; 
extern BYTE bStatus;      // Midi status byte 
extern BYTE bChannel;	   // Midi channel byte 
extern BYTE bData1;       // First midi data byte 
extern BYTE bData2;       // Second midi data byte//  Play note and wait until it finishes    
extern int NoteWaitTimeLength; 
extern BYTE InstrumentNumber; 
extern int IncorrectDialogSwitch; 
extern HWND myHWND; 
extern int currentDialog; 
 
MSG RelativeMessage;                                                             
 
static char RelativePlayNoteStatus[7]; 
static int OnlyResetingSwitch = 0; 
//static int WaitTypeSwitch = 1;   // 1 for cutoff notes, 2 for delay between notes 
static int BypassSelectionAllRoutine = 0; 
static int Random1st; 
static int Random2nd; 
static int RelativeCorrect = 0; 
static int RelativeGuesses = 0; 
static char IntervalTable[196] = "Unison         "  "Minor 2nd      " 
								 "Major 2nd      "  "Minor 3rd      " 
								 "Major 3rd      "  "Perfect 4th    " 
								 "Diminished 5th "  "Perfect 5th    " 
								 "Minor 6th      "  "Major 6th      " 
								 "Minor 7th      "  "Major 7th      " 
								 "Perfect 8th    " ;  
static char IntervalDescription[128]; 
static char FirstNoteDescription[32]; 
static char SecondNoteDescription[32]; 
static char MidiReturnX[128]; 
BYTE SecondChannel; 
int SecondNoteValue; 
int RelativeTimerKey; 
int RelativeWaitLength = 250;    // 250 milliseconds 
int RelativeTimerWaitSwitch = 0; 
int DebugNote; 
char DebugChar[5]; 
int UpDownSwitch = 2;  // 0 = up, 1 = down and 2 = both 
int AllSelectionSwitch = 0;    // 0 = off and 1 = on 
char charresultR[4]; 
char score_workR[24]; 
 
BOOL ResUnison;		BOOL ResGuessedUnison; 
BOOL ResMinor2nd;	BOOL ResGuessedMinor2nd; 
BOOL ResMajor2nd;	BOOL ResGuessedMajor2nd; 
BOOL ResMinor3rd;	BOOL ResGuessedMinor3rd; 
BOOL ResMajor3rd;	BOOL ResGuessedMajor3rd; 
BOOL ResPerfect4th;	BOOL ResGuessedPerfect4th; 
BOOL ResDiminished5th;	BOOL ResGuessedDiminished5th; 
BOOL ResPerfect5th;	BOOL ResGuessedPerfect5th; 
BOOL ResMinor6th;	BOOL ResGuessedMinor6th; 
BOOL ResMajor6th;	BOOL ResGuessedMajor6th; 
BOOL ResMinor7th;	BOOL ResGuessedMinor7th; 
BOOL ResMajor7th;	BOOL ResGuessedMajor7th; 
BOOL ResPerfect8th;	BOOL ResGuessedPerfect8th; 
BOOL ResSelectedAll; 
//////////////////////////////////Prototypes///////////////////////////////// 
void ChangeRelativeNoteBoxes(int); 
void ChangeRelativeSelectedNoteBoxes(int); 
void PlayTwoNotes(); 
///////////////////////////////////////////////////////////////////////////// 
// CRelDlg dialog 
CRelDlg::CRelDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CRelDlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CRelDlg) 
	m_relative_high_note = ""; 
	m_relative_interval = ""; 
	m_relative_low_note = ""; 
	m_up = -1; 
	m_relative_Low_Scroll_Position = 25;     // Default low is note C2 
	m_relative_High_Scroll_Position= 76;     // Default high is E6 
	m_relative_Scroll_Min = 1; 
	m_relative_Scroll_Max = 104;  
	m_relative_Speed_Scroll_Position= 10;     // Equal to 1 second  
	m_relative_Speed_Scroll_Min = 0;          // 0 means to play notes at the same time 
	m_relative_Speed_Scroll_Max = 100;  
	//}}AFX_DATA_INIT 
} 
 
void CRelDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CRelDlg) 
	DDX_Control(pDX, IDC_RelativeTitle, m_RelativeTitle); 
	DDX_Control(pDX, IDC_RelativePlayNotes, m_RelativePlayNotes); 
	DDX_Control(pDX, IDC_RelativeScore, m_RelativeScore); 
	DDX_Control(pDX, IDC_RELATIVE_SPEED, m_relative_speed); 
	DDX_Control(pDX, IDC_RELATIVE_LOW_RANGE, m_relative_low_range); 
	DDX_Control(pDX, IDC_RELATIVE_HIGH_RANGE, m_relative_high_range); 
	DDX_Text(pDX, IDC_RELATIVE_HIGH_NOTE, m_relative_high_note); 
	DDX_Text(pDX, IDC_RELATIVE_INTERVAL, m_relative_interval); 
	DDX_Text(pDX, IDC_RELATIVE_LOW_NOTE, m_relative_low_note); 
	DDX_Control(pDX, IDC_RELATIVE_MAJOR_2ND, m_relative_major_2nd); 
	DDX_Control(pDX, IDC_RELATIVE_MAJOR_3RD, m_relative_major_3rd); 
	DDX_Control(pDX, IDC_RELATIVE_MAJOR_6TH, m_relative_major_6th); 
	DDX_Control(pDX, IDC_RELATIVE_MAJOR_7TH, m_relative_major_7th); 
	DDX_Control(pDX, IDC_RELATIVE_DIMINISHED_5TH, m_relative_diminished_5th); 
	DDX_Control(pDX, IDC_RELATIVE_MINOR_2ND, m_relative_minor_2nd); 
	DDX_Control(pDX, IDC_RELATIVE_MINOR_3RD, m_relative_minor_3rd); 
	DDX_Control(pDX, IDC_RELATIVE_MINOR_6TH, m_relative_minor_6th); 
	DDX_Control(pDX, IDC_RELATIVE_MINOR_7TH, m_relative_minor_7th); 
	DDX_Control(pDX, IDC_RELATIVE_PERFECT_4TH, m_relative_perfect_4th); 
	DDX_Control(pDX, IDC_RELATIVE_PERFECT_5TH, m_relative_perfect_5th); 
	DDX_Control(pDX, IDC_RELATIVE_PERFECT_8TH, m_relative_perfect_8th); 
	DDX_Control(pDX, IDC_RELATIVE_UNISON, m_relative_unison); 
	DDX_Control(pDX, IDC_RELATIVE_SELECTED_UNISON, m_relative_selected_unison); 
	DDX_Control(pDX, IDC_RELATIVE_SELECTED_MINOR_2ND, m_relative_selected_minor_2nd); 
	DDX_Control(pDX, IDC_RELATIVE_SELECTED_MAJOR_2ND, m_relative_selected_major_2nd); 
	DDX_Control(pDX, IDC_RELATIVE_SELECTED_MINOR_3RD, m_relative_selected_minor_3rd); 
	DDX_Control(pDX, IDC_RELATIVE_SELECTED_MAJOR_3RD, m_relative_selected_major_3rd); 
	DDX_Control(pDX, IDC_RELATIVE_SELECTED_PERFECT_4TH, m_relative_selected_perfect_4th); 
	DDX_Control(pDX, IDC_RELATIVE_SELECTED_DIMINISHED_5TH, m_relative_selected_diminished_5th); 
	DDX_Control(pDX, IDC_RELATIVE_SELECTED_PERFECT_5TH, m_relative_selected_perfect_5th); 
	DDX_Control(pDX, IDC_RELATIVE_SELECTED_MINOR_6TH, m_relative_selected_minor_6th); 
	DDX_Control(pDX, IDC_RELATIVE_SELECTED_MAJOR_6TH, m_relative_selected_major_6th); 
	DDX_Control(pDX, IDC_RELATIVE_SELECTED_MINOR_7TH, m_relative_selected_minor_7th); 
	DDX_Control(pDX, IDC_RELATIVE_SELECTED_MAJOR_7TH, m_relative_selected_major_7th); 
	DDX_Control(pDX, IDC_RELATIVE_SELECTED_PERFECT_8TH, m_relative_selected_perfect_8th); 
	DDX_Control(pDX, IDC_RELATIVE_SELECTED_ALL, m_relative_selected_all); 
	DDX_Radio(pDX, IDC_UP, m_up); 
	DDX_Control(pDX, IDC_GetOutOfRelative, m_GetOutOfRelative); 
	//}}AFX_DATA_MAP 
} 
 
BEGIN_MESSAGE_MAP(CRelDlg, CDialog) 
	//{{AFX_MSG_MAP(CRelDlg) 
	ON_WM_HSCROLL() 
	ON_BN_CLICKED(IDC_RELATIVE_SELECTED_UNISON, OnRelativeSelectedUnison) 
	ON_BN_CLICKED(IDC_RELATIVE_SELECTED_MINOR_2ND, OnRelativeSelectedMinor2nd) 
	ON_BN_CLICKED(IDC_RELATIVE_SELECTED_MAJOR_2ND, OnRelativeSelectedMajor2nd) 
	ON_BN_CLICKED(IDC_RELATIVE_SELECTED_MINOR_3RD, OnRelativeSelectedMinor3rd) 
	ON_BN_CLICKED(IDC_RELATIVE_SELECTED_MAJOR_3RD, OnRelativeSelectedMajor3rd) 
	ON_BN_CLICKED(IDC_RELATIVE_SELECTED_PERFECT_4TH, OnRelativeSelectedPerfect4th) 
	ON_BN_CLICKED(IDC_RELATIVE_SELECTED_DIMINISHED_5TH, OnRelativeSelectedDiminished5th) 
	ON_BN_CLICKED(IDC_RELATIVE_SELECTED_PERFECT_5TH, OnRelativeSelectedPerfect5th) 
	ON_BN_CLICKED(IDC_RELATIVE_SELECTED_MINOR_6TH, OnRelativeSelectedMinor6th) 
	ON_BN_CLICKED(IDC_RELATIVE_SELECTED_MAJOR_6TH, OnRelativeSelectedMajor6th) 
	ON_BN_CLICKED(IDC_RELATIVE_SELECTED_MINOR_7TH, OnRelativeSelectedMinor7th) 
	ON_BN_CLICKED(IDC_RELATIVE_SELECTED_MAJOR_7TH, OnRelativeSelectedMajor7th) 
	ON_BN_CLICKED(IDC_RELATIVE_SELECTED_PERFECT_8TH, OnRelativeSelectedPerfect8th) 
	ON_BN_CLICKED(IDC_RELATIVE_SELECTED_ALL, OnRelativeSelectedAll) 
	ON_BN_CLICKED(IDC_RELATIVE_UNISON, OnRelativeUnison) 
	ON_BN_CLICKED(IDC_RELATIVE_MINOR_2ND, OnRelativeMinor2nd) 
	ON_BN_CLICKED(IDC_RELATIVE_MAJOR_2ND, OnRelativeMajor2nd) 
	ON_BN_CLICKED(IDC_RELATIVE_MINOR_3RD, OnRelativeMinor3rd) 
	ON_BN_CLICKED(IDC_RELATIVE_MAJOR_3RD, OnRelativeMajor3rd) 
	ON_BN_CLICKED(IDC_RELATIVE_PERFECT_4TH, OnRelativePerfect4th) 
	ON_BN_CLICKED(IDC_RELATIVE_DIMINISHED_5TH, OnRelativeDiminished5th) 
	ON_BN_CLICKED(IDC_RELATIVE_PERFECT_5TH, OnRelativePerfect5th) 
	ON_BN_CLICKED(IDC_RELATIVE_MINOR_6TH, OnRelativeMinor6th) 
	ON_BN_CLICKED(IDC_RELATIVE_MAJOR_6TH, OnRelativeMajor6th) 
	ON_BN_CLICKED(IDC_RELATIVE_MINOR_7TH, OnRelativeMinor7th) 
	ON_BN_CLICKED(IDC_RELATIVE_MAJOR_7TH, OnRelativeMajor7th) 
	ON_BN_CLICKED(IDC_RELATIVE_PERFECT_8TH, OnRelativePerfect8th) 
	ON_WM_TIMER() 
	ON_WM_RBUTTONDOWN() 
	ON_WM_RBUTTONUP() 
	ON_BN_CLICKED(IDC_UP, OnUp) 
	ON_BN_CLICKED(IDC_DOWN, OnDown) 
	ON_BN_CLICKED(IDC_UPDOWN, OnUpdown) 
	ON_WM_DESTROY() 
	ON_BN_CLICKED(IDC_GetOutOfRelative, OnGetOutOfRelative) 
	ON_BN_CLICKED(IDC_RelativeScore, OnRelativeScore) 
	ON_BN_CLICKED(IDC_RelativePlayNotes, OnRelativePlayNotes) 
	ON_MESSAGE(UWM_RelativeButtonMove, OnRelativeButtonMove) 
	ON_MESSAGE(UWM_RelativeButtonLeave, OnRelativeButtonLeave) 
	ON_WM_CREATE() 
	ON_BN_CLICKED(IDC_RelativeTitle, OnRelativeTitle) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CRelDlg message handlers 
 
BEGIN_EVENTSINK_MAP(CRelDlg, CDialog) 
    //{{AFX_EVENTSINK_MAP(CRelDlg) 
	//}}AFX_EVENTSINK_MAP 
END_EVENTSINK_MAP() 
 BOOL CRelDlg::OnInitDialog()                                             
{ 
	CDialog::OnInitDialog(); 
	// Set the Relativet window to where it finished last time 
	MoveWindow(RelativeX, RelativeY, RelativeWidth, RelativeHeight, TRUE); 
 
	LowPianoNote = 25;  
	HighPianoNote = HighNoteForSoundBlaster;   // Use SoundBlaster as default 
	RelativeWaitLength = 250;  // Set default interval speed to 250 milliseconds 
 
	CScrollBar* pSB_Low  = (CScrollBar*) GetDlgItem(IDC_RELATIVE_LOW_RANGE); 
	CScrollBar* pSB_High = (CScrollBar*) GetDlgItem(IDC_RELATIVE_HIGH_RANGE);  
	CScrollBar* pSB_Speed = (CScrollBar*) GetDlgItem(IDC_RELATIVE_SPEED);   
    pSB_Low  ->SetScrollRange(m_relative_Scroll_Min, m_relative_Scroll_Max);  
    pSB_High ->SetScrollRange(m_relative_Scroll_Min, m_relative_Scroll_Max);  
    pSB_Speed ->SetScrollRange(m_relative_Speed_Scroll_Min, m_relative_Speed_Scroll_Max);  
 
    pSB_Low  ->SetScrollPos(m_relative_Low_Scroll_Position);             
    pSB_High ->SetScrollPos(m_relative_High_Scroll_Position);            
    pSB_Speed  ->SetScrollPos(m_relative_Speed_Scroll_Position);         
 
	strncpy(NoteDescription,NoteTable1 + (m_relative_Low_Scroll_Position-1)*3, 3);  
    m_relative_low_note = NoteDescription;  
	strncpy(NoteDescription,NoteTable1 + (m_relative_High_Scroll_Position-1)*3, 3);  
    m_relative_high_note = NoteDescription;  
	UpdateData(FALSE); 
	strcpy(RelativePlayNoteStatus,"Play"); 
	GetDlgItem(IDC_RelativePlayNotes) ->EnableWindow(FALSE);              
	KillGuessedCheckBoxes(); 
    UpDownSwitch = 2; 
    m_up = 2;    //  Default to up and down intervals 
	m_RelativePlayNotes.SetWindowText(RelativePlayNoteStatus); 
	m_RelativePlayNotes.SetShade(SHS_SOFTBUMP,6,30); 
	m_RelativePlayNotes.SetTextColor(GreenColour); 
	m_RelativePlayNotes.SetFont("Signature",24,20); 
	m_GetOutOfRelative.SetShade(SHS_SOFTBUMP,6,30); 
	m_GetOutOfRelative.SetTextColor(RedColour); 
	m_GetOutOfRelative.SetFont("Signature",24,20); 
	m_RelativeScore.SetShade(SHS_SOFTBUMP,6,30); 
	m_RelativeScore.SetTextColor(BlueColour); 
	m_RelativeScore.SetFont("Signature",24,20); 
 
	m_RelativeScore.SetShade(SHS_DIAGSHADE,8,20,5,RGB(55,255,55)); 
 
 
	m_relative_selected_unison.SetShade(SHS_SOFTBUMP,8,30); 
	m_relative_selected_minor_2nd.SetShade(SHS_SOFTBUMP,8,30); 
	m_relative_selected_major_2nd.SetShade(SHS_SOFTBUMP,8,30); 
	m_relative_selected_minor_3rd.SetShade(SHS_SOFTBUMP,8,30); 
	m_relative_selected_major_3rd.SetShade(SHS_SOFTBUMP,8,30); 
	m_relative_selected_perfect_4th.SetShade(SHS_SOFTBUMP,8,30); 
	m_relative_selected_diminished_5th.SetShade(SHS_SOFTBUMP,8,30); 
	m_relative_selected_perfect_5th.SetShade(SHS_SOFTBUMP,8,30); 
	m_relative_selected_minor_6th.SetShade(SHS_SOFTBUMP,8,30); 
	m_relative_selected_major_6th.SetShade(SHS_SOFTBUMP,8,30); 
	m_relative_selected_minor_7th.SetShade(SHS_SOFTBUMP,8,30); 
	m_relative_selected_major_7th.SetShade(SHS_SOFTBUMP,8,30); 
	m_relative_selected_perfect_8th.SetShade(SHS_SOFTBUMP,8,30); 
	m_relative_selected_all.SetShade(SHS_SOFTBUMP,8,30); 
 
	m_relative_selected_unison.SetTextColor(RedColour); 
	m_relative_selected_minor_2nd.SetTextColor(RedColour); 
	m_relative_selected_major_2nd.SetTextColor(RedColour); 
	m_relative_selected_minor_3rd.SetTextColor(RedColour); 
	m_relative_selected_major_3rd.SetTextColor(RedColour); 
	m_relative_selected_perfect_4th.SetTextColor(RedColour); 
	m_relative_selected_diminished_5th.SetTextColor(RedColour); 
	m_relative_selected_perfect_5th.SetTextColor(RedColour); 
	m_relative_selected_minor_6th.SetTextColor(RedColour); 
	m_relative_selected_major_6th.SetTextColor(RedColour); 
	m_relative_selected_minor_7th.SetTextColor(RedColour); 
	m_relative_selected_major_7th.SetTextColor(RedColour); 
	m_relative_selected_perfect_8th.SetTextColor(RedColour); 
	m_relative_selected_all.SetTextColor(RedColour); 
	//  font name, size, weight italic underline for selection 
	m_relative_selected_unison.SetFont("Comic Sans MS",24,20,1); 
	m_relative_selected_minor_2nd.SetFont("Comic Sans MS",24,20,1); 
	m_relative_selected_major_2nd.SetFont("Comic Sans MS",24,20,1); 
	m_relative_selected_minor_3rd.SetFont("Comic Sans MS",24,20,1); 
	m_relative_selected_major_3rd.SetFont("Comic Sans MS",24,20,1); 
	m_relative_selected_perfect_4th.SetFont("Comic Sans MS",24,20,1); 
	m_relative_selected_diminished_5th.SetFont("Comic Sans MS",24,20,1); 
	m_relative_selected_perfect_5th.SetFont("Comic Sans MS",24,20,1); 
	m_relative_selected_minor_6th.SetFont("Comic Sans MS",24,20,1); 
	m_relative_selected_major_6th.SetFont("Comic Sans MS",24,20,1); 
	m_relative_selected_minor_7th.SetFont("Comic Sans MS",24,20,1); 
	m_relative_selected_major_7th.SetFont("Comic Sans MS",24,20,1); 
	m_relative_selected_perfect_8th.SetFont("Comic Sans MS",24,20,1); 
	m_relative_selected_all.SetFont("Comic Sans MS",24,20,1); 
	//  font name, size, weight for playing 
	m_relative_unison.SetFont("Comic Sans MS",24,20,1); 
	m_relative_minor_2nd.SetFont("Comic Sans MS",24,20,1); 
	m_relative_major_2nd.SetFont("Comic Sans MS",24,20,1); 
	m_relative_minor_3rd.SetFont("Comic Sans MS",24,20,1); 
	m_relative_major_3rd.SetFont("Comic Sans MS",24,20,1); 
	m_relative_perfect_4th.SetFont("Comic Sans MS",24,20,1); 
	m_relative_diminished_5th.SetFont("Comic Sans MS",24,20,1); 
	m_relative_perfect_5th.SetFont("Comic Sans MS",24,20,1); 
	m_relative_minor_6th.SetFont("Comic Sans MS",24,20,1); 
	m_relative_major_6th.SetFont("Comic Sans MS",24,20,1); 
	m_relative_minor_7th.SetFont("Comic Sans MS",24,20,1); 
	m_relative_major_7th.SetFont("Comic Sans MS",24,20,1); 
	m_relative_perfect_8th.SetFont("Comic Sans MS",24,20,1); 
 
	m_RelativeTitle.SetShade(SHS_METAL,8,30); 
	m_RelativeTitle.SetTextColor(PurpleColour); 
	m_RelativeTitle.SetFont("Signature",32,20); 
	m_RelativeTitle.SetWindowText("Relative Pitch"); 
 
 
	UpdateData(FALSE); 
 
	currentDialog = RelativeDialog; 
 
	 
	return TRUE;  // return TRUE  unless you set the focus to a control 
} 
 
void CRelDlg::OnRelativePlayNotes()  
{ 
long MidiErr = 0; 
int RandomNote = 0; 
int signed NoteDifference;  
 
int i, InfiniteLoopCounter1, InfiniteLoopCounter2; 
InfiniteLoopCounter1 = 0; 
InfiniteLoopCounter2 = 0; 
char Alpha[5]; 
	CFile ResultsFile; 
	// Use GetARandomNumber member of CPitchDlg as a friend 
	CPitchDlg GetNumb; 
 
if (strcmp(RelativePlayNoteStatus,"Replay")) 
	{} else 
	{ 
		RelativeReplayNotes(); 
		goto PlayNotesExit; 
	} 
 
	NoteDifference = HighPianoNote-LowPianoNote; 
	if (NoteDifference < 0) {NoteDifference = NoteDifference * -1;};  // Ensure positive 
	if (NoteDifference < 12)                                                
		{MessageBox("Range too small for interval testing.");                  
		goto PlayNotesExit;}; 
	// Disable all selection boxes 
	ChangeRelativeSelectedNoteBoxes(FALSE); 
	// Enable any guessing boxes that have relative selection boxes enabled 
	EnableGuessedCheckBoxes(); 
	// Set the ticks off in the guessing boxes 
	OnlyResetingSwitch = 1; 
	m_relative_unison.SetCheck(FALSE); 
	m_relative_minor_2nd.SetCheck(FALSE); 
	m_relative_major_2nd.SetCheck(FALSE); 
	m_relative_minor_3rd.SetCheck(FALSE); 
	m_relative_major_3rd.SetCheck(FALSE); 
	m_relative_perfect_4th.SetCheck(FALSE); 
	m_relative_diminished_5th.SetCheck(FALSE); 
	m_relative_perfect_5th.SetCheck(FALSE); 
	m_relative_minor_6th.SetCheck(FALSE); 
	m_relative_major_6th.SetCheck(FALSE); 
	m_relative_minor_7th.SetCheck(FALSE); 
	m_relative_major_7th.SetCheck(FALSE); 
	m_relative_perfect_8th.SetCheck(FALSE); 
   OnlyResetingSwitch = 0; 
	m_relative_interval = ""; 
	UpdateData(FALSE); 
TopOfFirstNote:			 
	InfiniteLoopCounter1++; InfiniteLoopCounter2 = 0; 
	if (InfiniteLoopCounter1 > 200) 
		{ 
		//MessageBox("Can not randomly create an interval in this range"); 
		itoa(LowPianoNote,Alpha,10); 
		MessageBox(Alpha);                                                     
		itoa(HighPianoNote,Alpha,10); 
		MessageBox(Alpha);                                                     
		goto PlayNotesExit; 
		};  //Finding any interval is impossible, so tell user and get out 
	if (LowPianoNote < HighPianoNote) 
		{RandomNote = GetNumb.GetARandomNumber(LowPianoNote,HighPianoNote);}  
	else 
		{RandomNote = GetNumb.GetARandomNumber(HighPianoNote,LowPianoNote);} ; 
    Random1st = RandomNote; 
TopOfSecondNote: 
	InfiniteLoopCounter2++; 
	if (InfiniteLoopCounter2 > 100) 
		{goto TopOfFirstNote;};  //Finding second note is impossible, retry the first note 
 
	//  Second note must be within an octave (plus or minus) of 1st note	 
	//  Need a random number from 0-24 which we will use as -12 to -1 and 0 to 12 
	//  This will then be used to adjust the first note. 
	//  If it is not a valid note, another search will be done. 
	//  If it is valid, it is used as the 2nd note. 
	if (UpDownSwitch == 0)  
		{RandomNote = GetNumb.GetARandomNumber(0,12);   // Up only		  
			Random2nd = (Random1st+RandomNote );}; 
	if (UpDownSwitch == 1)  
		{RandomNote = GetNumb.GetARandomNumber(0,12);   // Down only	 
			Random2nd = (Random1st-RandomNote );}; 
	if (UpDownSwitch == 2)  
		{RandomNote = GetNumb.GetARandomNumber(0,24);    // Up and Down!   
 		 if (RandomNote > 11) 
			{Random2nd = (Random1st+RandomNote -12);}    // 12 to 24 becomes 0 to 12 
    	 else 
    		{Random2nd = (Random1st-RandomNote-1);};     // 0 to 11 becomes -1 to -12 
        }; 
    DebugNote = RandomNote; 
 
//  Following test is a bit messy as user could have high and low note notes reversed.  
	if ((LowPianoNote < HighPianoNote) 
		& ((Random2nd > HighPianoNote) | (Random2nd < LowPianoNote))) 
			{goto TopOfSecondNote;}; 
	if ((LowPianoNote > HighPianoNote) 
		& ((Random2nd < HighPianoNote) | (Random2nd > LowPianoNote))) 
			{goto TopOfSecondNote;}; 
//Check to see that both notes create one of the intervals user selected 
	NoteDifference = Random1st - Random2nd; 
	if (NoteDifference < 0) 
	   {NoteDifference = NoteDifference * -1;};  // Ensure positive 
    if (ResUnison & (NoteDifference == 0)) 
	    {goto IntervalIsValid;}; 
    if (ResMinor2nd & (NoteDifference == 1)) 
	    {goto IntervalIsValid;}; 
    if (ResMajor2nd & (NoteDifference == 2)) 
	    {goto IntervalIsValid;}; 
    if (ResMinor3rd & (NoteDifference == 3)) 
	    {goto IntervalIsValid;}; 
    if (ResMajor3rd & (NoteDifference == 4)) 
	    {goto IntervalIsValid;}; 
    if (ResPerfect4th & (NoteDifference == 5)) 
	    {goto IntervalIsValid;}; 
    if (ResDiminished5th & (NoteDifference == 6)) 
	    {goto IntervalIsValid;}; 
    if (ResPerfect5th & (NoteDifference == 7)) 
	    {goto IntervalIsValid;}; 
    if (ResMinor6th & (NoteDifference == 8)) 
	    {goto IntervalIsValid;}; 
    if (ResMajor6th & (NoteDifference == 9)) 
	    {goto IntervalIsValid;}; 
    if (ResMinor7th & (NoteDifference == 10)) 
	    {goto IntervalIsValid;}; 
    if (ResMajor7th & (NoteDifference == 11)) 
	    {goto IntervalIsValid;}; 
    if (ResPerfect8th & (NoteDifference == 12)) 
	    {goto IntervalIsValid;}; 
    goto TopOfSecondNote;   // Must try for the 2nd note again. 
IntervalIsValid:	     
		//    Play the two notes 
	PlayTwoNotes(); 
    UpdateData(FALSE); 
// Make the interval box the centrepiece 
//    GetDlgItem(IDC_RELATIVE_INTERVAL) ->SetFocus();	 
// Recalculate all the check boxes 
	for (i = 1;i < 13; i++) 
		{A_Selection_Clicked_Routine(i);}; 
 
 	//  Do not allow another set of notes until user responds to this set 
	strcpy(RelativePlayNoteStatus,"Replay"); 
	m_RelativePlayNotes.SetWindowText(RelativePlayNoteStatus); 
PlayNotesExit: 
	NoteDifference = 0;	 
} 
 
void CRelDlg::PlayTwoNotes() 
{ 
long MidiErr = 0; 
    strncpy(NoteDescription,NoteTable1 + (Random1st-1)*3, 3);  
	strcpy(FirstNoteDescription,NoteDescription); 
			    	 
    strncpy(NoteDescription,NoteTable1 + (Random2nd-1)*3, 3);  
	strcpy(SecondNoteDescription,NoteDescription); 
	SecondNoteValue = 0; 
	if (RelativeWaitLength == 0) 
	{ 
		MidiErr = PlayRelativeNote(Random1st, Random2nd); // Play notes together 
	} 
	else 
	{ 
		MidiErr = PlayRelativeNote(Random1st, SecondNoteValue); // Play 1st note of pair 
		// delay between notes   
		DoRelativeWait(RelativeWaitLength);  
		//  Now play the 2nd note of the set	 
		MidiErr = PlayRelativeNote(Random2nd, SecondNoteValue); // Play 2nd note of pair               
	} 
} 
void CRelDlg::RelativeReplayNotes()  
{ 
long MidiErr = 0; 
 	//WaitTypeSwitch = 1; 
	if (RelativeWaitLength == 0) 
	{		 
		MidiErr = PlayRelativeNote(Random1st, Random2nd); // Play 1st note of pair 
	} 
	else 
	{ 
		MidiErr = PlayRelativeNote(Random1st, SecondNoteValue); // Play 1st note of pair 
		DoRelativeWait(RelativeWaitLength); 
		//WaitTypeSwitch = 1; 
		MidiErr = PlayRelativeNote(Random2nd, SecondNoteValue); // Play 2nd note of pair 
    } 
} 
 
void CRelDlg::OnRelativeScore()  
{ 
char score_message[64]; 
char score_analysis[1681]; 
char score_work1[280], score_work2[280]; 
char charwork[12]; 
char note_work[64] = "", note_compressed[16]; 
CScRDlg dlg; 
	strcpy(score_message, "You have answered "); 
	itoa(RelativeCorrect,charresultR,10); 
	strcat(score_message,charresultR); 
	strcat(score_message," correctly out of "); 
	itoa(RelativeGuesses,charresultR,10); 
	strcat(score_message,charresultR); 
	strcat(score_message," attempts.");	 
	dlg.m_relative_score_summary = score_message; 
 
	strcpy(score_analysis,""); 
	for (int i = 0; i < 13; i++) 
		{ 
	    if (RelativeNoteResults[i][0] != 0) 
	    	{ 
	    	strcpy(note_work,""); strcpy(charwork,""); 
	    	strncpy(note_work,IntervalTable + (i)*15, 14);      
			strcat(score_analysis,note_work);               
			strcat(score_analysis,"("); 
			itoa(RelativeNoteResults[i][0],charwork,10); 
			strcat(score_analysis,charwork); 
			strcat(score_analysis,") "); 
		 
			strcat(score_analysis,"Correct("); 
			itoa(RelativeNoteResults[i][1],charwork,10); 
			strcat(score_analysis,charwork); 
			strcat(score_analysis,")   "); 
			strcpy(score_work1,""); 
			for (int j = 2; j < 15; j++) // Go through columns 3-15 
				{ 
			     	if (RelativeNoteResults[i][j] != 0) 
			     		{ 
			     		 	if (i+2 != j) 
			     		 	{ 
			     		 		strcpy(note_work,""); 
			     		 		strcpy(charwork,""); 
			     		 		strncpy(note_work,IntervalTable + (j-2)*15, 14); 
			     		 		CompressString(note_work,note_compressed); 
			     		 		strcat(score_work1,note_compressed); 
			     		 		strcat(score_work1,"("); 
						 		itoa(RelativeNoteResults[i][j],charwork,10); 
						 		strcat(score_work1,charwork); 
						 		strcat(score_work1,"),"); 
						 	} 
						} 
				} 
			CompressString(score_work1,score_work2); 
			strcat(score_analysis,score_work2); 
			strcat(score_analysis,"\n\n"); 
          } 
    } 
	dlg.m_relative_score_details = score_analysis; 
	UpdateData(FALSE); 
	dlg.DoModal();	 
} 
//////////////////////////////////////////////////////////////////////////////////// 
/////Compress a string from left to right allowing only one continuous space//////// 
//////////////////////////////////////////////////////////////////////////////////// 
void CRelDlg::CompressString(char * InputString, char * OutputString) 
{ 
       
    strcpy(OutputString,"");   // Clear before processing 
 
    while ( *InputString != '\0') 
    	{ 
         if (*InputString == ' ') 
         	{ 
         		*OutputString++ = *InputString++;  // Move first space across 
         		while (*InputString == ' ') 
         			{InputString++;}               // Bypass remaining spaces 
         	} 
         else 
     	 	{*OutputString++ = *InputString++;}; 
        } 
 // Added special code to ensure we do not end string on a comma or a blank 
        *OutputString--;  // Point back to last character output 
//        while ((*OutputString == ',') | (**OutputString == ' ')) 
//        		{*OutputString--;}; 
         
//        *++OutputString = '\0'; // Indicate end of new string 
} 
 
void CRelDlg::OnRelativeSelectedAll(short FAR* Value)  
{ 
	 
bool CheckCondition;	 
int i; 
 
	if (BypassSelectionAllRoutine == 1) goto OnClickRelativeSelectionAllExit; 
	OnlyResetingSwitch = 1; 
 
//    if (m_relative_selected_all.GetCheck())    // Is currently off?                 
    if (AllSelectionSwitch == 0)    // Is currently off?                 
    {                               // yes                               
		CheckCondition = TRUE; 
    	//ChangeRelativeSelectedNoteBoxes(TRUE);          
		m_relative_selected_unison.SetCheck(TRUE); 
		m_relative_selected_minor_2nd.SetCheck(TRUE); 
		m_relative_selected_major_2nd.SetCheck(TRUE); 
		m_relative_selected_minor_3rd.SetCheck(TRUE); 
		m_relative_selected_major_3rd.SetCheck(TRUE); 
		m_relative_selected_perfect_4th.SetCheck(TRUE); 
		m_relative_selected_diminished_5th.SetCheck(TRUE); 
		m_relative_selected_perfect_5th.SetCheck(TRUE); 
		m_relative_selected_minor_6th.SetCheck(TRUE); 
		m_relative_selected_major_6th.SetCheck(TRUE); 
		m_relative_selected_minor_7th.SetCheck(TRUE); 
		m_relative_selected_major_7th.SetCheck(TRUE); 
		m_relative_selected_perfect_8th.SetCheck(TRUE); 
		m_relative_selected_all.SetCheck(TRUE); 
 
		m_relative_selected_unison.SetTextColor(GreenColour); 
		m_relative_selected_minor_2nd.SetTextColor(GreenColour); 
		m_relative_selected_major_2nd.SetTextColor(GreenColour); 
		m_relative_selected_minor_3rd.SetTextColor(GreenColour); 
		m_relative_selected_major_3rd.SetTextColor(GreenColour); 
		m_relative_selected_perfect_4th.SetTextColor(GreenColour); 
		m_relative_selected_diminished_5th.SetTextColor(GreenColour); 
		m_relative_selected_perfect_5th.SetTextColor(GreenColour); 
		m_relative_selected_minor_6th.SetTextColor(GreenColour); 
		m_relative_selected_major_6th.SetTextColor(GreenColour); 
		m_relative_selected_minor_7th.SetTextColor(GreenColour); 
		m_relative_selected_major_7th.SetTextColor(GreenColour); 
		m_relative_selected_perfect_8th.SetTextColor(GreenColour); 
		m_relative_selected_all.SetTextColor(GreenColour); 
		 
		 
		AllSelectionSwitch = 1; 
		 
		 
	 
	 
	} 
	else            // no, it is currently on 
    { 
		CheckCondition = FALSE; 
    	//ChangeRelativeSelectedNoteBoxes(FALSE);          
		m_relative_selected_unison.SetCheck(FALSE); 
		m_relative_selected_minor_2nd.SetCheck(FALSE); 
		m_relative_selected_major_2nd.SetCheck(FALSE); 
		m_relative_selected_minor_3rd.SetCheck(FALSE); 
		m_relative_selected_major_3rd.SetCheck(FALSE); 
		m_relative_selected_perfect_4th.SetCheck(FALSE); 
		m_relative_selected_diminished_5th.SetCheck(FALSE); 
		m_relative_selected_perfect_5th.SetCheck(FALSE); 
		m_relative_selected_minor_6th.SetCheck(FALSE); 
		m_relative_selected_major_6th.SetCheck(FALSE); 
		m_relative_selected_minor_7th.SetCheck(FALSE); 
		m_relative_selected_major_7th.SetCheck(FALSE); 
		m_relative_selected_perfect_8th.SetCheck(FALSE); 
		m_relative_selected_all.SetCheck(FALSE); 
 
		m_relative_selected_unison.SetTextColor(RedColour); 
		m_relative_selected_minor_2nd.SetTextColor(RedColour); 
		m_relative_selected_major_2nd.SetTextColor(RedColour); 
		m_relative_selected_minor_3rd.SetTextColor(RedColour); 
		m_relative_selected_major_3rd.SetTextColor(RedColour); 
		m_relative_selected_perfect_4th.SetTextColor(RedColour); 
		m_relative_selected_diminished_5th.SetTextColor(RedColour); 
		m_relative_selected_perfect_5th.SetTextColor(RedColour); 
		m_relative_selected_minor_6th.SetTextColor(RedColour); 
		m_relative_selected_major_6th.SetTextColor(RedColour); 
		m_relative_selected_minor_7th.SetTextColor(RedColour); 
		m_relative_selected_major_7th.SetTextColor(RedColour); 
		m_relative_selected_perfect_8th.SetTextColor(RedColour); 
		m_relative_selected_all.SetTextColor(RedColour); 
		 
		AllSelectionSwitch = 0; 
		 
 
		TurnOffAllSelected(); 
	}; 
OnClickRelativeSelectionAllExit: 
 
	// Recalculate all the check boxes 
	for (i = 1;i < 14; i++) 
		{A_Selection_Clicked_Routine(i);}; 
 
	OnlyResetingSwitch = 0; 
	BypassSelectionAllRoutine = 0;	 
	GetDlgItem(IDC_RelativePlayNotes) ->EnableWindow(CheckCondition); 
 
	ResSelectedAll = CheckCondition; 
 
 
} 
void CRelDlg::OnRelativeSelectedUnison(short FAR* Value)  
{A_Selection_Clicked_Routine(1);} 
 
void CRelDlg::OnRelativeSelectedMinor2nd(short FAR* Value)  
{A_Selection_Clicked_Routine(2);} 
 
void CRelDlg::OnRelativeSelectedMajor2nd(short FAR* Value)  
{A_Selection_Clicked_Routine(3);} 
 
void CRelDlg::OnRelativeSelectedMinor3rd(short FAR* Value)  
{A_Selection_Clicked_Routine(4);} 
 
void CRelDlg::OnRelativeSelectedMajor3rd(short FAR* Value)  
{A_Selection_Clicked_Routine(5);} 
 
void CRelDlg::OnRelativeSelectedPerfect4th(short FAR* Value)  
{A_Selection_Clicked_Routine(6);} 
 
void CRelDlg::OnRelativeSelectedDiminished5th(short FAR* Value)  
{A_Selection_Clicked_Routine(7);} 
 
void CRelDlg::OnRelativeSelectedPerfect5th(short FAR* Value)  
{A_Selection_Clicked_Routine(8);} 
 
void CRelDlg::OnRelativeSelectedMinor6th(short FAR* Value)  
{A_Selection_Clicked_Routine(9);} 
 
void CRelDlg::OnRelativeSelectedMajor6th(short FAR* Value)  
{A_Selection_Clicked_Routine(10);} 
 
void CRelDlg::OnRelativeSelectedMinor7th(short FAR* Value)  
{A_Selection_Clicked_Routine(11);} 
 
void CRelDlg::OnRelativeSelectedMajor7th(short FAR* Value)  
{A_Selection_Clicked_Routine(12);} 
 
void CRelDlg::OnRelativeSelectedPerfect8th(short FAR* Value)  
{A_Selection_Clicked_Routine(13);} 
 
void CRelDlg::A_Selection_Clicked_Routine(int LocalNoteSwitch) 
{ 
	ResUnison = m_relative_selected_unison.GetCheck(); 
	ResMinor2nd = m_relative_selected_minor_2nd.GetCheck(); 
	ResMajor2nd = m_relative_selected_major_2nd.GetCheck(); 
	ResMinor3rd = m_relative_selected_minor_3rd.GetCheck(); 
	ResMajor3rd = m_relative_selected_major_3rd.GetCheck(); 
	ResPerfect4th = m_relative_selected_perfect_4th.GetCheck(); 
	ResDiminished5th = m_relative_selected_diminished_5th.GetCheck(); 
	ResPerfect5th = m_relative_selected_perfect_5th.GetCheck(); 
	ResMinor6th = m_relative_selected_minor_6th.GetCheck(); 
	ResMajor6th = m_relative_selected_major_6th.GetCheck(); 
	ResMinor7th = m_relative_selected_minor_7th.GetCheck(); 
	ResMajor7th = m_relative_selected_major_7th.GetCheck(); 
	ResPerfect8th = m_relative_selected_perfect_8th.GetCheck(); 
	ResSelectedAll = m_relative_selected_all.GetCheck(); 
 
	 
    switch (LocalNoteSwitch) 
    	{ 
    		case 1: 
    		if (ResUnison) 
					{m_relative_selected_unison.SetTextColor(GreenColour); 
					m_relative_unison.SetTextColor(GreenColour);} 
			else 
			{m_relative_selected_unison.SetTextColor(RedColour); 
					m_relative_unison.SetTextColor(RedColour); 
					TurnOffAllSelected();}; 
                break; 
    		case 2: 
    		if (ResMinor2nd) 
				{m_relative_selected_minor_2nd.SetTextColor(GreenColour); 
					m_relative_minor_2nd.SetTextColor(GreenColour);} 
			else 
				{m_relative_selected_minor_2nd.SetTextColor(RedColour); 
					m_relative_minor_2nd.SetTextColor(RedColour); 
					TurnOffAllSelected();}; 
                break; 
    		case 3: 
    		if (ResMajor2nd) 
				{m_relative_selected_major_2nd.SetTextColor(GreenColour); 
					m_relative_major_2nd.SetTextColor(GreenColour);} 
			else 
				{m_relative_selected_major_2nd.SetTextColor(RedColour); 
					m_relative_major_2nd.SetTextColor(RedColour); 
					TurnOffAllSelected();}; 
                break; 
    		case 4: 
    		if (ResMinor3rd) 
				{m_relative_selected_minor_3rd.SetTextColor(GreenColour); 
					m_relative_minor_3rd.SetTextColor(GreenColour);} 
			else 
				{m_relative_selected_minor_3rd.SetTextColor(RedColour); 
					m_relative_minor_3rd.SetTextColor(RedColour); 
					TurnOffAllSelected();}; 
                break; 
    		case 5: 
    		if (ResMajor3rd) 
				{m_relative_selected_major_3rd.SetTextColor(GreenColour); 
					m_relative_major_3rd.SetTextColor(GreenColour);} 
			else 
				{m_relative_selected_major_3rd.SetTextColor(RedColour); 
					m_relative_major_3rd.SetTextColor(RedColour); 
					TurnOffAllSelected();}; 
                break; 
    		case 6: 
    		if (ResPerfect4th) 
				{m_relative_selected_perfect_4th.SetTextColor(GreenColour); 
					m_relative_perfect_4th.SetTextColor(GreenColour);} 
			else 
				{m_relative_selected_perfect_4th.SetTextColor(RedColour); 
					m_relative_perfect_4th.SetTextColor(RedColour); 
					TurnOffAllSelected();}; 
                break; 
    		case 7: 
    		if (ResDiminished5th) 
				{m_relative_selected_diminished_5th.SetTextColor(GreenColour); 
					m_relative_diminished_5th.SetTextColor(GreenColour);} 
			else 
				{m_relative_selected_diminished_5th.SetTextColor(RedColour); 
					m_relative_diminished_5th.SetTextColor(RedColour); 
					TurnOffAllSelected();}; 
                break; 
    		case 8: 
    		if (ResPerfect5th) 
				{m_relative_selected_perfect_5th.SetTextColor(GreenColour); 
					m_relative_perfect_5th.SetTextColor(GreenColour);} 
			else 
				{m_relative_selected_perfect_5th.SetTextColor(RedColour); 
					m_relative_perfect_5th.SetTextColor(RedColour); 
					TurnOffAllSelected();}; 
                break; 
    		case 9: 
    		if (ResMinor6th) 
				{m_relative_selected_minor_6th.SetTextColor(GreenColour); 
					m_relative_minor_6th.SetTextColor(GreenColour);} 
			else 
				{m_relative_selected_minor_6th.SetTextColor(RedColour); 
					m_relative_minor_6th.SetTextColor(RedColour); 
					TurnOffAllSelected();}; 
                break; 
    		case 10: 
    		if (ResMajor6th) 
				{m_relative_selected_major_6th.SetTextColor(GreenColour); 
					m_relative_major_6th.SetTextColor(GreenColour);} 
			else 
				{m_relative_selected_major_6th.SetTextColor(RedColour); 
					m_relative_major_6th.SetTextColor(RedColour); 
					TurnOffAllSelected();}; 
                break; 
    		case 11: 
    		if (ResMinor7th) 
				{m_relative_selected_minor_7th.SetTextColor(GreenColour); 
					m_relative_minor_7th.SetTextColor(GreenColour);} 
			else 
				{m_relative_selected_minor_7th.SetTextColor(RedColour); 
					m_relative_minor_7th.SetTextColor(RedColour); 
					TurnOffAllSelected();}; 
                break; 
    		case 12: 
    		if (ResMajor7th) 
				{m_relative_selected_major_7th.SetTextColor(GreenColour); 
					m_relative_major_7th.SetTextColor(GreenColour);} 
			else 
				{m_relative_selected_major_7th.SetTextColor(RedColour); 
					m_relative_major_7th.SetTextColor(RedColour); 
					TurnOffAllSelected();}; 
                break; 
    		case 13: 
    		if (ResPerfect8th) 
				{m_relative_selected_perfect_8th.SetTextColor(GreenColour); 
					m_relative_perfect_8th.SetTextColor(GreenColour);} 
			else 
				{m_relative_selected_perfect_8th.SetTextColor(RedColour); 
					m_relative_perfect_8th.SetTextColor(RedColour); 
					TurnOffAllSelected();}; 
                break; 
		}	// End of switch processing          
	 
	 
	 
	strcpy(RelativePlayNoteStatus,"Play"); 
	m_RelativePlayNotes.SetWindowText(RelativePlayNoteStatus); 
	//  If any interval boxes are true, allow PlayNote button to be pushed 
	if (ResUnison     | ResMinor2nd   | ResMajor2nd      | ResMinor3rd |  
		ResMajor3rd   | ResPerfect4th | ResDiminished5th | ResPerfect5th |            
		ResMinor6th   | ResMajor6th   | ResMinor7th      | ResMajor7th |              
		ResPerfect8th)	            
			{GetDlgItem(IDC_RelativePlayNotes) ->EnableWindow(TRUE);}             
	else 
			{GetDlgItem(IDC_RelativePlayNotes) ->EnableWindow(FALSE);}; 
 
	// If all check boxes are on, set the 'All' box to green, etc. 
	if (ResUnison   & ResMinor2nd   & ResMajor2nd      & ResMinor3rd & 
		ResMajor3rd & ResPerfect4th & ResDiminished5th & ResPerfect5th & 
		ResMinor6th & ResMajor6th   & ResMinor7th      & ResMajor7th & 
		ResPerfect8th)	 
		{ 
		BypassSelectionAllRoutine = 1; 
		m_relative_selected_all.SetTextColor(GreenColour); 
		m_relative_selected_all.SetCheck(TRUE); 
		BypassSelectionAllRoutine = 0; 
	    AllSelectionSwitch = 1; 
    	}  
	else 
		{ 
		BypassSelectionAllRoutine = 0; 
		m_relative_selected_all.SetTextColor(RedColour); 
		m_relative_selected_all.SetCheck(FALSE); 
		BypassSelectionAllRoutine = 1; 
	    AllSelectionSwitch = 0; 
    	};  
 
 
} 
 
void CRelDlg::OnRelativeUnison(short FAR* Value)  
{A_Guess_Clicked_Routine(0);} 
 
void CRelDlg::OnRelativeMinor2nd(short FAR* Value)  
{A_Guess_Clicked_Routine(1);} 
 
void CRelDlg::OnRelativeMajor2nd(short FAR* Value)  
{A_Guess_Clicked_Routine(2);} 
 
void CRelDlg::OnRelativeMinor3rd(short FAR* Value)  
{A_Guess_Clicked_Routine(3);} 
 
void CRelDlg::OnRelativeMajor3rd(short FAR* Value)  
{A_Guess_Clicked_Routine(4);} 
 
void CRelDlg::OnRelativePerfect4th(short FAR* Value)  
{A_Guess_Clicked_Routine(5);} 
 
void CRelDlg::OnRelativeDiminished5th(short FAR* Value)  
{A_Guess_Clicked_Routine(6);} 
 
void CRelDlg::OnRelativePerfect5th(short FAR* Value)  
{A_Guess_Clicked_Routine(7);} 
 
void CRelDlg::OnRelativeMinor6th(short FAR* Value)  
{A_Guess_Clicked_Routine(8);} 
 
void CRelDlg::OnRelativeMajor6th(short FAR* Value)  
{A_Guess_Clicked_Routine(9);} 
 
void CRelDlg::OnRelativeMinor7th(short FAR* Value)  
{A_Guess_Clicked_Routine(10);} 
 
void CRelDlg::OnRelativeMajor7th(short FAR* Value)  
{A_Guess_Clicked_Routine(11);} 
 
void CRelDlg::OnRelativePerfect8th(short FAR* Value)  
{A_Guess_Clicked_Routine(12);} 
// 
//   Following function is called when a user presses one of the  
//   enabled 'play' buttons 
// 
void CRelDlg::A_Guess_Clicked_Routine(int LocalNoteSwitch) 
{ 
int RandomWork= 0;     
//LocalNoteSwitch--; 
 	if (OnlyResetingSwitch == 0) 
       { 
		UpdateData(TRUE); 
		// Create a variable for each check box 
		RandomWork = Random2nd - Random1st; 
    	if (RandomWork < 0)                 //   Only interested in a positive result 
    		{RandomWork = RandomWork * -1;}; 
    	RelativeGuesses++; 
        RelativeNoteResults[RandomWork][0]++; //  This increases the total for note played  
   		strcpy(IntervalDescription,"Wrong, interval was "); 
    	strncat(IntervalDescription,IntervalTable + (RandomWork)*15, 15);  
    	strcat(IntervalDescription,"\nFirst note was "); 
    	strcat(IntervalDescription,FirstNoteDescription); 
    	strcat(IntervalDescription,"\nSecond note was "); 
    	strcat(IntervalDescription,SecondNoteDescription); 
    	if (RandomWork == LocalNoteSwitch)                    	 
    		{strcpy(IntervalDescription,"Correct"); 
    	 	RelativeCorrect++; 
    	 	RelativeNoteResults[RandomWork][1]++; 
    		}; 
		RelativeNoteResults[RandomWork][LocalNoteSwitch + 2]++; // Increase total user guessed 
		m_relative_interval = IntervalDescription; 
    	UpdateData(FALSE); 
		GetDlgItem(IDC_RELATIVE_INTERVAL) ->ShowWindow(SW_SHOW);               
    	GetDlgItem(IDC_RelativePlayNotes) ->EnableWindow(TRUE);          
				 
		strcpy(RelativePlayNoteStatus,"Play"); 
		m_RelativePlayNotes.SetWindowText(RelativePlayNoteStatus); 
    	// Disable all guess boxes until another note sequence is played                 			 
		m_relative_unison.EnableWindow(FALSE); 
		m_relative_minor_2nd.EnableWindow(FALSE); 
		m_relative_major_2nd.EnableWindow(FALSE); 
		m_relative_minor_3rd.EnableWindow(FALSE); 
		m_relative_major_3rd.EnableWindow(FALSE); 
		m_relative_perfect_4th.EnableWindow(FALSE); 
		m_relative_diminished_5th.EnableWindow(FALSE); 
		m_relative_perfect_5th.EnableWindow(FALSE); 
		m_relative_minor_6th.EnableWindow(FALSE); 
		m_relative_major_6th.EnableWindow(FALSE); 
		m_relative_minor_7th.EnableWindow(FALSE); 
		m_relative_major_7th.EnableWindow(FALSE); 
		m_relative_perfect_8th.EnableWindow(FALSE); 
	// Make selection boxes available for ticking 
		EnableSelectionCheckBoxes(); 
	}	 
} 
 
void CRelDlg::OnGetOutOfRelative()  
{ 
	CDialog::OnOK(); 
} 
 
void CRelDlg::ChangeRelativeNoteBoxes(int ChangeType) 
{ 
	GetDlgItem(IDC_RELATIVE_UNISON) ->EnableWindow(ChangeType);             
	GetDlgItem(IDC_RELATIVE_MINOR_2ND) ->EnableWindow(ChangeType);          
	GetDlgItem(IDC_RELATIVE_MAJOR_2ND) ->EnableWindow(ChangeType);          
	GetDlgItem(IDC_RELATIVE_MINOR_3RD) ->EnableWindow(ChangeType);          
	GetDlgItem(IDC_RELATIVE_MAJOR_3RD) ->EnableWindow(ChangeType);          
	GetDlgItem(IDC_RELATIVE_PERFECT_4TH) ->EnableWindow(ChangeType);        
	GetDlgItem(IDC_RELATIVE_DIMINISHED_5TH) ->EnableWindow(ChangeType);     
	GetDlgItem(IDC_RELATIVE_PERFECT_5TH) ->EnableWindow(ChangeType);        
	GetDlgItem(IDC_RELATIVE_MINOR_6TH) ->EnableWindow(ChangeType);          
	GetDlgItem(IDC_RELATIVE_MAJOR_6TH) ->EnableWindow(ChangeType);          
	GetDlgItem(IDC_RELATIVE_MINOR_7TH) ->EnableWindow(ChangeType);          
	GetDlgItem(IDC_RELATIVE_MAJOR_7TH) ->EnableWindow(ChangeType);          
	GetDlgItem(IDC_RELATIVE_PERFECT_8TH) ->EnableWindow(ChangeType);        
	GetDlgItem(IDC_RELATIVE_SELECTED_ALL) ->EnableWindow(ChangeType);        
} 
 
void CRelDlg::ChangeRelativeSelectedNoteBoxes(int ChangeType) 
{ 
	GetDlgItem(IDC_RELATIVE_SELECTED_UNISON) ->EnableWindow(ChangeType);             
	GetDlgItem(IDC_RELATIVE_SELECTED_MINOR_2ND) ->EnableWindow(ChangeType);          
	GetDlgItem(IDC_RELATIVE_SELECTED_MAJOR_2ND) ->EnableWindow(ChangeType);          
	GetDlgItem(IDC_RELATIVE_SELECTED_MINOR_3RD) ->EnableWindow(ChangeType);          
	GetDlgItem(IDC_RELATIVE_SELECTED_MAJOR_3RD) ->EnableWindow(ChangeType);          
	GetDlgItem(IDC_RELATIVE_SELECTED_PERFECT_4TH) ->EnableWindow(ChangeType);        
	GetDlgItem(IDC_RELATIVE_SELECTED_DIMINISHED_5TH) ->EnableWindow(ChangeType);     
	GetDlgItem(IDC_RELATIVE_SELECTED_PERFECT_5TH) ->EnableWindow(ChangeType);        
	GetDlgItem(IDC_RELATIVE_SELECTED_MINOR_6TH) ->EnableWindow(ChangeType);          
	GetDlgItem(IDC_RELATIVE_SELECTED_MAJOR_6TH) ->EnableWindow(ChangeType);          
	GetDlgItem(IDC_RELATIVE_SELECTED_MINOR_7TH) ->EnableWindow(ChangeType);          
	GetDlgItem(IDC_RELATIVE_SELECTED_MAJOR_7TH) ->EnableWindow(ChangeType);          
	GetDlgItem(IDC_RELATIVE_SELECTED_PERFECT_8TH) ->EnableWindow(ChangeType);        
	GetDlgItem(IDC_RELATIVE_SELECTED_ALL) ->EnableWindow(ChangeType);        
} 
 
void CRelDlg::TurnOffAllSelected() 
{ 
//	m_relative_selected_all.SetForeColor(BlackColour); 
	OnlyResetingSwitch = 1; 
	//  Because the following turning off of the "all" checkbox causes the routine 
	//   to be executed, we use a switch to effectively bypass the routine 
	BypassSelectionAllRoutine = 1; 
	m_relative_selected_all.SetCheck(FALSE);	// Turn tick box off 
	BypassSelectionAllRoutine = 0; 
	OnlyResetingSwitch = 0; 
	AllSelectionSwitch = 0;                      // Indicate "all" is off 
} 
 
void CRelDlg::EnableGuessedCheckBoxes()              
{ 
	if (ResUnison)           
	{m_relative_unison.EnableWindow(TRUE);};             
	if (ResMinor2nd)        
	{m_relative_minor_2nd.EnableWindow(TRUE);};          
	if (ResMajor2nd)        
	{m_relative_major_2nd.EnableWindow(TRUE);};          
	if (ResMinor3rd)        
	{m_relative_minor_3rd.EnableWindow(TRUE);};          
	if (ResMajor3rd)        
	{m_relative_major_3rd.EnableWindow(TRUE);};          
	if (ResPerfect4th)      
	{m_relative_perfect_4th.EnableWindow(TRUE);};        
	if (ResDiminished5th)   
	{m_relative_diminished_5th.EnableWindow(TRUE);};     
	if (ResPerfect5th)      
	{m_relative_perfect_5th.EnableWindow(TRUE);};        
	if (ResMinor6th)        
	{m_relative_minor_6th.EnableWindow(TRUE);};          
	if (ResMajor6th)        
	{m_relative_major_6th.EnableWindow(TRUE);};          
	if (ResMinor7th)        
	{m_relative_minor_7th.EnableWindow(TRUE);};          
	if (ResMajor7th)        
	{m_relative_major_7th.EnableWindow(TRUE);};          
	if (ResPerfect8th)      
	{m_relative_perfect_8th.EnableWindow(TRUE);};        
} 
 
void CRelDlg::EnableSelectionCheckBoxes()              
{ 
	m_relative_selected_unison.EnableWindow(TRUE); 
	m_relative_selected_minor_2nd.EnableWindow(TRUE); 
	m_relative_selected_major_2nd.EnableWindow(TRUE); 
	m_relative_selected_minor_3rd.EnableWindow(TRUE); 
	m_relative_selected_major_3rd.EnableWindow(TRUE); 
	m_relative_selected_perfect_4th.EnableWindow(TRUE); 
	m_relative_selected_diminished_5th.EnableWindow(TRUE); 
	m_relative_selected_perfect_5th.EnableWindow(TRUE); 
	m_relative_selected_minor_6th.EnableWindow(TRUE); 
	m_relative_selected_major_6th.EnableWindow(TRUE); 
	m_relative_selected_minor_7th.EnableWindow(TRUE); 
	m_relative_selected_major_7th.EnableWindow(TRUE); 
	m_relative_selected_perfect_8th.EnableWindow(TRUE); 
	m_relative_selected_all.EnableWindow(TRUE); 
 
	if (ResUnison)           
	{m_relative_selected_unison.SetTextColor(GreenColour);} 
	if (ResMinor2nd)        
	{m_relative_selected_minor_2nd.SetTextColor(GreenColour);} 
	if (ResMajor2nd)        
	{m_relative_selected_major_2nd.SetTextColor(GreenColour);} 
	if (ResMinor3rd)        
	{m_relative_selected_minor_3rd.SetTextColor(GreenColour);} 
	if (ResMajor3rd)        
	{m_relative_selected_major_3rd.SetTextColor(GreenColour);} 
	if (ResPerfect4th)      
	{m_relative_selected_perfect_4th.SetTextColor(GreenColour);} 
	if (ResDiminished5th)   
	{m_relative_selected_diminished_5th.SetTextColor(GreenColour);} 
	if (ResPerfect5th)      
	{m_relative_selected_perfect_5th.SetTextColor(GreenColour);} 
	if (ResMinor6th)        
	{m_relative_selected_minor_6th.SetTextColor(GreenColour);} 
	if (ResMajor6th)        
	{m_relative_selected_major_6th.SetTextColor(GreenColour);} 
	if (ResMinor7th)        
	{m_relative_selected_minor_7th.SetTextColor(GreenColour);} 
	if (ResMajor7th)        
	{m_relative_selected_major_7th.SetTextColor(GreenColour);} 
	if (ResPerfect8th)      
	{m_relative_selected_perfect_8th.SetTextColor(GreenColour);} 
	if (ResSelectedAll)      
	{m_relative_selected_all.SetTextColor(GreenColour);} 
//	UpdateData(FALSE); 
 
 
} 
 
void CRelDlg::KillGuessedCheckBoxes() 
{ 
	m_relative_unison.EnableWindow(FALSE); 
	m_relative_minor_2nd.EnableWindow(FALSE); 
	m_relative_major_2nd.EnableWindow(FALSE); 
	m_relative_minor_3rd.EnableWindow(FALSE); 
	m_relative_major_3rd.EnableWindow(FALSE); 
	m_relative_perfect_4th.EnableWindow(FALSE); 
	m_relative_diminished_5th.EnableWindow(FALSE); 
	m_relative_perfect_5th.EnableWindow(FALSE); 
	m_relative_minor_6th.EnableWindow(FALSE); 
	m_relative_major_6th.EnableWindow(FALSE); 
	m_relative_minor_7th.EnableWindow(FALSE); 
	m_relative_major_7th.EnableWindow(FALSE); 
	m_relative_perfect_8th.EnableWindow(FALSE); 
} 
 
void CRelDlg::OnTimer(UINT nIDEvent) 
{ 
	RelativeTimerWaitSwitch = 1; 
	CDialog::OnTimer(nIDEvent); 
} 
 
void CRelDlg::DoRelativeWait(int WaitTimeInMilliseconds) 
{ 
	RelativeTimerWaitSwitch = 0; 
	RelativeTimerKey = SetTimer(1, WaitTimeInMilliseconds, NULL);                           
	ASSERT(RelativeTimerKey !=0); 
//  Wait until the timer changes RelativeTimerWaitSwitch to non zero.  
//  The PeekMessage will allow the message through 
	while (RelativeTimerWaitSwitch == 0)                                                   
		{if(::PeekMessage(&RelativeMessage, NULL, 0, 0, PM_REMOVE))                    
			{                                                                     
			::TranslateMessage(&RelativeMessage);                                         
			::DispatchMessage(&RelativeMessage);                                          
			}  
        }; 
	KillTimer(RelativeTimerKey);  
	//WaitTypeSwitch = 1;  // Default 
} 
 
// The following function is really only for debugging 
void CRelDlg::OnRButtonDown(UINT nFlags, CPoint point) 
{ 
	// Display the pop up menu seection on right mouse button down 
CRect rect; 
CPoint TL;  
	int x; int y; 
	GetWindowRect(&rect); 
	TL = rect.TopLeft();  
	RelativeX = TL.x;  RelativeY = TL.y; 
	x = point.x + RelativeX + 20; y = point.y + RelativeY + 17; 
	CPitchDlg PopupTime;  
	PopupTime.ProcessPopupMenu(x,y); 
 
	CDialog::OnRButtonDown(nFlags, point); 
} 
 
void CRelDlg::OnRButtonUp(UINT nFlags, CPoint point) 
{ 
		m_relative_interval = ""; 
    	UpdateData(FALSE); 
	 
	CDialog::OnRButtonUp(nFlags, point); 
} 
 
void CRelDlg::OnUp() 
{ 
	UpDownSwitch = 0; 
    m_up = 0;      
	UpdateData(FALSE); 
} 
 
void CRelDlg::OnDown() 
{ 
	UpDownSwitch = 1; 
    m_up = 1;      
	UpdateData(FALSE); 
} 
 
void CRelDlg::OnUpdown() 
{ 
	UpDownSwitch = 2;	 
    m_up = 2;      
	UpdateData(FALSE); 
} 
 void CRelDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{ 
	int iCurrent; 
	//  PScrollBar is a pointer to the control being updated 
    //  pSB_Low and pSB_High are the pointers to the two range scroll bars 
 
	CScrollBar* pSB_Low  = (CScrollBar*) GetDlgItem(IDC_RELATIVE_LOW_RANGE);  
	CScrollBar* pSB_High = (CScrollBar*) GetDlgItem(IDC_RELATIVE_HIGH_RANGE);  
	CScrollBar* pSB_Speed = (CScrollBar*) GetDlgItem(IDC_RELATIVE_SPEED);   
    // Get the current position 
    iCurrent = pScrollBar->GetScrollPos();                               
	if (pScrollBar == (CScrollBar*) pSB_Speed) 
	   {goto ProcessSpeedScroll;}; 
	 
	switch (nSBCode) 
		{ 
		case SB_THUMBPOSITION:                                                 
		pScrollBar->SetScrollPos (nPos);                                       
		break; 
		 
        case SB_LINERIGHT: 
                // Increase current position by 1 (if possible) 
                iCurrent = iCurrent + 1; 
                if ( iCurrent >= m_relative_Scroll_Max ) 
                     iCurrent = m_relative_Scroll_Max; 
                // Set scroll bar to its new position. 
                pScrollBar->SetScrollPos (  iCurrent );                   
                break; 
 
          case SB_LINELEFT: 
                // Decrease current position by 1 (if possible) 
                iCurrent = iCurrent - 1; 
                if ( iCurrent <= m_relative_Scroll_Min ) 
                     iCurrent = m_relative_Scroll_Min; 
                // Set scroll bar to its new position. 
                pScrollBar->SetScrollPos ( iCurrent );                   
                break; 
 
          case SB_PAGERIGHT: 
                 // Increase scroll bar by an octave(if possible). 
                iCurrent = iCurrent + 12; 
                if ( iCurrent >= m_relative_Scroll_Max ) 
                     iCurrent = m_relative_Scroll_Max; 
                // Set scroll bar to its new position. 
                pScrollBar->SetScrollPos ( iCurrent );                   
                break; 
 
          case SB_PAGELEFT: 
                // Decrease scroll bar by an octave(if possible). 
                iCurrent = iCurrent - 12; 
                if ( iCurrent <= m_relative_Scroll_Min ) 
                     iCurrent = m_relative_Scroll_Min; 
                // Set scroll bar to its new position. 
                pScrollBar->SetScrollPos ( iCurrent );                   
                break; 
 
          case SB_THUMBTRACK:                                            
               // Set scroll bar to its new position. 
               pScrollBar->SetScrollPos ( nPos );                        
               break; 
          } 
 
    // Update the caption of the label.		   
	if (pScrollBar == (CScrollBar*) pSB_Low) 
		  {	strncpy(NoteDescription,NoteTable1 + (iCurrent-1)*3, 3);  
    	  	m_relative_low_note = NoteDescription;  
    	  	LowPianoNote = iCurrent;	} 
    else 
		  {	strncpy(NoteDescription,NoteTable1 + (iCurrent-1)*3, 3);  
    	  	m_relative_high_note = NoteDescription;  
    	  	HighPianoNote = iCurrent;	} ; 
	UpdateData(FALSE);      
	goto OnHScrollExit ; 
 
ProcessSpeedScroll:	 
	switch (nSBCode) 
		{ 
		case SB_THUMBPOSITION:                                                 
		pScrollBar->SetScrollPos (nPos);                                       
		break; 
        case SB_LINERIGHT: 
                // Increase current position by 1 (if possible) 
                iCurrent = iCurrent + 1; 
                if ( iCurrent >= m_relative_Speed_Scroll_Max ) 
                     iCurrent = m_relative_Speed_Scroll_Max; 
                // Set scroll bar to its new position. 
                pScrollBar->SetScrollPos ( iCurrent );                   
                break; 
 
          case SB_LINELEFT: 
                // Decrease current position by 1 (if possible) 
                iCurrent = iCurrent - 1; 
                if ( iCurrent <= m_relative_Speed_Scroll_Min ) 
                     iCurrent = m_relative_Speed_Scroll_Min; 
                // Set scroll bar to its new position. 
                pScrollBar->SetScrollPos ( iCurrent );                   
                break; 
 
          case SB_PAGERIGHT: 
                iCurrent = iCurrent + 10; 
                if ( iCurrent >= m_relative_Speed_Scroll_Max ) 
                     iCurrent = m_relative_Speed_Scroll_Max; 
                // Set scroll bar to its new position. 
                pScrollBar->SetScrollPos ( iCurrent );                   
                break; 
 
          case SB_PAGELEFT: 
                iCurrent = iCurrent - 10; 
                if ( iCurrent <= m_relative_Speed_Scroll_Min ) 
                     iCurrent = m_relative_Speed_Scroll_Min; 
                // Set scroll bar to its new position. 
                pScrollBar->SetScrollPos ( iCurrent );                   
                break; 
 
          case SB_THUMBTRACK:                                            
               // Set scroll bar to its new position. 
               pScrollBar->SetScrollPos ( nPos );                        
               break; 
          } 
          RelativeWaitLength = iCurrent*50; 
OnHScrollExit:	 
	CDialog::OnHScroll(nSBCode, nPos, pScrollBar); 
} 
 
void CRelDlg::OnDestroy()  
{ 
	CDialog::OnDestroy();	 
	// Grab the screen location at end for the registry 
	CRect rect; 
	GetWindowRect(&rect); 
	CPoint TL, BR; 
	TL = rect.TopLeft(); BR = rect.BottomRight(); 
	RelativeX = TL.x;  RelativeY = TL.y; 
	rect.NormalizeRect(); 
	RelativeWidth = rect.Width(); RelativeHeight = rect.Height(); 
} 
 
long CRelDlg::PlayRelativeNote(int NoteNumber1, int NoteNumber2) 
{ 
	CPitchDlg abc; 
	long NoteError = 0; 
	NoteNumber1--;  
	if (NoteNumber2 > 0) {NoteNumber2--;} 
	SecondChannel = CurrentChannel+1; 
	bStatus   = MIDI_PROGRAM_CHANGE; 
	bChannel  = CurrentChannel; 
	bData1    = InstrumentNumber;   
	bData2    = '\x00';  // Not used 
	abc.SendShortMessage(); 
	bStatus   = MIDI_NOTE_ON; 
	bChannel  = CurrentChannel; 
	bData1    = NoteNumber1;   
	bData2    = '\x7f';	 // Volume 
	abc.SendShortMessage(); 
	// If a second not sent, get it off now 
	if (NoteNumber2 > 0)  
	{ 
		bStatus   = MIDI_PROGRAM_CHANGE; 
		bChannel  = CurrentChannel; 
		bData1    = InstrumentNumber;   
		bData2    = '\x00';  // Not used 
		abc.SendShortMessage(); 
		bStatus   = MIDI_NOTE_ON; 
		bChannel  = CurrentChannel; 
		bData1    = NoteNumber2;   
		bData2    = '\x7f';	 // Volume 
		abc.SendShortMessage(); 
	} 
	// Wait for timeout 
	DoRelativeWait(NoteWaitTimeLength); 
	bStatus   = MIDI_NOTE_OFF; 
	bChannel  = CurrentChannel; 
	bData1    = NoteNumber1;   
	bData2    = '\x00';	 // Volume 
	abc.SendShortMessage(); 
	// If a second note we must also stop it. 
	if (NoteNumber2 > 0)  
	{ 
		bStatus   = MIDI_NOTE_OFF; 
		bChannel  = CurrentChannel; 
		bData1    = NoteNumber2;   
		bData2    = '\x00';	 // Volume 
		abc.SendShortMessage(); 
	} 
    return (NoteError); 
} 
void CRelDlg::OnRelativeButtonMove(UINT nFlags, CPoint point)  
{ 
 
	if (myHWND == m_RelativeScore.GetSafeHwnd() ) 
	{ 
		itoa(RelativeCorrect,charresultR,10); 
		strcpy(score_workR,charresultR); 
		strcat(score_workR,"  of "); 
		itoa(RelativeGuesses,charresultR,10); 
		strcat(score_workR,charresultR); 
		m_RelativeScore.SetWindowText(score_workR); 
		m_RelativeScore.SetTextColor(PurpleColour); 
		UpdateData(FALSE); 
	} 
	UpdateData(FALSE); 
	 
  CDialog::OnMouseMove(nFlags, point); 
} 
 
void CRelDlg::OnRelativeButtonLeave(WPARAM, LPARAM) 
{ 
	if (myHWND == m_RelativeScore.GetSafeHwnd() ) 
	{ 
		m_RelativeScore.SetWindowText("Score"); 
		UpdateData(FALSE);					 
	} 
	 
} 
 
 
 
 
 
void CRelDlg::OnRelativeTitle()  
{ 
	// TODO: Add your control notification handler code here 
	 
}