MFC筆記 第二節課(訪問對話方塊控制項的七種方法)

2021-10-10 17:09:08 字數 4943 閱讀 1437

getdlgitem() -> getwindowtext()

getdlgitem() -> setwindowtext()

先找到對話方塊在把對方框中的值複製到字串中

getdlgitem(idc_edit1)->getwindowtext(ch1);先找到idc_edit1這個對話方塊,在把idc_edit1這個對話方塊中的值賦給ch1.

例子:

int numl1, numl2, numl3;

tchar ch1[12], ch2[12], ch3[12];

getdlgitem(idc_edit1)->getwindowtext(ch1,12);

getdlgitem(idc_edit2)->getwindowtext(ch2, 12);

numl1 = _ttoi(ch1);

numl2 = _ttoi(ch2);

numl3 = numl1 + numl2;

_itow_s(numl3,ch3,10);

getdlgitem(idc_edit3)->setwindowtext(ch3);

說明:在mfc中似乎是不可以使用標準的字串的,只能使用tchar或者cstring.示例中使用的tchar比較古老(教程中就是這麼用的)_ttoi這個函式是個通用的函式字串轉成int,但是這種函式也是很古老的,下面的_itow_s是int轉字串的。這個都不推薦使用,format這個函式很強的大,有這個函式可以轉換各種型別的資料,不用記那麼多的函式。

tchar ch1[12], ch2[12], ch3[12];

getdlgitem(idc_edit1)->getwindowtext(ch1,12);

getdlgitem(idc_edit2)->getwindowtext(ch2, 12);

其中獲取ch1在後面都要跟12這個引數,這個引數的意思是限制長度為12,因為ch1只定義了12個字元長度,這個好像是c語言的一種缺陷,要是不指定範圍黑客似乎可以利用記憶體溢位讀取ch1周圍的記憶體值從而進行破壞。當然這種方法比較古老,使用cstring據說就沒這種問題,所以我改了中寫法。使用cstring代替。

int numl1, numl2, numl3;

cstring ch1, ch2, ch3;

//tchar ch1[12], ch2[12], ch3[12];

getdlgitem(idc_edit1)->getwindowtext(ch1);

getdlgitem(idc_edit2)->getwindowtext(ch2);

numl1 = _ttoi(ch1);

numl2 = _ttoi(ch2);

numl3 = numl1 + numl2;

ch3.format(_t("%d"), numl3);

getdlgitem(idc_edit3)->setwindowtext(ch3);

getdlgitemtext()

setdlgitemtext()

和方法一相比,方法二更加簡潔,直接找到對話方塊然後賦值    getdlgitemtext(idc_edit1,ch1); 

方法二和方法一差不多,只不過方法二是直接讀取對話方塊中的值;

int numl1, numl2, numl3;

cstring ch1, ch2, ch3;

//getdlgitem(idc_edit1)->getwindowtext(ch1);

//getdlgitem(idc_edit2)->getwindowtext(ch2);

getdlgitemtext(idc_edit1,ch1);

getdlgitemtext(idc_edit2,ch2);

numl1 = _ttoi(ch1);

numl2 = _ttoi(ch2);

numl3 = numl1 + numl2;

ch3.format(_t("%d"), numl3);

//getdlgitem(idc_edit3)->setwindowtext(ch3);

setdlgitemtext(idc_edit3,ch3);

getdlgitemint()

setdlgitemint()

方法三是最簡單的一種方法,但是有侷限性,就是操作的數都是int型。

int numl1, numl2, numl3;

cstring ch1, ch2, ch3;

//getdlgitem(idc_edit1)->getwindowtext(ch1);

//getdlgitem(idc_edit2)->getwindowtext(ch2);

//getdlgitemtext(idc_edit1, ch1);

//getdlgitemtext(idc_edit2, ch2);

numl1 = getdlgitemint(idc_edit1);

numl2 = getdlgitemint(idc_edit2);

//numl1 = _ttoi(ch1);

//numl2 = _ttoi(ch2);

numl3 = numl1 + numl2;

/*ch3.format(_t("%d"), numl3);*/

//getdlgitem(idc_edit3)->setwindowtext(ch3);

//setdlgitemtext(idc_edit3, ch3);

setdlgitemint(idc_edit3,numl3);

