|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
: D |) B* E' j+ h
& z* r+ C/ u: d8 S! H1 ?
" L+ j1 b9 n Q5 @4 ^/ M2 ?1 F& p- F
UG中调用mfc对话框的文章很多了,这里仅专门针对非模态对话框要特别注意的几个事项进行说明:$ D' w7 t: {' Q$ l
3 r% r! a% }, z x
1. 在创建和调用对话框之前一定要使用AFX_MANAGE_STATE(AfxGetStaticModuleState()),这是因为mfc创建的project类型肯定只能是dll,需要告诉在运行时去dll所在的模块下找资源文件而不是去应用程序(也就是ug)中找。这一点适用于所有ug调用的mfc项目;
! C& U- N8 l: Q) P$ c
% o$ v2 X6 P2 g7 F% {" X n6 j2. 创建对话框的代码如下6 g8 E! n/ ^2 p0 k {1 [1 a
5 S, @4 \% G+ o# P
HWND UGHwnd = (HWND) UF_UI_get_default_parent();
. h( |+ e5 T4 C6 v CWnd *ugwindow = CWnd::FromHandle(UGHwnd);. ^8 D) w9 x; \" L
# \9 f' ~* o9 M7 X: k CMfcDialog *pMfcDlg=NULL;
" x3 x/ {6 O" ]9 |4 u; P pMfcDlg= new pMfcDlg(ugwindow); / j' r" J5 i5 N) o8 V
pMfcDlg->Create(IDD_DIALOG, ugwindow);
) v$ k1 |4 a" i2 [0 { //可以在此处添加SetWindowPos设置对话框出现的位置& n4 U7 R3 N1 T7 E, f7 p7 _$ {
pSimDlg->ShowWindow(SW_NORMAL);; s/ j1 S6 U6 L% O% I9 {: t6 c% r
/ F7 b6 g: U0 p& g创建时一定要使用指针,这点在很多文章和帖子上已经反复强调过。这里想强调的一点是最好得到ug自身的窗口(句柄或者CWnd),将其作为父窗口传给对话框,很有好处和必要;. D& j! N/ ~/ p6 E
5 O! o1 j8 U3 N7 A
3. 第三点是我发帖子刚刚在论坛上求问过的,就是非模态对话框和ug本身交互对话框的冲突,原来是要用UF_UI_lock_ug_access( UF_UI_FROM_CUSTOM )和UF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM )把ug对话框的函数包起来,具体原因可参见ug帮助文档(虽然从来没什么太大帮助)。eg:
# s; n3 Q6 j8 ?0 \1 X) JShowWindow(SW_HIDE);//Optional, 隐藏父窗口6 C" w3 c& N% Z( W* y
UF_UI_lock_ug_access( UF_UI_FROM_CUSTOM ); UF_UI_select_by_class(message,&opts,&response,&count,&selectedItem );
+ w \7 w( X1 ^2 n) }) L' V6 LUF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM );
. m- B! G' x5 P) W; _; L" @: Y& x% IShowWindow(SW_SHOW);//Optional,再次显示父窗口
* w4 n6 Y) c9 H' o) Q6 {* N$ S) B6 P- L, S; d* h' |" K" P+ A
PS:对于隐藏和显示父窗口,对于模态对话框来说要稍微复杂一点,此处不赘言。
' z# L/ z, g, z" U* E) Z
2 i' T+ N2 x) \8 E' v3 q, B* U4. 也是其他文章经常讲到的,为对话框添加OnDestroy函数,在其中删除掉this指针,销毁对话框对象;
9 O4 E0 E$ s/ ?2 m+ z" E" Z+ I" M) [8 m# n# ]
5. 如果对话框有OK, Cancel或Exit等出口按钮,一定要重载相应的响应函数,去掉OnOK之类的出口函数,用SendMessage(WM_DESTROY)来代替。之所以这么做的原因,是非模态对话框在被调用者的程序范围内无法得知其何时结束(不同于模态对话框的DoModal),因此只能由OnDestroy函数内完成销毁动作。当然还有其它的解决办法,此处推荐这种。. H; h% W$ Z a+ I1 g" q& C
/ a: O/ P2 x. I6 X6 k: k6. Last but not the least,非常不引人注意而又非常致命的一点,在ufusr_ask_unload函数中要使用UF_UNLOAD_SEL_DIALOG而非UF_UNLOAD_IMMEDIATELY作为返回值,否则ug加载对话框时将出错!!! |
的文章很多了,这里仅专门针对非模态对话框要特别注意的几个事项进行说明:
4 k3 M5 I- G+ l }/ k9 U' s! z- L. ^/ P, \: y/ O, p' n2 }8 B7 T
1. 在创建和调用对话框之前一定要使用AFX_MANAGE_STATE(AfxGetStaticModuleState()),这是因为mfc创建的project类型肯定只能是dll,需要告诉在运行时去dll所在的模块下找资源文件而不是去应用程序(也就是ug)中找。这一点适用于所有ug调用的mfc项目;0 a, f+ z5 s+ }1 j' G5 k
+ z% o$ A* |5 n- C3 f" [8 A' E2. 创建对话框的代码如下
% ~ B" N$ G1 ]; J7 l0 v- {, U/ A. u0 X' t
HWND UGHwnd = (HWND) UF_UI_get_default_parent();
. b( q' ]- |" T CWnd *ugwindow = CWnd::FromHandle(UGHwnd);8 Z( a+ e6 P7 r+ b
! k! X$ P# ~$ Y/ X
CMfcDialog *pMfcDlg=NULL;9 b3 N1 j q- @) F3 ~; [! F- L
pMfcDlg= new pMfcDlg(ugwindow); ' k' S* L/ c, X3 G" ?
pMfcDlg->Create(IDD_DIALOG, ugwindow);# j% `1 S/ k1 h' i
//可以在此处添加SetWindowPos设置对话框出现的位置
1 Y" e" P0 v8 G! t t. P1 H pSimDlg->ShowWindow(SW_NORMAL);, r& a i! d( L* o' Q
5 N0 k8 H( _! w+ G
创建时一定要使用指针,这点在很多文章和帖子上已经反复强调过。这里想强调的一点是最好得到ug自身的窗口(句柄或者CWnd),将其作为父窗口传给对话框,很有好处和必要;
( s" w: b2 x4 c( G& }0 `8 L; j5 a+ J2 N7 d: G
3. 第三点是我发帖子刚刚在论坛上求问过的,就是非模态对话框和ug本身交互对话框的冲突,原来是要用UF_UI_lock_ug_access( UF_UI_FROM_CUSTOM )和UF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM )把ug对话框的函数包起来,具体原因可参见ug帮助文档(虽然从来没什么太大帮助)。eg:: l- A4 M# G4 ]& ] v
ShowWindow(SW_HIDE);//Optional, 隐藏父窗口
0 x! B7 H) E6 N* L- a+ C, fUF_UI_lock_ug_access( UF_UI_FROM_CUSTOM ); UF_UI_select_by_class(message,&opts,&response,&count,&selectedItem );
. {' A7 Q5 m4 k; p. IUF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM );& t0 H2 G9 e' G: z! ?' _2 h
ShowWindow(SW_SHOW);//Optional,再次显示父窗口3 W, `% L2 \. y; w
, S# s D3 [$ G3 i2 R- ^
PS:对于隐藏和显示父窗口,对于模态对话框来说要稍微复杂一点,此处不赘言。
" n) s. P# I9 \# @4 X+ \( t
! f& |' s( o' `7 ^9 h0 R0 d9 u4. 也是其他文章经常讲到的,为对话框添加OnDestroy函数,在其中删除掉this指针,销毁对话框对象;
1 ^% `9 H6 |* h; L4 k4 |- l1 h
- ~, z$ d) z+ O. H; l6 G5. 如果对话框有OK, Cancel或Exit等出口按钮,一定要重载相应的响应函数,去掉OnOK之类的出口函数,用SendMessage(WM_DESTROY)来代替。之所以这么做的原因,是非模态对话框在被调用者的程序范围内无法得知其何时结束(不同于模态对话框的DoModal),因此只能由OnDestroy函数内完成销毁动作。当然还有其它的解决办法,此处推荐这种。
' u! W9 f& N! R# S' \ t2 i! d; k7 R: t+ y0 c7 X3 Z* ?0 B3 e
6. Last but not the least,非常不引人注意而又非常致命的一点,在ufusr_ask_unload函数中要使用UF_UNLOAD_SEL_DIALOG而非UF_UNLOAD_IMMEDIATELY作为返回值,否则ug加载对话框时将出错!!! |
, r. D3 c8 }' j3 Z* i# u1 u |
|