UG中呼叫MFC非模態對話方塊的一點心得

2021-06-16 17:27:19 字數 1729 閱讀 4470

1. 在建立和呼叫對話方塊之前一定要使用afx_manage_state(afxgetstaticmodulestate()),這是因為mfc建立的project型別肯定只能是dll,需要告訴在執行時去dll所在的模組下找資源檔案而不是去應用程式(也就是ug)中找。這一點適用於所有ug呼叫的mfc專案;

2. 建立對話方塊的**如下

hwnd ughwnd = (hwnd) uf_ui_get_default_parent();

cwnd *ugwindow = cwnd::fromhandle(ughwnd);

cmfcdialog *pmfcdlg=null;

pmfcdlg= new pmfcdlg(ugwindow);  

pmfcdlg->create(idd_dialog, ugwindow);

//可以在此處新增setwindowpos設定對話方塊出現的位置

psimdlg->showwindow(sw_normal);

建立時一定要使用指標,這點在很多文章和帖子上已經反覆強調過。這裡想強調的一點是最好得到ug自身的視窗(控制代碼或者cwnd),將其作為父視窗傳給對話方塊,很有好處和必要;

3. 第三點是我發帖子剛剛在論壇上求問過的,就是非模態對話方塊和ug本身互動對話方塊的衝突,原來是要用uf_ui_lock_ug_access( uf_ui_from_custom )和uf_ui_unlock_ug_access( uf_ui_from_custom )把ug對話方塊的函式包起來,具體原因可參見ug幫助文件(雖然從來沒什麼太大幫助)。eg:

showwindow(sw_hide);//optional, 隱藏父視窗

uf_ui_lock_ug_access( uf_ui_from_custom ); uf_ui_select_by_class(message,&opts,&response,&count,&selecteditem );

uf_ui_unlock_ug_access( uf_ui_from_custom );

showwindow(sw_show);//optional,再次顯示父視窗

ps:對於隱藏和顯示父視窗,對於模態對話方塊來說要稍微複雜一點,此處不贅言。

4. 也是其他文章經常講到的,為對話方塊新增ondestroy函式,在其中刪除掉this指標,銷毀對話方塊物件;

5. 如果對話方塊有ok, cancel或exit等出口按鈕,一定要過載相應的響應函式,去掉onok之類的出口函式,用sendmessage(wm_destroy)來代替。之所以這麼做的原因,是非模態對話方塊在被呼叫者的程式範圍內無法得知其何時結束(不同於模態對話方塊的domodal),因此只能由ondestroy函式內完成銷毀動作。當然還有其它的解決辦法,此處推薦這種。

6. last but not the least,非常不引人注意而又非常致命的一點,在ufusr_ask_unload函式中要使用uf_unload_sel_dialog而非uf_unload_immediately作為返回值,否則ug載入對話方塊時將出錯!!!

大概想到的就這麼多,希望能對大家有所幫助。

//hustoysj個人見解

如果以上方法還是不行,試試在工程屬性裡把mfc的呼叫是由共享改為靜態試試。

個人認為mfc介面雖然功能強大方便,但畢竟ug有自己的一套的介面系統,所以從相容性的角度考慮,還是用ug自己的介面比較好,而且新的block介面已經做的很美觀、實用,相容性很好。mfc的介面在ug上呼叫難免會存在各種各樣的問題,雖然絕大多數都可以解決,但影響程式設計效率。

非模態對話方塊 MFC

cvolsetdlg m pvoldlg null m pvoldlg newcvolsetdlg m pvoldlg create idd dlg vol m pvoldlg showwindow sw show 過載oncancel函式 void cxx oncancel todo add yo...

MFC 非模態對話方塊

非模態對話方塊 用mfc可以建立非模態的對話方塊,只是建立方式不同,模態對話方塊用 dlg.domodel 呼叫,而非模態對話方塊要用create函式建立呼叫。假設idd test dlg為已經定義的對話方塊資源的id號 ctestdlg dlg new ctestdlg dlg create id...

MFC中模態對話方塊和非模態對話方塊的差別

在mfc中有模態對話方塊和非模態對話方塊,那這兩種有什麼差別呢。又都是用於什麼場合呢。首先,要弄清楚2種對話方塊是怎樣建立的。然後要弄清楚2種對話方塊有什麼差別,可能從表面上看,模態會堵塞主對話方塊。可原理是什麼呢。還有就是。當有模態和非模態對話方塊沒有關閉的時候,在工作列中。關閉主視窗,會有什麼樣...