|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
( r. C1 z5 `! X! {+ f" _
& g3 @- z! L) q. _# r
, U- s& ^6 a1 g( T
! Q( \# e5 U( {7 e5 O1 QUG中调用mfc对话框的文章很多了,这里仅专门针对非模态对话框要特别注意的几个事项进行说明:
3 ~! s. i2 ^! b* i7 p$ q; [; r1 ]9 t
$ _7 }# |8 L7 K9 b1. 在创建和调用对话框之前一定要使用AFX_MANAGE_STATE(AfxGetStaticModuleState()),这是因为mfc创建的project类型肯定只能是dll,需要告诉在运行时去dll所在的模块下找资源文件而不是去应用程序(也就是ug)中找。这一点适用于所有ug调用的mfc项目;9 f: G9 g+ s q1 A g
1 H& u5 M" U! Y$ K4 D
2. 创建对话框的代码如下1 G3 u0 w6 m5 j1 @* ~& I0 T
& M4 _" Y3 O6 \- m. v* Z, r HWND UGHwnd = (HWND) UF_UI_get_default_parent();
" ]' D$ w: G6 a: i) }8 E/ \6 g! Z* T CWnd *ugwindow = CWnd::FromHandle(UGHwnd);" J: t. C! z4 c9 }6 t; B
3 V [6 A4 x4 {( H3 [ CMfcDialog *pMfcDlg=NULL;/ w* h' j6 D1 D) @9 j
pMfcDlg= new pMfcDlg(ugwindow); 1 x: I* _+ L/ d( G
pMfcDlg->Create(IDD_DIALOG, ugwindow);5 z! M" O9 S. z
//可以在此处添加SetWindowPos设置对话框出现的位置
% l* u" M# u( e/ @) b pSimDlg->ShowWindow(SW_NORMAL);# v# G! E2 S( p, V
W( j" ^' B( i7 w8 Y. e创建时一定要使用指针,这点在很多文章和帖子上已经反复强调过。这里想强调的一点是最好得到ug自身的窗口(句柄或者CWnd),将其作为父窗口传给对话框,很有好处和必要;+ {/ I$ r7 u4 W
. a* Q! E0 k& b3 D' E# H3. 第三点是我发帖子刚刚在论坛上求问过的,就是非模态对话框和ug本身交互对话框的冲突,原来是要用UF_UI_lock_ug_access( UF_UI_FROM_CUSTOM )和UF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM )把ug对话框的函数包起来,具体原因可参见ug帮助文档(虽然从来没什么太大帮助)。eg:
8 m/ x8 J4 A* j6 }7 BShowWindow(SW_HIDE);//Optional, 隐藏父窗口
2 g8 H& e% i+ o9 z# n$ z. BUF_UI_lock_ug_access( UF_UI_FROM_CUSTOM ); UF_UI_select_by_class(message,&opts,&response,&count,&selectedItem );
. s2 ?' a" c6 J# ]( L8 r3 f2 GUF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM );( ~3 Y9 o& r- x* y/ U, u m0 L# ?
ShowWindow(SW_SHOW);//Optional,再次显示父窗口
7 u: P6 c* E+ v6 b z3 W. q8 f" {2 N) o6 [: S: g$ ^
PS:对于隐藏和显示父窗口,对于模态对话框来说要稍微复杂一点,此处不赘言。
" i: E3 d- R3 y9 l% H, K5 }" f% ]1 W; ~+ p( j9 _
4. 也是其他文章经常讲到的,为对话框添加OnDestroy函数,在其中删除掉this指针,销毁对话框对象;
, \( ?$ W) w. R& L- T; P4 {. \. a% P6 u# d
5. 如果对话框有OK, Cancel或Exit等出口按钮,一定要重载相应的响应函数,去掉OnOK之类的出口函数,用SendMessage(WM_DESTROY)来代替。之所以这么做的原因,是非模态对话框在被调用者的程序范围内无法得知其何时结束(不同于模态对话框的DoModal),因此只能由OnDestroy函数内完成销毁动作。当然还有其它的解决办法,此处推荐这种。
- `5 N* G9 l* b' f7 E2 v3 O# J# F9 f9 t& R2 u9 d1 h
6. Last but not the least,非常不引人注意而又非常致命的一点,在ufusr_ask_unload函数中要使用UF_UNLOAD_SEL_DIALOG而非UF_UNLOAD_IMMEDIATELY作为返回值,否则ug加载对话框时将出错!!! |
的文章很多了,这里仅专门针对非模态对话框要特别注意的几个事项进行说明:; v. j8 o; T5 ?/ p( c4 Z5 I
7 R. A; |. k: W' ]1. 在创建和调用对话框之前一定要使用AFX_MANAGE_STATE(AfxGetStaticModuleState()),这是因为mfc创建的project类型肯定只能是dll,需要告诉在运行时去dll所在的模块下找资源文件而不是去应用程序(也就是ug)中找。这一点适用于所有ug调用的mfc项目;% r+ }4 f* ~0 {2 T0 s8 r2 f) q' z. g
1 w; e6 u3 a: Q, {/ f2. 创建对话框的代码如下/ @1 f$ A7 }8 j1 ^
: S9 X! n' t& b! A" h: R
HWND UGHwnd = (HWND) UF_UI_get_default_parent();
8 @, [# [2 Z: k- w& x3 ^ CWnd *ugwindow = CWnd::FromHandle(UGHwnd);& K* ~" ?# |; f/ b+ U2 i3 k
' h B% S; |8 a: M p7 L
CMfcDialog *pMfcDlg=NULL;3 b! K( e+ k G8 G# {8 w
pMfcDlg= new pMfcDlg(ugwindow);
. a2 @: n7 R+ z0 s2 j( b pMfcDlg->Create(IDD_DIALOG, ugwindow);$ T7 i0 t# D" z+ K+ ~; H; |
//可以在此处添加SetWindowPos设置对话框出现的位置
9 ~# _" x1 g9 b, Z1 O pSimDlg->ShowWindow(SW_NORMAL);
! N' C1 e/ {" Y" Z
, N5 w: B: }; X! W创建时一定要使用指针,这点在很多文章和帖子上已经反复强调过。这里想强调的一点是最好得到ug自身的窗口(句柄或者CWnd),将其作为父窗口传给对话框,很有好处和必要;
8 J8 f+ O/ V$ x p0 D. U( @8 @) r3 q/ e- a6 J% \) v
3. 第三点是我发帖子刚刚在论坛上求问过的,就是非模态对话框和ug本身交互对话框的冲突,原来是要用UF_UI_lock_ug_access( UF_UI_FROM_CUSTOM )和UF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM )把ug对话框的函数包起来,具体原因可参见ug帮助文档(虽然从来没什么太大帮助)。eg:
& b3 F% m; m& M g. dShowWindow(SW_HIDE);//Optional, 隐藏父窗口9 O+ C3 \8 ^1 H
UF_UI_lock_ug_access( UF_UI_FROM_CUSTOM ); UF_UI_select_by_class(message,&opts,&response,&count,&selectedItem );( b7 ^1 p. E( f9 w/ G& x8 P
UF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM );! G1 V+ c9 }/ _9 h5 k5 i3 I9 A
ShowWindow(SW_SHOW);//Optional,再次显示父窗口9 n: r! F3 y/ }1 W3 d6 h
7 K- l9 [- e& B \PS:对于隐藏和显示父窗口,对于模态对话框来说要稍微复杂一点,此处不赘言。
& e0 E: E7 f6 c9 T; ~+ H- r3 P1 V5 v2 h2 o7 M% [* q( V5 Q% x" W% i
4. 也是其他文章经常讲到的,为对话框添加OnDestroy函数,在其中删除掉this指针,销毁对话框对象;
5 `) ]0 X% x7 j6 V
w6 }2 T0 h1 [% |( i4 a5. 如果对话框有OK, Cancel或Exit等出口按钮,一定要重载相应的响应函数,去掉OnOK之类的出口函数,用SendMessage(WM_DESTROY)来代替。之所以这么做的原因,是非模态对话框在被调用者的程序范围内无法得知其何时结束(不同于模态对话框的DoModal),因此只能由OnDestroy函数内完成销毁动作。当然还有其它的解决办法,此处推荐这种。
8 F, A3 Z' W* b8 i3 T. |
! Y. I4 x( i3 L. N4 R6. Last but not the least,非常不引人注意而又非常致命的一点,在ufusr_ask_unload函数中要使用UF_UNLOAD_SEL_DIALOG而非UF_UNLOAD_IMMEDIATELY作为返回值,否则ug加载对话框时将出错!!! |
r+ A* w& a+ G/ I |
|