最近应师傅要求做了MFC的界面,主要是操作数据库、界面是设计与功能实现。现在要做些总结:
1.修改对话框的里控件的字体、颜色可以再对话框的属性Fnt里设置,但是坏处是对于此对话框来说每个控件都会被设置。在属性里不能对特定控件额外设置。这事可以再ON_WM_CTLCOLOR事件编辑代码
HBRUSH CAddItem::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: 在此更改 DC 的任何属性
if(pWnd->GetDlgCtrlID()==IDC_ASTERISK1)
{
pDC->SetTextColor(RGB(255,0,0));//设置此控件显示为红色
// pDC->SetBkColor(RGB(255,255,255));
}
((CEdit*)GetDlgItem(IDC_ITEM))->SetSel(1,1,TRUE);
return hbr;
}
其中IDC_ASTERISK1是特定控件的ID。
2. 发送自定义消息。对于主窗口是父窗口的子窗口,可以直接GetParent()->PostMessage(WM_LISTVIEW_CLIENT_FLASH, (WPARAM)sqlStr.AllocSysString(), (LPARAM)(&val));
其中WM_LISTVIEW_CLIENT_FLASH是自定义消息值。
而对于父窗口不是主窗口的子窗口,可以
HWND hwnd;
hwnd = ::FindWindow(NULL ,_T("汽车保养表"));//获取窗口的句柄
::SendMessage( hwnd ,
WM_LISTVIEW_ITEM_FLASH,NULL,NULL);
其中("汽车保养表"为父窗口的的caption的值。而WM_LISTVIEW_ITEM_FLASH是自定义消息值。
3. 数据库模糊查询(数据库部分匹配查询)不是采用m_pConnection->Execute语句查询,故
sqlStr.Format(_T("select * from ClientInfo where CName like'%%s%'"),tStr1);
m_pRecordset = ado.OpenRecordset(sqlstr);会出错,可改为
sqlStr.Format(_T("select * from ClientInfo where CName like'%%%s%%'"),tStr1);
m_pRecordset = ado.OpenRecordset(sqlstr);即可模糊查询了。
4.UpdateData(TRUE)与UpdateData(FALSE)的区别,TRUE时是把控件更新到变量,FALSE的把变量更新到控件。
5.不显示一个控件或对话框可以.showwindow(FALSE);获取控件的iD并对其控制如:
((CEdit *)GetDlgItem(IDC_ADMINI))->EnableWindow(FALSE);其中IDC_ADMINI是控件ID。
对于弹出新对话框:
CClientItem *clientItem = new CClientItem();
clientItem->Create(IDD_ADDCLIENTITEM);
clientItem->ShowWindow(TRUE);
也可对clientItem 的对话框的布局进行初始化:
clientItem->GetDlgItem(IDC_OKFIX)->ShowWindow(TRUE);//显示clientItem对话框的IDC_OKFIX的控件
clientItem->GetDlgItem(IDOK)->ShowWindow(FALSE);
CString info;
info.Format(_T("为%s %s客户修改时间是:%s 的保养项目"),c_Name,cTelephone,mtime);
clientItem->m_clientinfo=info;初始化显示m_clientinfo控件的文字
6. listview的check复选框判断
for(int i=0; i<m_list_item.GetItemCount(); i++)
{
if( m_list_item.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED || m_list_item.GetCheck(i)) // 选中
{
mcheckBinary+=(unsigned long)pow((double)2 , i);
}
}
7. 数据库的插入
try
{
m_pRecordset->AddNew(); //添加新行
m_pRecordset->PutCollect("TeleNumber",_variant_t(mTeleNumber));
m_pRecordset->PutCollect("Time",_variant_t(mTime));
m_pRecordset->Update();
}
catch (_com_error e)
{
CString errorMsg;
errorMsg.Format(_T("数据库添加失败!\r\n错误信息:%s"),e.ErrorMessage());
AfxMessageBox(errorMsg); //显示错误信息
OnOK();
}
数据库的更新
try
{
m_pRecordset->PutCollect("ItemSele",_variant_t(mcheckBinary));
m_pRecordset->PutCollect("TotalPrice",_variant_t(mTotalPrice));
m_pRecordset->Update();
}
catch (_com_error e)
{
CString errorMsg;
errorMsg.Format(_T("数据库添加失败!\r\n错误信息:%s"),e.ErrorMessage());
AfxMessageBox(errorMsg); //显示错误信息
OnOK();
}
数据库的删除
f (m_pRecordset->RecordCount > 0)
{
m_pRecordset->Delete(adAffectCurrent);
m_pRecordset->Update();
}
8. 对于时间格式为2013-5-6是时间格式用
AfxExtractSubString(yearB, birthDay, 0, '-'); //提取年月日
AfxExtractSubString(monthB, birthDay, 1, '-');
AfxExtractSubString(dayB, birthDay, 2, '-');
可分别提取年月日的值;
对于CTimeSpan的类可以计算出今天的前几天或后几天的时间
CTime tmToday; //今天的日期
CTime tmPreSomeDay;
CTimeSpan tmspanSomeDay(mBirthday,0,0,0); //时间距离
tmToday=CTime::GetCurrentTime();//获得当前日期
tmPreSomeDay=tmToday+tmspanSomeDay; 获取距离mBirthday天后的时间
主要在做生日时间提醒时用到,真是太爱这两个函数,省了我的代码。方便哇