最近應師傅要求做了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天后的時間
主要在做生日時間提醒時用到,真是太愛這兩個函數,省了我的代碼。方便哇