|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
×
5 f# r( N N2 P2 Z
5 t" D# I$ `& I9 ^/ H+ X" D) M, o. ^, f& ^
/ o q. T5 J6 U; i: \; xUG中调用mfc对话框的文章很多了,这里仅专门针对非模态对话框要特别注意的几个事项进行说明:
' ^" K* s* }: z' L( m2 i2 W! V& o& ]) g' m( C
1. 在创建和调用对话框之前一定要使用AFX_MANAGE_STATE(AfxGetStaticModuleState()),这是因为mfc创建的project类型肯定只能是dll,需要告诉在运行时去dll所在的模块下找资源文件而不是去应用程序(也就是ug)中找。这一点适用于所有ug调用的mfc项目;( s# I$ s' d( F
% r8 a* |. d5 G9 d2. 创建对话框的代码如下& N4 F4 ^9 X6 X$ s9 K. x" ~9 l% @
% P+ M1 K) Y' X; e, D# Z HWND UGHwnd = (HWND) UF_UI_get_default_parent();
$ r- L$ \2 X# R$ e! e CWnd *ugwindow = CWnd::FromHandle(UGHwnd);
+ S w8 J$ n) i1 {4 ?
2 m9 p6 `) U* t+ b( [ u CMfcDialog *pMfcDlg=NULL;
; X& l' L! x' u pMfcDlg= new pMfcDlg(ugwindow);
7 r9 s. d2 u; y! T pMfcDlg->Create(IDD_DIALOG, ugwindow);
1 |5 F* ?: q/ C; Y4 n6 }' b$ Q //可以在此处添加SetWindowPos设置对话框出现的位置
. G# w/ Q) X! Y% @, ]+ {' F pSimDlg->ShowWindow(SW_NORMAL);# W- ]0 d5 I8 l5 P2 ~; b
9 Z9 @3 W, J5 x" L6 s$ S' H$ M创建时一定要使用指针,这点在很多文章和帖子上已经反复强调过。这里想强调的一点是最好得到ug自身的窗口(句柄或者CWnd),将其作为父窗口传给对话框,很有好处和必要;7 G8 M$ w! ^( _; a/ Z2 C' f
! ?8 h) A; l' Y8 ?3. 第三点是我发帖子刚刚在论坛上求问过的,就是非模态对话框和ug本身交互对话框的冲突,原来是要用UF_UI_lock_ug_access( UF_UI_FROM_CUSTOM )和UF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM )把ug对话框的函数包起来,具体原因可参见ug帮助文档(虽然从来没什么太大帮助)。eg:: p, {+ t6 A- E! r( E
ShowWindow(SW_HIDE);//Optional, 隐藏父窗口 b/ W8 h) X& `) ]
UF_UI_lock_ug_access( UF_UI_FROM_CUSTOM ); UF_UI_select_by_class(message,&opts,&response,&count,&selectedItem );
( P. J& H( e# RUF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM );# y* a, ^- m$ g1 f8 H2 V
ShowWindow(SW_SHOW);//Optional,再次显示父窗口' z6 \# ?% I/ d4 Q. c/ g
" d" \. F' }4 Z! E+ s0 ~
PS:对于隐藏和显示父窗口,对于模态对话框来说要稍微复杂一点,此处不赘言。/ c' U/ T* H% S0 q5 i9 K% s
' L; U9 p) h2 A4. 也是其他文章经常讲到的,为对话框添加OnDestroy函数,在其中删除掉this指针,销毁对话框对象;
& G9 J0 F& z) ^+ N- M8 g4 e2 K# f* Z
4 ^( a: ~/ N. x- l# S5. 如果对话框有OK, Cancel或Exit等出口按钮,一定要重载相应的响应函数,去掉OnOK之类的出口函数,用SendMessage(WM_DESTROY)来代替。之所以这么做的原因,是非模态对话框在被调用者的程序范围内无法得知其何时结束(不同于模态对话框的DoModal),因此只能由OnDestroy函数内完成销毁动作。当然还有其它的解决办法,此处推荐这种。* _. B7 Y! X; d4 t2 w9 r$ B
- F: s8 O5 y6 t* H0 B @6. Last but not the least,非常不引人注意而又非常致命的一点,在ufusr_ask_unload函数中要使用UF_UNLOAD_SEL_DIALOG而非UF_UNLOAD_IMMEDIATELY作为返回值,否则ug加载对话框时将出错!!! |
的文章很多了,这里仅专门针对非模态对话框要特别注意的几个事项进行说明:1 W/ W/ R; |0 n" z+ L& S8 z0 J
2 x, b+ v5 y8 j* k
1. 在创建和调用对话框之前一定要使用AFX_MANAGE_STATE(AfxGetStaticModuleState()),这是因为mfc创建的project类型肯定只能是dll,需要告诉在运行时去dll所在的模块下找资源文件而不是去应用程序(也就是ug)中找。这一点适用于所有ug调用的mfc项目;0 ^8 J; j x/ h% c( i' I
& U; Q4 w9 L/ L2 ]0 [$ N% H
2. 创建对话框的代码如下4 Q7 C" N& P* {5 h
, K1 r7 G( w+ f ~1 Y8 a' C HWND UGHwnd = (HWND) UF_UI_get_default_parent();
+ Q8 I; S2 A. t# Z3 B) }& |/ _! d CWnd *ugwindow = CWnd::FromHandle(UGHwnd);
+ I3 I0 N- Q9 {
1 i5 A/ E' X2 l% y' y. W/ n CMfcDialog *pMfcDlg=NULL;
! R( T# M* z2 @* r pMfcDlg= new pMfcDlg(ugwindow);
4 v9 h1 m/ ^$ S E pMfcDlg->Create(IDD_DIALOG, ugwindow);
6 @! T# s: r( M* v# S //可以在此处添加SetWindowPos设置对话框出现的位置
7 A0 |9 p0 Z! ^- w$ } pSimDlg->ShowWindow(SW_NORMAL);
4 k. e5 h) c* I# ~; B; V$ M! h' h F$ y/ ], n- a
创建时一定要使用指针,这点在很多文章和帖子上已经反复强调过。这里想强调的一点是最好得到ug自身的窗口(句柄或者CWnd),将其作为父窗口传给对话框,很有好处和必要;
. _" W/ w# [) g4 t0 A5 P) \9 U( G3 T$ H5 K/ S; v, x4 E
3. 第三点是我发帖子刚刚在论坛上求问过的,就是非模态对话框和ug本身交互对话框的冲突,原来是要用UF_UI_lock_ug_access( UF_UI_FROM_CUSTOM )和UF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM )把ug对话框的函数包起来,具体原因可参见ug帮助文档(虽然从来没什么太大帮助)。eg:
8 N9 |+ b' M4 P; AShowWindow(SW_HIDE);//Optional, 隐藏父窗口* n! V2 X! J( ?4 U* `7 o+ w
UF_UI_lock_ug_access( UF_UI_FROM_CUSTOM ); UF_UI_select_by_class(message,&opts,&response,&count,&selectedItem );
% X- Y7 m( p9 J* c3 L5 q3 |0 cUF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM );
{, w3 L% y1 S- D& e+ c O6 EShowWindow(SW_SHOW);//Optional,再次显示父窗口* E# s# C& U1 x/ j2 u
% Z/ B# B$ P# f( R) h; d
PS:对于隐藏和显示父窗口,对于模态对话框来说要稍微复杂一点,此处不赘言。
% }. M; R+ F4 S( e7 k3 e! w) E7 A/ Z
' Z3 a+ g- @. b$ ^1 c5 M0 W4. 也是其他文章经常讲到的,为对话框添加OnDestroy函数,在其中删除掉this指针,销毁对话框对象;
, {! p, q0 {2 r7 ~8 G6 f( A7 V0 H: \ j, ]0 c! ?3 Q& q. [ Z
5. 如果对话框有OK, Cancel或Exit等出口按钮,一定要重载相应的响应函数,去掉OnOK之类的出口函数,用SendMessage(WM_DESTROY)来代替。之所以这么做的原因,是非模态对话框在被调用者的程序范围内无法得知其何时结束(不同于模态对话框的DoModal),因此只能由OnDestroy函数内完成销毁动作。当然还有其它的解决办法,此处推荐这种。
4 F! n0 k/ z- @( l' r, L& k/ L$ g R- e+ A& E; K1 _; D- }* T
6. Last but not the least,非常不引人注意而又非常致命的一点,在ufusr_ask_unload函数中要使用UF_UNLOAD_SEL_DIALOG而非UF_UNLOAD_IMMEDIATELY作为返回值,否则ug加载对话框时将出错!!! | 0 n* d* |% ^" ?6 i
|
|