|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
6 E' E3 K8 }$ D4 W5 J9 Z
: R4 _$ ~# a& O/ e1 y6 f7 @$ D) `. q( l7 _
2 R2 @5 T7 s% ?. pUG中调用mfc对话框的文章很多了,这里仅专门针对非模态对话框要特别注意的几个事项进行说明:
l6 r: p- }4 G/ _' s; g ^1 t$ n% p% L) a
1. 在创建和调用对话框之前一定要使用AFX_MANAGE_STATE(AfxGetStaticModuleState()),这是因为mfc创建的project类型肯定只能是dll,需要告诉在运行时去dll所在的模块下找资源文件而不是去应用程序(也就是ug)中找。这一点适用于所有ug调用的mfc项目;3 W$ D4 }3 s0 X( o9 ?9 e _7 |8 q
4 L2 B! |7 _8 C( f
2. 创建对话框的代码如下
' o# ]/ w6 t2 j3 O# k; _3 I% Q8 |' H# r) E; `" F9 C% e& D
HWND UGHwnd = (HWND) UF_UI_get_default_parent();, C, D$ f% a0 c) d# d2 K
CWnd *ugwindow = CWnd::FromHandle(UGHwnd);
( M! S- k* f7 X8 i4 q* R! l3 B7 _$ _, c3 l8 G
CMfcDialog *pMfcDlg=NULL;8 \/ M4 h9 P# z% l/ T
pMfcDlg= new pMfcDlg(ugwindow);
+ q4 ~+ h9 g8 I/ ^ C pMfcDlg->Create(IDD_DIALOG, ugwindow);# m% S9 D$ M+ `7 x( M6 \
//可以在此处添加SetWindowPos设置对话框出现的位置
7 K" C" S: o( O2 |$ |3 X$ S4 ^ pSimDlg->ShowWindow(SW_NORMAL);
/ G' X5 r9 m }- {5 q$ ]. N! z% C( J1 \! x
创建时一定要使用指针,这点在很多文章和帖子上已经反复强调过。这里想强调的一点是最好得到ug自身的窗口(句柄或者CWnd),将其作为父窗口传给对话框,很有好处和必要;
; L; ]7 k T- ^6 F9 q1 P- d! C
8 K6 K6 g, K- m% \! X5 j, o$ R% L8 ?3. 第三点是我发帖子刚刚在论坛上求问过的,就是非模态对话框和ug本身交互对话框的冲突,原来是要用UF_UI_lock_ug_access( UF_UI_FROM_CUSTOM )和UF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM )把ug对话框的函数包起来,具体原因可参见ug帮助文档(虽然从来没什么太大帮助)。eg:* ?0 C' e/ \3 V# f
ShowWindow(SW_HIDE);//Optional, 隐藏父窗口
' M5 T- r1 L/ N# F: EUF_UI_lock_ug_access( UF_UI_FROM_CUSTOM ); UF_UI_select_by_class(message,&opts,&response,&count,&selectedItem );
$ y. x& r/ S1 M) OUF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM );
: J# x4 Q& }$ y# h+ T7 W4 dShowWindow(SW_SHOW);//Optional,再次显示父窗口
; E7 l4 ~# t! }& j, a3 i# w4 Y5 u, Y5 I
PS:对于隐藏和显示父窗口,对于模态对话框来说要稍微复杂一点,此处不赘言。
! Y/ Q! g7 N4 j1 ^5 B
) p0 z' B& d5 p5 F4 y1 T) I- V$ r4. 也是其他文章经常讲到的,为对话框添加OnDestroy函数,在其中删除掉this指针,销毁对话框对象;
/ D/ A9 N5 r# |8 u2 L" B- w. L
. c! t `% ^. V" p% q5 H5. 如果对话框有OK, Cancel或Exit等出口按钮,一定要重载相应的响应函数,去掉OnOK之类的出口函数,用SendMessage(WM_DESTROY)来代替。之所以这么做的原因,是非模态对话框在被调用者的程序范围内无法得知其何时结束(不同于模态对话框的DoModal),因此只能由OnDestroy函数内完成销毁动作。当然还有其它的解决办法,此处推荐这种。
1 u; a& d9 D8 S. O
. J. s, |7 Z! J" G; K' _6. Last but not the least,非常不引人注意而又非常致命的一点,在ufusr_ask_unload函数中要使用UF_UNLOAD_SEL_DIALOG而非UF_UNLOAD_IMMEDIATELY作为返回值,否则ug加载对话框时将出错!!! |
的文章很多了,这里仅专门针对非模态对话框要特别注意的几个事项进行说明:
6 ?. S y+ X7 o/ |9 |! @% k' O$ i! K
1. 在创建和调用对话框之前一定要使用AFX_MANAGE_STATE(AfxGetStaticModuleState()),这是因为mfc创建的project类型肯定只能是dll,需要告诉在运行时去dll所在的模块下找资源文件而不是去应用程序(也就是ug)中找。这一点适用于所有ug调用的mfc项目;
: R. l: w- {% F# I& l% H
1 k2 ]4 m* g5 T4 `: A/ J- U$ x) c2. 创建对话框的代码如下, B; y! K2 z4 T: _4 P) W P! _
, m" s; j- N0 |7 O3 a+ g HWND UGHwnd = (HWND) UF_UI_get_default_parent();
" i, H4 g4 j9 A3 R CWnd *ugwindow = CWnd::FromHandle(UGHwnd);* h$ Z8 G- i, B* M2 M' d
) S- P5 o4 d- A8 ^; ~( X7 h
CMfcDialog *pMfcDlg=NULL;2 I' w8 _% v2 c( F9 L
pMfcDlg= new pMfcDlg(ugwindow); 7 g. l$ g5 Z0 ?9 K! B! R
pMfcDlg->Create(IDD_DIALOG, ugwindow);
' F- n/ k' m7 Q, H4 E; v4 F1 m //可以在此处添加SetWindowPos设置对话框出现的位置
C5 G6 D' D8 N pSimDlg->ShowWindow(SW_NORMAL);$ _ A- z0 Q$ g" W2 v+ y. g
6 m" }5 G; \2 E* [5 ^创建时一定要使用指针,这点在很多文章和帖子上已经反复强调过。这里想强调的一点是最好得到ug自身的窗口(句柄或者CWnd),将其作为父窗口传给对话框,很有好处和必要;4 u$ K! N& m6 y6 G- A$ d( z3 a( f
4 f. U- J5 o0 x6 Q
3. 第三点是我发帖子刚刚在论坛上求问过的,就是非模态对话框和ug本身交互对话框的冲突,原来是要用UF_UI_lock_ug_access( UF_UI_FROM_CUSTOM )和UF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM )把ug对话框的函数包起来,具体原因可参见ug帮助文档(虽然从来没什么太大帮助)。eg:
) A# W6 T% S4 ?ShowWindow(SW_HIDE);//Optional, 隐藏父窗口! |0 @3 a2 t5 {8 w t, a+ N* Z
UF_UI_lock_ug_access( UF_UI_FROM_CUSTOM ); UF_UI_select_by_class(message,&opts,&response,&count,&selectedItem );
+ \1 ?# O( t% w; oUF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM );
9 _& ], o3 @9 QShowWindow(SW_SHOW);//Optional,再次显示父窗口
1 z# a8 c D/ [
# u9 K5 j s- d* ^PS:对于隐藏和显示父窗口,对于模态对话框来说要稍微复杂一点,此处不赘言。/ j+ o8 u; }7 D# o
s% n/ k. ]% ~1 Q* m7 p: J4. 也是其他文章经常讲到的,为对话框添加OnDestroy函数,在其中删除掉this指针,销毁对话框对象;8 ?# b: _$ U" X, N
% W; c; Y! A+ l
5. 如果对话框有OK, Cancel或Exit等出口按钮,一定要重载相应的响应函数,去掉OnOK之类的出口函数,用SendMessage(WM_DESTROY)来代替。之所以这么做的原因,是非模态对话框在被调用者的程序范围内无法得知其何时结束(不同于模态对话框的DoModal),因此只能由OnDestroy函数内完成销毁动作。当然还有其它的解决办法,此处推荐这种。
; a0 `$ C' w. H( z3 Z: T
( c6 x# k8 L" `: ]. o/ o+ v1 R) d; R9 Q6. Last but not the least,非常不引人注意而又非常致命的一点,在ufusr_ask_unload函数中要使用UF_UNLOAD_SEL_DIALOG而非UF_UNLOAD_IMMEDIATELY作为返回值,否则ug加载对话框时将出错!!! |
7 [6 `( t. {+ `5 s0 d# b7 S, x |
|