|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
: }+ r: V5 p: @! h# g
. F+ F! e( p2 C! M( J: l
: `) J( Y8 `" [
9 I, |" f- c& k H- \- ~8 [6 B; s
UG中调用mfc对话框的文章很多了,这里仅专门针对非模态对话框要特别注意的几个事项进行说明:
% d0 B9 N6 q1 m# k
, l" d1 v) Y0 M q) N1. 在创建和调用对话框之前一定要使用AFX_MANAGE_STATE(AfxGetStaticModuleState()),这是因为mfc创建的project类型肯定只能是dll,需要告诉在运行时去dll所在的模块下找资源文件而不是去应用程序(也就是ug)中找。这一点适用于所有ug调用的mfc项目;
- q' Y% O, G: m1 Y; B$ m+ D+ D3 [* ^5 W
2. 创建对话框的代码如下
& }. Y" S# |/ B( K0 ~
9 O8 S4 X0 l( Z+ O9 K HWND UGHwnd = (HWND) UF_UI_get_default_parent();9 G2 h2 `$ S5 i( u- U
CWnd *ugwindow = CWnd::FromHandle(UGHwnd);1 F0 J4 n8 m i5 A) d4 D
9 H( b m5 e& T+ o: d0 r. o* n
CMfcDialog *pMfcDlg=NULL;
' Y6 H+ @! `4 r* V& @ Y pMfcDlg= new pMfcDlg(ugwindow); , v- K: J( T: _. y4 K& v
pMfcDlg->Create(IDD_DIALOG, ugwindow);
6 [( G8 G0 P9 Q3 g //可以在此处添加SetWindowPos设置对话框出现的位置 y8 h6 ?2 H& F/ ~' l. v
pSimDlg->ShowWindow(SW_NORMAL);
( Y# Z {8 a8 M! R8 F
) l3 x& h; o: l% ^$ D创建时一定要使用指针,这点在很多文章和帖子上已经反复强调过。这里想强调的一点是最好得到ug自身的窗口(句柄或者CWnd),将其作为父窗口传给对话框,很有好处和必要;0 i5 p; {0 j [- v+ v* q
9 ?: J2 M, F+ @4 K, Z$ y
3. 第三点是我发帖子刚刚在论坛上求问过的,就是非模态对话框和ug本身交互对话框的冲突,原来是要用UF_UI_lock_ug_access( UF_UI_FROM_CUSTOM )和UF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM )把ug对话框的函数包起来,具体原因可参见ug帮助文档(虽然从来没什么太大帮助)。eg:8 N$ Z' V! M7 v _( l$ V
ShowWindow(SW_HIDE);//Optional, 隐藏父窗口
0 _. S& q: e6 E H$ h% fUF_UI_lock_ug_access( UF_UI_FROM_CUSTOM ); UF_UI_select_by_class(message,&opts,&response,&count,&selectedItem );
1 o% C# {5 U" ]: X, I) j fUF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM );
$ t: Z: z; T' }ShowWindow(SW_SHOW);//Optional,再次显示父窗口" E) j+ B* i3 j
6 g Y4 g) l, SPS:对于隐藏和显示父窗口,对于模态对话框来说要稍微复杂一点,此处不赘言。7 w- Q3 Q# t+ T" K: g1 }! U+ R
S2 v# X+ T0 W# u: }
4. 也是其他文章经常讲到的,为对话框添加OnDestroy函数,在其中删除掉this指针,销毁对话框对象;3 h: w4 w: r# O! [7 z- l
9 N" Z" K; r* a% K# A# R6 p7 r! o5. 如果对话框有OK, Cancel或Exit等出口按钮,一定要重载相应的响应函数,去掉OnOK之类的出口函数,用SendMessage(WM_DESTROY)来代替。之所以这么做的原因,是非模态对话框在被调用者的程序范围内无法得知其何时结束(不同于模态对话框的DoModal),因此只能由OnDestroy函数内完成销毁动作。当然还有其它的解决办法,此处推荐这种。; {: \7 Q. _$ ?5 j$ n' Y4 r9 u/ g
" l" E0 \( y6 E2 \# V! v( E
6. Last but not the least,非常不引人注意而又非常致命的一点,在ufusr_ask_unload函数中要使用UF_UNLOAD_SEL_DIALOG而非UF_UNLOAD_IMMEDIATELY作为返回值,否则ug加载对话框时将出错!!! |
的文章很多了,这里仅专门针对非模态对话框要特别注意的几个事项进行说明:+ z# U) e z: [8 l6 I
. r( ^, v$ l; h+ r& Z
1. 在创建和调用对话框之前一定要使用AFX_MANAGE_STATE(AfxGetStaticModuleState()),这是因为mfc创建的project类型肯定只能是dll,需要告诉在运行时去dll所在的模块下找资源文件而不是去应用程序(也就是ug)中找。这一点适用于所有ug调用的mfc项目;
+ a, B8 ]' ]9 w; \! R) c- Q1 X3 H
2. 创建对话框的代码如下
( K* |2 G5 V+ |) O! H% m3 ^/ e" x3 G8 M5 L
HWND UGHwnd = (HWND) UF_UI_get_default_parent();
! M' q# F9 ~5 f. y& | CWnd *ugwindow = CWnd::FromHandle(UGHwnd);
! \9 U9 F0 ?( I3 U1 M
' Y9 f0 g' X. J& ]: s CMfcDialog *pMfcDlg=NULL;4 y/ x; i4 V7 J3 W* S% `" g
pMfcDlg= new pMfcDlg(ugwindow);
6 o1 T8 C4 k: _. I y4 t) q pMfcDlg->Create(IDD_DIALOG, ugwindow);; `1 z1 [9 q, Z3 P1 W. Y
//可以在此处添加SetWindowPos设置对话框出现的位置- f/ E# H3 B/ N7 w
pSimDlg->ShowWindow(SW_NORMAL);
5 }3 I6 ^$ @) c5 @) W. R5 I- H \ I6 k0 I* x7 K
创建时一定要使用指针,这点在很多文章和帖子上已经反复强调过。这里想强调的一点是最好得到ug自身的窗口(句柄或者CWnd),将其作为父窗口传给对话框,很有好处和必要;- n: a# K9 W3 c; I
! \# I: w4 C$ X' }, k3. 第三点是我发帖子刚刚在论坛上求问过的,就是非模态对话框和ug本身交互对话框的冲突,原来是要用UF_UI_lock_ug_access( UF_UI_FROM_CUSTOM )和UF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM )把ug对话框的函数包起来,具体原因可参见ug帮助文档(虽然从来没什么太大帮助)。eg:
7 k/ j( t# p9 s+ mShowWindow(SW_HIDE);//Optional, 隐藏父窗口
/ R5 q+ [$ Q4 T% k* z% pUF_UI_lock_ug_access( UF_UI_FROM_CUSTOM ); UF_UI_select_by_class(message,&opts,&response,&count,&selectedItem );2 P: Y+ X/ N6 Y' w2 x! j
UF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM );4 L+ p1 F: R. L
ShowWindow(SW_SHOW);//Optional,再次显示父窗口
# d, S4 g* }2 j" Z7 h x
! W& l; Z& W. ]. fPS:对于隐藏和显示父窗口,对于模态对话框来说要稍微复杂一点,此处不赘言。
3 _. B& W4 w2 X! g) y# l
/ Q; o6 Y R' A! \' q9 H0 _4. 也是其他文章经常讲到的,为对话框添加OnDestroy函数,在其中删除掉this指针,销毁对话框对象;
7 j6 @/ Y, o) E; ]2 [5 _8 x$ x7 d* W3 e. ]! B8 ?, a; e- n8 Z* }
5. 如果对话框有OK, Cancel或Exit等出口按钮,一定要重载相应的响应函数,去掉OnOK之类的出口函数,用SendMessage(WM_DESTROY)来代替。之所以这么做的原因,是非模态对话框在被调用者的程序范围内无法得知其何时结束(不同于模态对话框的DoModal),因此只能由OnDestroy函数内完成销毁动作。当然还有其它的解决办法,此处推荐这种。
# J' f2 z2 y- p! W4 Z4 A4 e4 E7 g- }( R% U3 g
6. Last but not the least,非常不引人注意而又非常致命的一点,在ufusr_ask_unload函数中要使用UF_UNLOAD_SEL_DIALOG而非UF_UNLOAD_IMMEDIATELY作为返回值,否则ug加载对话框时将出错!!! | * u& t) r8 j8 y
|
|