模態(Modal)對話框和非模態(Modeless)對話框

30 篇文章 0 订阅
15 篇文章 0 订阅

------------------------------------------------2016.09.12------------------------------------------------
模態(Modal)對話框和非模態(Modeless)對話框
-----------------------------------------------
模態對話框顯示時程序暫停執行,關閉該模態對話框時后,才能繼續執行程序中其他任務。
非模態對話框顯示時,允許轉而執行程序中的其他任務,而不用關閉該對話框。
在MFC中,對資源的操作通常都是通過一個與資源相關的類來完成的。
DoDataExchange,主要用來完成對話框數據的交換和校驗。
創建模態對話框調用CDialog類的成員函數:DoModal,該函數的功能即創建并顯示一個模態對話框,其返回值作為EndDialog
的參數,EndDialog的功能即是關閉對話框。
創建非模態對話框,需要利用CDialog類的Create成員函數。
Create函數聲明:BOOL Create(LPCTSTR lpszTemplateName,CWnd* pParentWnd = NULL)
                 BOOL Create(UINT nIDTemplate,CWnd* pParentWnd = NULL)
當利用Create函數創建非模態對話框時,還需要調用ShowWindow函數將這個對話框顯示出來。
對於非模態對話框的生命週期,有兩種解決辦法:

一種就是把這對話框對象定義為視類的成員變量;
另一種方式是將它定義為指針,在堆上分配內存:
->該指針的成員變量是一個局部對象,其生命週期一旦結束,程序就無法找到它指向的那塊內存。
解決方式:
將該指針定義為視類的成員變量,然後在視類的析構函數中調用delete函數來釋放這個指針變量所指向的那塊內存;
在對話框類中重載PostNcDestroy虛函數。

單擊OK按鈕時,模態對話框被銷毀,非模態對話框被隱藏;
故必須重寫非模態對話框的OnOK函數,并在重寫的函數中調用DestroyWindow函數,銷毀對話框,不再調用基類的OnOk函數。
也必須重寫OnCancel函數,并在重寫的函數中調用DestroyWindow函數,銷毀對話框,不再調用基類的OnCancel函數。
--------------------------------------------------------------------------------------------------------------------
Windows消息分為三類:標準消息,命令消息,通告消息。
靜態文本在默認狀態下是不發送通告消息的。、
為了使一個靜態文本控件能夠響應鼠標單擊消息,需要進行:
一、改變其控件ID;
二、在其屬性對話框中將Notify置為true。


    CString str;
    if (GetDlgItem(IDC_NUM1)->GetWindowText(str),str =="NUM1:")
    {
        GetDlgItem(IDC_NUM1)->SetWindowText(_T("數值1:"));
    }
    else 
    {
        GetDlgItem(IDC_NUM1)->SetWindowText(_T("NUM1:"));
    }
------------------------------------------------------------------------------------------------------------------
IsRectNull,若矩形的左上角及右下角的四個坐標值均為零,返回非零;
IsRectEmpty,監測區域是否為空,若矩形的高度或寬度有一個為零或一個負值,則說明此矩形為空,返回非零值,否則,返回0

窗口的Z次序
----------------
表明了重疊窗口堆中窗口的位置。窗口堆按照一個由3屏幕想外伸展的Z軸,定位的。。
Windows系統管理三個獨立的Z次序——一個用於頂層窗口,一個用於兄弟窗口,還有一個用於最頂層窗口(WS_EX_TOPMOST)。
系統通常將活動的窗口和剛創建的窗口放在Z次序頂部。
應用程序調用BringWindowToTop將一個窗口放置到Z次序頂部,SetWindowPos和DeferWindowPos用來重排z次序。
兄弟窗口:共享一個父窗口的多個子窗口。
活動窗口。
前台窗口與後台窗口,創建正在使用的窗口的線程叫做前台線程,該窗口時前台窗口,所有其他縣成為後台線程,後台線程創建的窗口叫後台窗口。
-------------------------------------------------------------------------------------------------------------------
為了屏蔽掉到默認的回車鍵關閉對話框這一功能,應該在對話框子類中重寫OK按鈕的消息響應函數。
捕獲鍵盤按鍵消息:
1》為編輯框控件生成一個向關聯的類,然後利用這個類來捕獲鍵盤按鍵消息。
2》修改編輯框控件的窗口過程函數,即自己編寫一個編輯控件的窗口過程.
LONG SetWindowLong(HWND hWnd,指定想要改變其屬性的窗口句柄
              int nIndex,指定要設置的屬性值的偏移地址
              LONG dwNewLong);指定設置的新值。

所有的窗口消息都伴隨著一個該窗口的句柄。
方法一:
SetFocus函數設置輸入焦點的窗口句柄。
GetNextWindow獲得對話中某個控件的下一個控件的句柄。第一個參數指定當前句柄,第二個參數指定查找方向。
方法二:
GetWindow函數返回指定窗口有特定關係的窗口句柄。
方法三:
GetNextDlgTabItem,返回指定控件前面或後面的一個具有WS_TABSTOP風格的控件。
三個參數:第一個指定將被搜索的對話框,第二個指定用來作為搜索開始點的控件。第三個指定搜索方向。真上一個,假下一個。
方法四:
利用對話框的默認按鈕。在MFC中,默認情況下,當在對話框窗口中按下回車鍵時,會調用對話框的默認按鈕的響應函數。
GetDlgItem()->GetNextWindow()->SetFocus();先獲取第一個控件的指針,利用此指針調用GetNextWindow()函數得到他的下一個或上一個窗口,最後調用SetFocus函數將輸入焦點設置到該窗口上。
而由於GetDlgItem永遠獲得第一個窗口的窗口句柄,故應當改成GetFocus。
要實現窗口內控件依次

--------------------------------------------------------------------------------------------------------------------------------
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值