现在的位置: 首页 > 综合 > 正文

MFC 总结

2013年03月15日 ⁄ 综合 ⁄ 共 3152字 ⁄ 字号 评论关闭

最近应师傅要求做了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天后的时间

主要在做生日时间提醒时用到,真是太爱这两个函数,省了我的代码。方便哇

抱歉!评论已关闭.