|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
) a+ h0 c9 B" R7 Y" s% ~# S6 S
# z( _3 q( m% f- B' S/ R+ X2 m
% Q( Z5 o, j7 R, k _
" P- Y/ h+ X0 [1 OUG中调用mfc对话框的文章很多了,这里仅专门针对非模态对话框要特别注意的几个事项进行说明:
9 N' g0 I$ l% @: s& R( r- V8 ~: n. m( ^: q" ~! I
1. 在创建和调用对话框之前一定要使用AFX_MANAGE_STATE(AfxGetStaticModuleState()),这是因为mfc创建的project类型肯定只能是dll,需要告诉在运行时去dll所在的模块下找资源文件而不是去应用程序(也就是ug)中找。这一点适用于所有ug调用的mfc项目;+ T( ^, B9 v$ k& |0 {
7 v. ]3 i- N1 E; I# ^) t; N$ r" x2. 创建对话框的代码如下
, _# g3 {* b# \* u; b, d
, e9 j, @! |: {# B HWND UGHwnd = (HWND) UF_UI_get_default_parent();; z) n8 M- b9 [, Z) ?
CWnd *ugwindow = CWnd::FromHandle(UGHwnd);
& P. P; f* z( E; e, }" v& l7 j# r. R1 M& t
CMfcDialog *pMfcDlg=NULL;
$ q* X0 P) {% j% o# a pMfcDlg= new pMfcDlg(ugwindow);
+ h$ W' @+ D& _% I g/ n pMfcDlg->Create(IDD_DIALOG, ugwindow);
( x2 s9 U# k8 i9 E; T //可以在此处添加SetWindowPos设置对话框出现的位置5 X5 E4 I& e: W3 {& R/ h$ P" D
pSimDlg->ShowWindow(SW_NORMAL);
/ b+ Z# H6 v* c2 o/ V! ~6 r5 G/ V2 b: t( n; }
创建时一定要使用指针,这点在很多文章和帖子上已经反复强调过。这里想强调的一点是最好得到ug自身的窗口(句柄或者CWnd),将其作为父窗口传给对话框,很有好处和必要;# E- ^9 c; v8 X j7 p) Z7 i9 @, H
4 H5 t" U/ T/ K
3. 第三点是我发帖子刚刚在论坛上求问过的,就是非模态对话框和ug本身交互对话框的冲突,原来是要用UF_UI_lock_ug_access( UF_UI_FROM_CUSTOM )和UF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM )把ug对话框的函数包起来,具体原因可参见ug帮助文档(虽然从来没什么太大帮助)。eg:' J! t z! S% V; y
ShowWindow(SW_HIDE);//Optional, 隐藏父窗口
8 t' L8 E( ]+ k2 S# O4 }0 ZUF_UI_lock_ug_access( UF_UI_FROM_CUSTOM ); UF_UI_select_by_class(message,&opts,&response,&count,&selectedItem );
, t# N8 g0 M. r/ rUF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM );6 ~( ]9 N# X3 }+ U
ShowWindow(SW_SHOW);//Optional,再次显示父窗口
+ u/ W& v) u! f/ `
6 }( U: [: d* k3 M4 tPS:对于隐藏和显示父窗口,对于模态对话框来说要稍微复杂一点,此处不赘言。1 X3 a# v _3 A* M) O5 x. b
. _9 }. {) v$ k f5 X+ G: r4. 也是其他文章经常讲到的,为对话框添加OnDestroy函数,在其中删除掉this指针,销毁对话框对象;( h1 n* k# J) O: |& i8 Z
4 ? ]7 u& ^4 Z9 o6 C4 u
5. 如果对话框有OK, Cancel或Exit等出口按钮,一定要重载相应的响应函数,去掉OnOK之类的出口函数,用SendMessage(WM_DESTROY)来代替。之所以这么做的原因,是非模态对话框在被调用者的程序范围内无法得知其何时结束(不同于模态对话框的DoModal),因此只能由OnDestroy函数内完成销毁动作。当然还有其它的解决办法,此处推荐这种。
@1 a) d2 H0 k6 x3 ^9 a$ i# d3 g9 f4 q# Z6 K3 F, H3 t
6. Last but not the least,非常不引人注意而又非常致命的一点,在ufusr_ask_unload函数中要使用UF_UNLOAD_SEL_DIALOG而非UF_UNLOAD_IMMEDIATELY作为返回值,否则ug加载对话框时将出错!!! |
的文章很多了,这里仅专门针对非模态对话框要特别注意的几个事项进行说明:
( P- h/ A4 S/ W4 e! w
0 J' @2 m: `) b2 t( C$ L1. 在创建和调用对话框之前一定要使用AFX_MANAGE_STATE(AfxGetStaticModuleState()),这是因为mfc创建的project类型肯定只能是dll,需要告诉在运行时去dll所在的模块下找资源文件而不是去应用程序(也就是ug)中找。这一点适用于所有ug调用的mfc项目;8 H, d* [5 ]0 `: @
' d2 f, _( r& u$ R1 A/ B/ H+ t3 p2 }
2. 创建对话框的代码如下& r5 p$ w# c- n/ `# t, f
* c% O. l. I( b3 ]
HWND UGHwnd = (HWND) UF_UI_get_default_parent();8 p& B' b, D) M! O
CWnd *ugwindow = CWnd::FromHandle(UGHwnd);( ]( V& y' `9 D/ Z6 _* l
- S4 |# P7 H: Y$ q7 H CMfcDialog *pMfcDlg=NULL;
. d' n8 V: V, J ~! Y pMfcDlg= new pMfcDlg(ugwindow);
3 L6 C! a2 m! \, R0 X8 u+ n) i1 g; m pMfcDlg->Create(IDD_DIALOG, ugwindow);9 N, J5 I* H6 H3 U% M1 W- ]: [6 q
//可以在此处添加SetWindowPos设置对话框出现的位置$ D* {2 w8 s! {- T7 t' ?
pSimDlg->ShowWindow(SW_NORMAL);
/ C, }" Y I# ]" j% m# N+ W1 r% ~, O9 r) H2 B% r
创建时一定要使用指针,这点在很多文章和帖子上已经反复强调过。这里想强调的一点是最好得到ug自身的窗口(句柄或者CWnd),将其作为父窗口传给对话框,很有好处和必要;
" @2 z9 G( V4 R6 Z( y9 `4 f5 Q
/ R4 Q- e6 R% n$ U8 L3. 第三点是我发帖子刚刚在论坛上求问过的,就是非模态对话框和ug本身交互对话框的冲突,原来是要用UF_UI_lock_ug_access( UF_UI_FROM_CUSTOM )和UF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM )把ug对话框的函数包起来,具体原因可参见ug帮助文档(虽然从来没什么太大帮助)。eg:
$ w1 y* F& {% q& H6 V7 `% nShowWindow(SW_HIDE);//Optional, 隐藏父窗口6 L5 }. q6 L: j4 [7 ?' ^
UF_UI_lock_ug_access( UF_UI_FROM_CUSTOM ); UF_UI_select_by_class(message,&opts,&response,&count,&selectedItem );
4 {6 B1 C7 P" Y8 f6 V; uUF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM );
6 b4 l& P/ a3 x/ K8 x& |ShowWindow(SW_SHOW);//Optional,再次显示父窗口
! C4 j( i2 B* l& Y, F2 j
% c$ r/ C7 Z& ^5 ~6 k4 uPS:对于隐藏和显示父窗口,对于模态对话框来说要稍微复杂一点,此处不赘言。, l& e* b! W: |
' c5 C/ Y3 s! v8 v) q. b4. 也是其他文章经常讲到的,为对话框添加OnDestroy函数,在其中删除掉this指针,销毁对话框对象;
) p3 ]8 [2 i4 c/ L6 ~* |
5 Y7 V# _8 W9 D5. 如果对话框有OK, Cancel或Exit等出口按钮,一定要重载相应的响应函数,去掉OnOK之类的出口函数,用SendMessage(WM_DESTROY)来代替。之所以这么做的原因,是非模态对话框在被调用者的程序范围内无法得知其何时结束(不同于模态对话框的DoModal),因此只能由OnDestroy函数内完成销毁动作。当然还有其它的解决办法,此处推荐这种。
% o* A- x. c% P
' E+ U$ b5 Q4 F6 x6. Last but not the least,非常不引人注意而又非常致命的一点,在ufusr_ask_unload函数中要使用UF_UNLOAD_SEL_DIALOG而非UF_UNLOAD_IMMEDIATELY作为返回值,否则ug加载对话框时将出错!!! |
2 n1 |; x' z) S' }% p0 ]4 u- j# p |
|