mfc 對話方塊 孫鑫 第七章

2021-08-04 21:36:39 字數 2418 閱讀 5264

第七章

1. 模態對話方塊

1.1 建立  domodal();

內部呼叫showwindow(sw_show);

對話方塊類的物件宣告為區域性變數就可以,因為domodal阻塞在這裡。

1.2 銷毀,直接點「確定」、「取消」就可以了。ctestdlg::onok()和ctestdlg:: oncancel ()呼叫cdialog::onok()和cdialog:: oncancel (),後面兩個呼叫enddialog()。對於模態,enddialog()銷毀對話方塊。

2.非模態對話方塊

2.1  建立

// lpsztemplatename對話方塊模板名稱

// pparentwnd 對話方塊的父視窗,一般用this(誰呼叫。this就是誰)

bool create(lpctstr  lpsztemplatename, cwnd* pparentwnd = null);

bool create(uint  nidtemplate, cwnd* pparentwnd = null);

showwindow(sw_show);

注意:對話方塊類物件要用全域性變數或呼叫所在類的成員變數,或定義為區域性指標變數,然後new出來,存在於堆上。

2.2銷毀

a). 如果是new出來的區域性比變數,要在ctestdlg::postncdestory()

b). ok按鈕呼叫的enddialog() 對於非模態,只是隱藏,並未銷毀。

解決方法:重寫onok和oncancel,呼叫destroywindow(),同時不要在呼叫cdialog::onok()和cdialog:: oncancel ();

3.動態建立按鈕

cbutton

類成員函式create(); 可以在mfc專案裡檢視介面。

4.控制項的訪問

cwnd::cwnd* getdlgitem(int

nid) const;獲取控制項指標

getnextdlgtabitem();//返回指定控制項前面或後面乙個具有ws_tabstop風格的控制項

setwindowtext();  getwindowtext();

getdlgitemtext(); setdlgitemtext();

getdlgiteminit(); setdlgiteminit()

char ch1[256];memset(ch1,0,sizeof(char)/sizeof(char));

sendmessage(getdlgitem(nid)->m_hwnd,wm_gettext,10,(lparam)ch1);

sendmessage(m_edit.m_hwnd,wm_gettext,10,(lparam)ch1);

m_edit.sendmessage(wm_gettext,10,(lparam)ch1);

wm_settext

4.對話方塊伸縮功能    通過getwindowrect()或者getclientrect()等獲取視窗大小,然後呼叫setwindowpos來實現對話方塊伸縮。

5.焦點傳遞

a).實現方法

a-1).為編輯框控制項編寫乙個類,利用這個類來捕獲鍵盤訊息

a-2).修改編輯框控制項過程函式

wndproc prevproc; 定乙個視窗過程

lresult callback neweditproc //視窗過程的名字可以隨意命名

hwnd hwnd, // 視窗的控制代碼

uint umsg, // 訊息標示

wparam wparam, //第乙個訊息引數

lparam lparam // 第二個訊息引數

if(umsg == wm_char && wparam == 0x0d)//判斷是都為回車符,wparam引數儲存的是字元的ascii碼

::setfocus(getnextwindow(hwnd,gw_hwndnext))//setfocus(hwnd), getnextwindow(hwndhwnd/*當前視窗控制代碼*/,unit wcmd /*查詢方向*/);//

gw_hwndnext  gw_hwndprev 

return 1;

else

return prevproc(hwnd,umsg,wparam,lparam);如果不是回車呼叫先前的視窗過程來處理該訊息

在oninitdialog() 函式中呼叫setwindowlong(),因為在相應precreatewindow()和create()函式的時候,對話方塊及其子控制項都沒有全部建立完畢,所以無法獲取各子控制項的視窗物件,也就無法修改編輯框的視窗過程函式。

oninitdialog()

prevproc = (wndproc)setwindowlong(getdlgitem(idc_edit1)->m_hwnd,gwl_wndproc,(long)neweditproc);

setfouce(hwnd hwnd)

MFC程式設計入門之七(對話方塊 為對話方塊新增控制項)

建立對話方塊資源需要建立對話方塊模板 修改對話方塊屬性 為對話方塊新增各種控制項等步驟,前面一講中已經講了建立對話方塊模板和修改對話方塊屬性,本節繼續講如何為對話方塊新增控制項。上一節中建立了乙個名為 addition 的工程,目的是生成乙個實現加法運算的應用程式。實現加法計算有幾個必要的因素 被加...

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...

《深入淺出MFC》第十章 MFC與對話方塊

可以通過對話方塊編輯器設計對話方塊模板,在資源檢視中選擇新增乙個對話方塊資源。通過屬性頁可以設定對話方塊或控制項的屬性。通過vs環境中的格式,tab順序可以設定控制項的tab順序,只需按指定的順序依次點選控制項即可。在vs開發環境中選擇 格式 選單中的測試對話方塊可以直接測試對話方塊。對話方塊調整完...