|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
. _* k7 H2 E% h: s) S- L7 V
6 A' q( H2 m0 Y
' b o5 R7 s3 N! K
9 R) ~! G( ]/ s* X7 i
UG中调用mfc对话框的文章很多了,这里仅专门针对非模态对话框要特别注意的几个事项进行说明:% g; m- h9 K; X1 a7 @4 i/ ]
6 g! c) h+ g' x5 d1. 在创建和调用对话框之前一定要使用AFX_MANAGE_STATE(AfxGetStaticModuleState()),这是因为mfc创建的project类型肯定只能是dll,需要告诉在运行时去dll所在的模块下找资源文件而不是去应用程序(也就是ug)中找。这一点适用于所有ug调用的mfc项目;
3 d- `1 N X& I+ }5 ~: S$ ?' s$ V; g7 d* n
2. 创建对话框的代码如下
$ B% x! G: w' }& u& j9 P
. Y. i& K/ I5 ]7 L& ^; o3 b9 U0 Y1 s HWND UGHwnd = (HWND) UF_UI_get_default_parent();- m/ e# {* f0 J2 D; J
CWnd *ugwindow = CWnd::FromHandle(UGHwnd);
, i o# O1 X* A- e, o& Y _2 S6 X
CMfcDialog *pMfcDlg=NULL;
3 q7 e6 `+ b$ @& O8 h/ ~ pMfcDlg= new pMfcDlg(ugwindow);
3 ~) D1 O7 i# F! v) f pMfcDlg->Create(IDD_DIALOG, ugwindow);
( E( V' l3 Z" w1 N; z4 I //可以在此处添加SetWindowPos设置对话框出现的位置
6 K7 ^0 ]7 V& n8 _ pSimDlg->ShowWindow(SW_NORMAL);# G% ^0 G( G5 o N2 C
" R5 O+ R0 t& C d3 d! J, r创建时一定要使用指针,这点在很多文章和帖子上已经反复强调过。这里想强调的一点是最好得到ug自身的窗口(句柄或者CWnd),将其作为父窗口传给对话框,很有好处和必要;4 D6 t3 M6 O7 y5 W: F& L* X
: m9 l: S* h6 u# R3. 第三点是我发帖子刚刚在论坛上求问过的,就是非模态对话框和ug本身交互对话框的冲突,原来是要用UF_UI_lock_ug_access( UF_UI_FROM_CUSTOM )和UF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM )把ug对话框的函数包起来,具体原因可参见ug帮助文档(虽然从来没什么太大帮助)。eg:6 d% l' C; I% O" j- v- o
ShowWindow(SW_HIDE);//Optional, 隐藏父窗口" r9 h( f* r) g$ w& }! q
UF_UI_lock_ug_access( UF_UI_FROM_CUSTOM ); UF_UI_select_by_class(message,&opts,&response,&count,&selectedItem );
! t* b7 J3 k0 k; eUF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM );& T, d/ K" s: M N; x) R: L5 T
ShowWindow(SW_SHOW);//Optional,再次显示父窗口
3 X2 W6 R `7 A& l/ I# j
2 w5 Z7 `9 H2 B3 F- ~& t0 T. `; uPS:对于隐藏和显示父窗口,对于模态对话框来说要稍微复杂一点,此处不赘言。
}/ m) b! w1 C
& H; \0 g! p' | n8 K" Z4. 也是其他文章经常讲到的,为对话框添加OnDestroy函数,在其中删除掉this指针,销毁对话框对象;
% o! u9 L' l2 A8 c3 d3 H2 Y/ I4 B
5. 如果对话框有OK, Cancel或Exit等出口按钮,一定要重载相应的响应函数,去掉OnOK之类的出口函数,用SendMessage(WM_DESTROY)来代替。之所以这么做的原因,是非模态对话框在被调用者的程序范围内无法得知其何时结束(不同于模态对话框的DoModal),因此只能由OnDestroy函数内完成销毁动作。当然还有其它的解决办法,此处推荐这种。
" L( M% N- C, h E; h) e" ?8 J" Y" H# Y6 V: E" w
6. Last but not the least,非常不引人注意而又非常致命的一点,在ufusr_ask_unload函数中要使用UF_UNLOAD_SEL_DIALOG而非UF_UNLOAD_IMMEDIATELY作为返回值,否则ug加载对话框时将出错!!! |
的文章很多了,这里仅专门针对非模态对话框要特别注意的几个事项进行说明:
8 X6 [. E( \) @& _+ r: L3 {" R& y N8 O+ o. X- X6 }
1. 在创建和调用对话框之前一定要使用AFX_MANAGE_STATE(AfxGetStaticModuleState()),这是因为mfc创建的project类型肯定只能是dll,需要告诉在运行时去dll所在的模块下找资源文件而不是去应用程序(也就是ug)中找。这一点适用于所有ug调用的mfc项目;
$ N9 Y s5 y$ ~& T6 U; F3 R
0 v+ g6 l% X7 Y: N: h$ B2. 创建对话框的代码如下
% e& d, Y1 D% V5 V* c0 [" }; H/ b
HWND UGHwnd = (HWND) UF_UI_get_default_parent();$ b( i* {. u4 \7 w0 i) B. L' e! T* k
CWnd *ugwindow = CWnd::FromHandle(UGHwnd);
# R% |6 r3 v8 G- @! M$ @( T' c4 o- l$ G, `6 X+ d) a4 S
CMfcDialog *pMfcDlg=NULL;9 |) Z# j) Z( W: \; w4 L
pMfcDlg= new pMfcDlg(ugwindow);
) W; ^/ w$ R6 k pMfcDlg->Create(IDD_DIALOG, ugwindow);0 I! x, v+ R7 { y' c5 d3 ]) }5 C
//可以在此处添加SetWindowPos设置对话框出现的位置
9 ` m% P m. h7 {( X, @ pSimDlg->ShowWindow(SW_NORMAL);
( f; F# P6 S: ]& o& i) Q( z
# ^7 y/ }1 p: t& G% T创建时一定要使用指针,这点在很多文章和帖子上已经反复强调过。这里想强调的一点是最好得到ug自身的窗口(句柄或者CWnd),将其作为父窗口传给对话框,很有好处和必要;
; x( C7 V$ ]5 ^9 Y& a( S7 a, T7 N& g: n. o. Y2 B$ m/ c
3. 第三点是我发帖子刚刚在论坛上求问过的,就是非模态对话框和ug本身交互对话框的冲突,原来是要用UF_UI_lock_ug_access( UF_UI_FROM_CUSTOM )和UF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM )把ug对话框的函数包起来,具体原因可参见ug帮助文档(虽然从来没什么太大帮助)。eg:4 f6 P( ]8 B; |$ T. _$ y+ }
ShowWindow(SW_HIDE);//Optional, 隐藏父窗口
1 `! q& g& m/ Z5 K; Z; VUF_UI_lock_ug_access( UF_UI_FROM_CUSTOM ); UF_UI_select_by_class(message,&opts,&response,&count,&selectedItem );" v5 o' o, S2 J( c2 X
UF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM );
, \! C. ]. M1 Z/ n9 ?2 a5 EShowWindow(SW_SHOW);//Optional,再次显示父窗口7 Z; G$ `/ t7 \" K; }& t
8 {* s, U2 r' y5 n# T. s$ }, `
PS:对于隐藏和显示父窗口,对于模态对话框来说要稍微复杂一点,此处不赘言。
) V- \" P o8 g1 r$ G | `
: z+ o/ z. k0 M6 D+ U7 H q4. 也是其他文章经常讲到的,为对话框添加OnDestroy函数,在其中删除掉this指针,销毁对话框对象;$ V9 d0 p' t5 ]
& L' q G; _' i% S9 O
5. 如果对话框有OK, Cancel或Exit等出口按钮,一定要重载相应的响应函数,去掉OnOK之类的出口函数,用SendMessage(WM_DESTROY)来代替。之所以这么做的原因,是非模态对话框在被调用者的程序范围内无法得知其何时结束(不同于模态对话框的DoModal),因此只能由OnDestroy函数内完成销毁动作。当然还有其它的解决办法,此处推荐这种。/ V9 k1 \( p- A0 K- I; F% A4 Y
! x8 ^* v! a9 A8 t" n9 M1 G
6. Last but not the least,非常不引人注意而又非常致命的一点,在ufusr_ask_unload函数中要使用UF_UNLOAD_SEL_DIALOG而非UF_UNLOAD_IMMEDIATELY作为返回值,否则ug加载对话框时将出错!!! | ! V% ~# d1 @3 i* O( Y
|
|