为了防止开始、结束、暂停、恢复按钮的随便点击我们可以使用EnableWindow(),其中false是不能操作,true是能操作。例如:在开始时可以就只有开始按钮能使用,其他三个全是不能使用。
初始化时对字体进行设置,
//以下四行程序实现了输入内容字体设置
m_Font1 = new CFont;
m_Font1->CreateFont(25,0,0,0,100,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FF_SWISS,NULL);
CEdit *m_Edit1=(CEdit *)GetDlgItem(IDC_EDIT2);
m_Edit1->SetFont(m_Font1,FALSE);网上说在结束时应该使用delete把CFont删除,但是发现在按下结束按钮后会在一小段时间后字体自动恢复系统默认格式,所以就不适用delete。
使用颜色设置如下:
HBRUSH CMyKeyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
int iNum1 = 0;
int iNum2 = 0;
int iNum3 = 0;
// TODO: 在此更改 DC 的任何属性
switch (m_dialog.iColour)
{
case 0: iNum1 = 128; iNum2 = 64; iNum3 = 0;break;
case 1: iNum1 = 0; iNum2 = 0; iNum3 = 64;break;
case 2: iNum1 = 0; iNum2 = 0; iNum3 = 0;break;
case 3: iNum1 = 255; iNum2 = 0; iNum3 = 0;break;
case 4: iNum1 = 255; iNum2 = 255; iNum3 = 0;break;
case 5: iNum1 = 0; iNum2 = 0; iNum3 = 255;break;
case 6: iNum1 = 0; iNum2 = 255; iNum3 = 0;break;
case 7: iNum1 = 255; iNum2 = 0; iNum3 = 255;break;
default: break;
}
// TODO: 如果默认的不是所需画笔,则返回另一个画笔
if (nCtlColor== CTLCOLOR_EDIT )
{
if(pWnd->GetDlgCtrlID()== IDC_EDIT2)
{
pDC->SetTextColor(RGB(iNum1,iNum2,iNum3));
}
}
return hbr;
}
设置ini文件方便能把以前设置后的内容放置在里面,以下程序是把ini文件中的内容读取出来,至于存放设置程序在子窗口介绍中再做介绍。
GetCurrentDirectory(MAX_PATH, csIniPath);
lstrcat(csIniPath, "//Option.ini");
CIniConfig m_ini(csIniPath);
char szOption1[30] = {0};
m_ini.GetString("section1", "key2", szOption1);
m_dialog.csWord.Format("%s",szOption1);
m_dialog.inComplex = m_ini.GetNumber("section2", "key2");
m_ini.GetString("section3", "key2", m_dialog.szDicPath);
m_dialog.iColour = m_ini.GetNumber("section4", "key2");
以下程序是设置输出单词静态框的字体设置,
m_Font = new CFont;
m_Font->CreateFont(25,0,0,0,100,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FF_SWISS,m_dialog.csWord);
CEdit *m_Edit=(CEdit *)GetDlgItem(IDC_STATIC_DISPLAY);
再次说明:静态框改正id后也能做为edit使用,例如我设置的是IDC_STATIC_DISPLAY
设置整型变量以方便能对正确次数和错误次数进行统计iRight = 0; iWrong = 0;
在OnTimer函数中使用以下操作,
{CString szTmp; CString szEdit02; int k=0; CString random; CString szEdit01;
char* Word;
if (nTimeCount == m_dialog.inComplex)
{
Word = GetNext();
GetDlgItem(IDC_STATIC_DISPLAY)->SetWindowText(Word);//使用静态文本框输出
nTimeCount = 0;
}
m_static.GetWindowText(strEdit1);
m_edit2.GetWindowText(strEdit2);
if(strEdit1.GetLength())//此判断是为了保证有输入时就能及时进行比较
{
if ((strEdit1 == strEdit2) && (nTimeCount < (m_dialog.inComplex - 1)))//比较strEdit1、strEdit2
{
iRight = iRight + 1;
szEdit01.Format("%d",iRight);
SetDlgItemText(IDC_EDIT4, szEdit01);
SetDlgItemText(IDC_EDIT2, NULL);//此步是为了保证循环能顺利进行以防一直运行TRUE
nTimeCount = m_dialog.inComplex - 1;
SetDlgItemText(IDC_EDIT3, "right");
}
else
{
if (nTimeCount ==(m_dialog.inComplex) - 1)
{
SetDlgItemText(IDC_EDIT2, NULL);
SetDlgItemText(IDC_EDIT3, "wrong");
iWrong = iWrong + 1;
szEdit02.Format("%d",iWrong);
SetDlgItemText(IDC_EDIT6, szEdit02);
nTimeCount = m_dialog.inComplex - 1;
}
}
}
nTimeCount ++;
CDialog::OnTimer(nIDEvent);
return;}
其中我感觉有一步操作非常好 if(strEdit1.GetLength())此判断是为了保证有输入时就能及时进行比较,当初自己没有想出来,最后还是哥的这步操作感觉很不错,只要是有输入就判断,而不至于在点击按钮后就判断。不错。
对于暂停按钮应该设置变量存放nTimeCount计数,以方便能在恢复按钮操作后能接着上次操作,并KillTimer(1),以结束OnTimer操作。
对于恢复按钮,我的操作是:
m_edit02.SetWindowText(NULL);
nTimeCount = temporary;
m_ddit12.EnableWindow(false);
m_bun3.EnableWindow(true);
InitDict(m_dialog.szDicPath);
UINT_PTR ID;
ID=SetTimer(1,10,NULL);// 时间计数器每10毫秒加1
对于结束按钮操作是:
CString szScore;
float CS = 1.0;
float Score =CS*100*iRight/(iRight + iWrong);
szScore.Format("%f",Score);
m_edit02.SetWindowText(szScore);
m_bun2.EnableWindow(false);
m_btn1.EnableWindow(true);
m_bun3.EnableWindow(false);
m_ddit12.EnableWindow(false);
KillTimer(1);
CloseDict();//关闭字典文件的函数
设置按钮使用DoModal();//创建一个子窗口
子窗口操作待续。。。。。。