這個操作其實一行就解決了。

setdlgitemint(idc_edit3,getdlgitemint(idc_edit1) + getdlgitemint(idc_edit2));
雖然**很優雅,但是侷限性很大,靈活運用才是王道,想到了最好,想不到使用通用的方法也問題不大,畢竟**是給別人看的,技巧固然很重要,但是要考慮他人的接受能力。

把控制項和整型變數相關聯具體操作方法就是在第乙個對話方塊右擊新增變數具體操作就不演示了。

**:

updatedata(true);

m_num3 = m_num1 + m_num2;

updatedata(false);

解釋一下updatedata(true);和    updatedata(false);

updatedata(true);就是把對話方塊中的值更新到變數中,updatedata(false);是把變數中的值更新到對話方塊中。沒有這兩個操作時無法計算的。

如果輸入的不是乙個int數會檢測的。

把控制項和控制項變數相關聯

int num1, num2, num3;

cstring str1, str2, str3;

m_edit1.getwindowtext(str1);

m_edit2.getwindowtext(str2);

num1 = _ttoi(str1);

num2 = _ttoi(str2);

num3 = num1 + num2;

str3.format(_t("%d"), num3);

m_edit3.setwindowtext(str3);

注意:

m_edit1  m_edit2  m_edit3是關聯的控制項變數,

cstring轉int用_ttoi 函式,而int轉cstring用format函式,str3.format(_t("%d"), num3);這個的含義就是從右向左讀,num3 %d表示num3是int型format轉成cstring str3接收。

這個方法比較古老了,裡面感覺有win32api程式設計的影子,還有控制代碼什麼的。

**:

int num1, num2, num3;

tchar str1[12], str2[12], str3[12];

cstring cstr1;

::sendmessage(getdlgitem(idc_edit1)->m_hwnd,wm_gettext,12,(lparam)str1);

::sendmessage(getdlgitem(idc_edit2)->m_hwnd, wm_gettext, 12, (lparam)str2);

num1 = _ttoi(str1);

num2 = _ttoi(str2);

num3 = num1 + num2;

_itow_s(num3,str3,10);

::sendmessage(getdlgitem(idc_edit3)->m_hwnd,wm_settext,0,(lparam)str3);

這個是不支援cstring的試了好多辦法都不行。

尤其是核心的獲取資料**::sendmessage(getdlgitem(idc_edit1)->m_hwnd,wm_gettext,12,(lparam)str1);這個是不能用cstring的

所以tchar之間的轉換也只能用_itow_s(num3,str3,10);這種方式了。

int num1, num2, num3;

tchar str1[12], str2[12], str3[12];

::senddlgitemmessage(idc_edit1,wm_gettext,12,(lparam)str1);

::senddlgitemmessage(idc_edit2, wm_gettext, 12, (lparam)str2);

num1 = _ttoi(str1);

num2 = _ttoi(str2);

num3 = num1 + num2;

_itow_s(num3, str3, 10);

::senddlgitemmessage(idc_edit3,wm_settext,0,(lparam)str3);

第七種方法其實就是把第六種簡化了。

第二節課筆記

1.識別符號 宣告格式 型別 識別符號 賦值格式 識別符號 字面量 兩種格式的簡寫 型別 識別符號 字面量 2.操作符和表示式 表示式 通過識別符號,字面量和操作符按照一定的順序拼接然後得到的乙個具有固定結果的式子,叫做表示式 操作符 具有一定邏輯意義的符號。操作符型別 算數運算子 位運算子 關係運...

學習tensorflow第二節課筆記

使用圖 graphs 來表示計算任務 在被稱之為會話 session 的上下文 context 中被執行 使用tensor表示資料 通過變數 variable 維護狀態 使用feed和fetch可以為任意的操作賦值或者從其中獲取資料 tensorflow是乙個程式設計系統,使用圖 graphs 來表...

MFC對話方塊控制項訪問的七種方式

最簡單的動態建立按鈕 if m btn.m hwnd 視窗控制代碼不為空 else 實現 點選add按鈕,將 編輯框1的數 編輯框2 的數 放到編輯框3中 int num1,num2,num3 char ch1 10 ch2 10 ch3 10 getdlgitem idc edit1 getwin...