日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【VS开发】模态对话框和非模态对话框

發布時間:2024/4/17 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【VS开发】模态对话框和非模态对话框 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

MFC中對話框有兩種形式,一個是模態對話框(model dialog box),一個是非模態對話框(modeless dialog box)。

?一、模態對話框(model dialog box)

??????? 在程序運行的過程中,若出現了模態對話框,那么主窗口將無法發送消息,直到模態對話框退出才可以發送。

?????? 點擊模態對話框中的OK按鈕,模態對話框會被銷毀。

????????創建一個模態對話框的代碼:

[cpp]?view plaincopy
  • //創建一個模態對話框??
  • CTestDialog?td;??
  • td.DoModal();???
  • ??????? 其中CTestDialog為我自己所新建和一個對話框資源相關聯的對話框類。

    ??????? 可以創建一個布局模態對話框類變量,不用擔心它會隨著所在函數返回而被銷毀。因為DoModal()函數的一個功能是,當前只能運行此模態對話框,且停止主窗口的運行,直到模態對話框退出,才允許主窗口運行。

    ??????? DoModal()函數也有顯示對話框的功能,所以也無需調用其他函數來顯示對話框。

    二、非模態對話框(modaless dialog box)

    ??????? 在程序運行的過程中,若出現了非模態對話框,主窗口還可以發送消息。

    ??????? 點擊非模態對話框中的OK按鈕,非模態對話框沒有銷毀,只是隱藏了。若想點擊OK按鈕時,非模態對話框也銷毀,那么CTestDialog類必須重載其基類CDialog的虛函數OnOK(),在此函數里調用DestroyWindow()來銷毀此對話框。

    ??????? 若和上面一樣的方式創建一個非模態對話框:

    [cpp]?view plaincopy
  • ??????????CTestDialog?td;??
  • td.Create(IDD_DIALOG1);?//創建一個非模態對話框??
  • td.ShowWindow(SW_SHOWNORMAL);?//顯示非模態對話框??
  • ??????? 那么,在運行時,你會發現此對話框無法顯示。這是因為你聲明的對話框變量td是局部變量,但這個函數返回時,td也被析構了,所以無法顯示此對話框。

    ????????創建非模態對話框,必須聲明一個指向CTestDialog類的指針變量,且需要顯示的調用ShowWindow()才能將對話框顯示出來。有兩種創建方法:

    (1)采用局部變量創建一個非模態對話框

    [cpp]?view plaincopy
  • //采用局部變量創建一個非模態對話框??
  • CTestDialog?*pTD?=?new?CTestDialog();??
  • pTD->Create(IDD_DIALOG1);?//創建一個非模態對話框??
  • pTD->ShowWindow(SW_SHOWNORMAL);?//顯示非模態對話框??
  • ???????因為指針在聲明的時候是被放在堆棧中,只有整個應用程序關閉后才會被銷毀,所以可以正常顯示對話框。

    ????????這種方法雖然不影響程序的運行,可是指針pTD所指向的內存卻導致不可用,這樣的編程很不好。

    (2)采用成員變量創建一個非模態對話框

    ??????? 首先在你所要編寫的類的頭文件中聲明一個指針變量:

    [cpp]?view plaincopy
  • private:??
  • ????CTestDialog?*pTD;??
  • ??????? 然后再在相應的CPP文件,在你要創建對話框的位置添加如下代碼:

    [cpp]?view plaincopy
  • //采用成員變量創建一個非模態對話框??
  • pTD?=?new?CTestDialog();?//給指針分配內存??
  • pTD->Create(IDD_DIALOG1);?//創建一個非模態對話框??
  • pTD->ShowWindow(SW_SHOWNORMAL);?//顯示非模態對話框??
  • ??????? 最后在所在類的析構函數中收回pTD所指向的內存:

    [cpp]?view plaincopy
  • delete?pTD;?
  • 轉載于:https://www.cnblogs.com/huty/p/8518455.html

    總結

    以上是生活随笔為你收集整理的【VS开发】模态对话框和非模态对话框的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。