MFC打字训练娱乐程序(三)

为了防止开始、结束、暂停、恢复按钮的随便点击我们可以使用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);网上说在结束时应该使用deleteCFont删除,但是发现在按下结束按钮后会在一小段时间后字体自动恢复系统默认格式,所以就不适用delete

使用颜色设置如下:

HBRUSH CMyKeyDlg::OnCtlColor(CDCpDCCWndpWndUINT nCtlColor)

{

HBRUSH hbr = CDialog::OnCtlColor(pDCpWndnCtlColor);

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_PATHcsIniPath);

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;

charWord;

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)))//比较strEdit1strEdit2

{

iRight = iRight + 1;

szEdit01.Format("%d",iRight);

SetDlgItemText(IDC_EDIT4szEdit01);

SetDlgItemText(IDC_EDIT2NULL);//此步是为了保证循环能顺利进行以防一直运行TRUE

nTimeCount = m_dialog.inComplex - 1;

SetDlgItemText(IDC_EDIT3, "right");

}

else

{

if (nTimeCount ==(m_dialog.inComplex) - 1)

{

SetDlgItemText(IDC_EDIT2NULL);

SetDlgItemText(IDC_EDIT3, "wrong");

iWrong = iWrong + 1;

szEdit02.Format("%d",iWrong);

SetDlgItemText(IDC_EDIT6szEdit02);

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();//创建一个子窗口

子窗口操作待续。。。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值