發(fā)現(xiàn)的一個(gè)道理是:
不僅僅是控件可以和值相關(guān)聯(lián),而且可以建立控件和一個(gè)類的關(guān)聯(lián)。
具體來說就是,如果控件和一個(gè)值相關(guān)聯(lián),比如和CString類型的值,或者int,或者float等等,那么就會(huì)相應(yīng)的將控件的內(nèi)容轉(zhuǎn)化成對應(yīng)的類型。
但是,如果將控件和類類型關(guān)聯(lián),就是一種映射,此時(shí),這個(gè)關(guān)聯(lián)的名字,就是這個(gè)控件的別名,而且,由于對應(yīng)的控件,所以會(huì)有相應(yīng)的類函數(shù)。比如是CEdit類型的控件,對應(yīng)的就是CEdit類型的變量,此時(shí),就會(huì)有相應(yīng)的方法。而如果是對應(yīng)的基本類型,比如CString,int,則不會(huì)有這個(gè)類型的函數(shù)可以提供操作。
于是,更多的,就是使用這個(gè)別名的類型,因?yàn)閷τ谝粋€(gè)類類型的變量,是可以調(diào)用相應(yīng)的很多的方法的,從而利用提供的API函數(shù),完成更多的功能。
不懂的內(nèi)容可以查MSDN,特別是對于CEdit類型,有很多提供的API可以供查詢。
貼代碼:
void CTest16Dlg::OnCopy()


{
// TODO: Add your control notification handler code here
m_edit1.SetSel(0,-1);
m_edit1.Copy();
m_edit2.SetSel(0,-1);
m_edit2.ReplaceSel("");
m_edit2.Paste();
}

void CTest16Dlg::OnCut()


{
// TODO: Add your control notification handler code here
m_edit1.SetSel(0,-1);
m_edit1.Copy();
m_edit1.ReplaceSel("");
m_edit2.SetSel(0,-1);
m_edit2.ReplaceSel("");
m_edit2.Paste();
}

void CTest16Dlg::OnExit()


{
// TODO: Add your control notification handler code here
CDialog::OnCancel();
}

void CTest16Dlg::OnClear()


{
// TODO: Add your control notification handler code here
m_edit1.SetSel(0,-1);
m_edit1.ReplaceSel("");
m_edit2.SetSel(0,-1);
m_edit2.ReplaceSel("");
}

void CTest16Dlg::OnUndo()


{
// TODO: Add your control notification handler code here
m_edit1.Undo();
m_edit2.Undo();
}


主要的幾個(gè)函數(shù)就是如上,關(guān)鍵的要理解控件的關(guān)聯(lián)。。。
第二個(gè)就是ListBox地址控件的操作:
void CTest18Dlg::OnAdd()


{
// TODO: Add your control notification handler code here
int index,test;
UpdateData(TRUE); //將控件的內(nèi)容寫入變量中
test = m_ListBox.FindStringExact(-1,m_name); //查找是否有和m_name同名的項(xiàng)
if(test != LB_ERR) //含有同名的,返回值test為索引值,否則為LB_ERR
return ; //此處返回的如果不是LB_ERR,那么就含有同名的,添加失敗,直接返回
index = m_ListBox.AddString(m_name);
m_ListBox.SetItemData(index,m_id); //將相應(yīng)的索引值和一個(gè)id綁定關(guān)聯(lián)
UpdateData(FALSE); //變量的內(nèi)容寫入控件
GetDlgItem(IDC_BUTTON2)->EnableWindow(TRUE); //使刪除鍵可以用
}

void CTest18Dlg::OnDelete()


{
// TODO: Add your control notification handler code here
int index;
index = m_ListBox.GetCurSel(); //獲得當(dāng)前的索引項(xiàng)
m_ListBox.DeleteString(index); //刪除這個(gè)索引項(xiàng)
index = m_ListBox.GetCurSel();
if(index == LB_ERR) //如果為空,則使得刪除鍵不可用
GetDlgItem(IDC_BUTTON2)->EnableWindow(FALSE);
}

void CTest18Dlg::OnExit()


{
// TODO: Add your control notification handler code here
CDialog::OnCancel();
}



void CTest18Dlg::OnSelchangeList() //響應(yīng)鼠標(biāo)選擇ListBox控件的動(dòng)作,
//具體來說就是當(dāng)選擇了某一項(xiàng)的時(shí)候,在姓名和對于的對話框中顯示信息,對于的姓名和id。


{
// TODO: Add your control notification handler code here
int nIndex = m_ListBox.GetCurSel();
m_ListBox.GetText(nIndex,m_name);
m_id = m_ListBox.GetItemData(nIndex);
UpdateData(FALSE);
}

功能就是:
一個(gè)是使用ListBox,通過添加姓名和學(xué)號(hào)來向表項(xiàng)中添加姓名,同時(shí),對于一個(gè)對應(yīng)的姓名,當(dāng)選擇的時(shí)候,顯示對應(yīng)的ID和姓名。
實(shí)現(xiàn)ListBox和右邊的編輯框的同步。
最后一個(gè)就是IP控件的使用:
void CTest17Dlg::OnButton1()


{
// TODO: Add your control notification handler code here
BYTE nField0;
BYTE nField1;
BYTE nField2;
BYTE nField3;
CString show_IP;
int num;
if(m_IPCtrl.IsBlank())
MessageBox("請輸入IP地址");

else
{
num = m_IPCtrl.GetAddress(nField0,nField1,nField2,nField3);

if(num == 4)
{
show_IP.Format("%d.%d.%d.%d.",nField0,nField1,nField2,nField3);
MessageBox(show_IP);
}

else
{
MessageBox("請輸入完整的IP地址!");
}
}
}

void CTest17Dlg::OnButton2()


{
// TODO: Add your control notification handler code here
CDialog::OnCancel();
}

其實(shí)控件的使用,API的查詢,很大程度上都是需要自己去摸索的,于是,很多時(shí)候不是什么記憶,而是練習(xí)才是最重要的。
這里寫下來這些,一則是為了熟悉,二則是為了怕以后忘記而寫下點(diǎn)體會(huì)。雖然很淺陋,不過作為學(xué)習(xí)過程的體會(huì),還是多多益善啊!
閱讀MFC程序的幾點(diǎn)體會(huì):

首先,切換到類屬性圖中,看看有那些成員,此時(shí)特別要注意的就是沒有見過的成員,因?yàn)檫@個(gè)很可能就是用戶添加的,進(jìn)入到這些函數(shù),就可以弄清楚他們的具體作用。
其次,看看里面有哪些成員,就是以m_開頭的成員變量,因?yàn)樗鼈兒芸赡芫褪怯脩籼砑拥臉?biāo)志位,或者是為控件捆綁的變量名,要么是值捆綁(value),要么是控制捆綁(control)
此時(shí)如果相確認(rèn),就要到ClassWizard中查看。
至于具體的函數(shù),則可以查詢API,不要看程序很多,實(shí)際的代碼,用戶添加的代碼,不是很多的。。。。
posted on 2010-02-06 18:18
deercoder 閱讀(726)
評(píng)論(0) 編輯 收藏 引用