MFC 總結

最近應師傅要求做了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天后的時間

主要在做生日時間提醒時用到,真是太愛這兩個函數,省了我的代碼。方便哇

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章