|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
! T% a4 D0 g1 @- F+ I9 M& E
7 c7 i# `; \, ?3 U0 P
# y1 X$ ?& Y, u% ^, E
4 m+ Z% J" R, l% d S+ A6 O5 S- u+ ^UG中调用mfc对话框的文章很多了,这里仅专门针对非模态对话框要特别注意的几个事项进行说明:
' ?: y+ f7 r5 u1 `5 t$ n7 T+ d
) L$ Z! N3 [( F0 N1. 在创建和调用对话框之前一定要使用AFX_MANAGE_STATE(AfxGetStaticModuleState()),这是因为mfc创建的project类型肯定只能是dll,需要告诉在运行时去dll所在的模块下找资源文件而不是去应用程序(也就是ug)中找。这一点适用于所有ug调用的mfc项目;0 P" Z8 X. t3 Z k- a+ Q% B
9 f* g8 ]& g& `2 u$ |1 x$ ?
2. 创建对话框的代码如下( J; i3 J9 C+ k! P
) U$ M+ v& R6 @$ m* P$ I' G HWND UGHwnd = (HWND) UF_UI_get_default_parent();
J. B# c) h' L CWnd *ugwindow = CWnd::FromHandle(UGHwnd);" t# Q7 o8 {7 Z9 P0 I
! B' N8 T; k7 W {7 k- D" _+ y
CMfcDialog *pMfcDlg=NULL;9 a# ` m" @( k. L
pMfcDlg= new pMfcDlg(ugwindow);
U, k# M+ Y6 _( H1 R1 M5 x9 g pMfcDlg->Create(IDD_DIALOG, ugwindow);2 F3 J3 K$ L$ Z9 \ f
//可以在此处添加SetWindowPos设置对话框出现的位置( f+ S5 y1 K( q1 n _
pSimDlg->ShowWindow(SW_NORMAL);$ J$ E6 C8 @7 n# J1 h, {9 l- p
4 g8 G! r o0 @创建时一定要使用指针,这点在很多文章和帖子上已经反复强调过。这里想强调的一点是最好得到ug自身的窗口(句柄或者CWnd),将其作为父窗口传给对话框,很有好处和必要;
" U. M! }0 [" F z5 W8 ?) ]! z4 R; o8 E4 j, p
3. 第三点是我发帖子刚刚在论坛上求问过的,就是非模态对话框和ug本身交互对话框的冲突,原来是要用UF_UI_lock_ug_access( UF_UI_FROM_CUSTOM )和UF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM )把ug对话框的函数包起来,具体原因可参见ug帮助文档(虽然从来没什么太大帮助)。eg:. R# s3 x1 k [8 ?' Q) v) r2 L* x
ShowWindow(SW_HIDE);//Optional, 隐藏父窗口- R. U* H" \$ g$ U% t
UF_UI_lock_ug_access( UF_UI_FROM_CUSTOM ); UF_UI_select_by_class(message,&opts,&response,&count,&selectedItem );) b3 b2 k8 y* f; r7 f' d
UF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM );
2 @; Z6 m; x3 Z- d6 iShowWindow(SW_SHOW);//Optional,再次显示父窗口% Q$ k& B, D0 p4 @( C3 w7 l% w
: _* }: ]& V; @! JPS:对于隐藏和显示父窗口,对于模态对话框来说要稍微复杂一点,此处不赘言。8 o ~3 G% Q6 g
' w9 X) ^* k6 T3 _4. 也是其他文章经常讲到的,为对话框添加OnDestroy函数,在其中删除掉this指针,销毁对话框对象;9 F$ X6 e$ A) Z( B9 O
& b( j% Z; a' `+ h8 Q5. 如果对话框有OK, Cancel或Exit等出口按钮,一定要重载相应的响应函数,去掉OnOK之类的出口函数,用SendMessage(WM_DESTROY)来代替。之所以这么做的原因,是非模态对话框在被调用者的程序范围内无法得知其何时结束(不同于模态对话框的DoModal),因此只能由OnDestroy函数内完成销毁动作。当然还有其它的解决办法,此处推荐这种。
& f8 ?! R7 J+ P* g& r4 `
: ~! p# [" }5 p! b! c6. Last but not the least,非常不引人注意而又非常致命的一点,在ufusr_ask_unload函数中要使用UF_UNLOAD_SEL_DIALOG而非UF_UNLOAD_IMMEDIATELY作为返回值,否则ug加载对话框时将出错!!! |
的文章很多了,这里仅专门针对非模态对话框要特别注意的几个事项进行说明:
. C1 _& H! o$ W) O) f7 c5 ~# F5 _( |
1. 在创建和调用对话框之前一定要使用AFX_MANAGE_STATE(AfxGetStaticModuleState()),这是因为mfc创建的project类型肯定只能是dll,需要告诉在运行时去dll所在的模块下找资源文件而不是去应用程序(也就是ug)中找。这一点适用于所有ug调用的mfc项目;
# z3 S$ |$ ~' Y Z( m
/ {9 X1 c5 j" ^' o$ C2. 创建对话框的代码如下% c8 c+ _! h. n' }# r2 d
# y* X, d1 G# T, {2 D6 N. w
HWND UGHwnd = (HWND) UF_UI_get_default_parent();
p+ m# S4 }, Z CWnd *ugwindow = CWnd::FromHandle(UGHwnd);
2 |; l0 Q/ ^- |2 m3 |
! c* i* ?7 Z& J) {9 i& A9 n& O& ]8 J CMfcDialog *pMfcDlg=NULL;3 u4 [, F2 s2 Y: S. K1 g7 J, o
pMfcDlg= new pMfcDlg(ugwindow); 4 s) a1 t7 Y) K* j8 _* M
pMfcDlg->Create(IDD_DIALOG, ugwindow);; z4 g/ A; T) q/ n H8 f9 ?
//可以在此处添加SetWindowPos设置对话框出现的位置
: q! q3 E& c v. p pSimDlg->ShowWindow(SW_NORMAL);
3 e( m9 ]& g/ ^6 |2 J
4 d7 n/ g% ^3 M5 Q$ ?创建时一定要使用指针,这点在很多文章和帖子上已经反复强调过。这里想强调的一点是最好得到ug自身的窗口(句柄或者CWnd),将其作为父窗口传给对话框,很有好处和必要;
u& v+ V- ~7 ]" ^ h g1 I
( [/ ^/ U9 C1 [3. 第三点是我发帖子刚刚在论坛上求问过的,就是非模态对话框和ug本身交互对话框的冲突,原来是要用UF_UI_lock_ug_access( UF_UI_FROM_CUSTOM )和UF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM )把ug对话框的函数包起来,具体原因可参见ug帮助文档(虽然从来没什么太大帮助)。eg:( q6 o" l# Z: B- A- M& ?- X
ShowWindow(SW_HIDE);//Optional, 隐藏父窗口/ `* h2 S3 K, H# E8 d4 j0 h
UF_UI_lock_ug_access( UF_UI_FROM_CUSTOM ); UF_UI_select_by_class(message,&opts,&response,&count,&selectedItem );* ?6 r9 K# H; n+ g
UF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM );
# j- U3 N! f5 x& V* k* FShowWindow(SW_SHOW);//Optional,再次显示父窗口
5 q4 m9 n( \6 h# T( l: T
/ P& d2 U1 ^2 U4 z2 c N2 cPS:对于隐藏和显示父窗口,对于模态对话框来说要稍微复杂一点,此处不赘言。. a: ]+ B8 x/ x) |) f! }- [4 V0 Q$ I
/ b* ]: y9 |* N5 S7 O
4. 也是其他文章经常讲到的,为对话框添加OnDestroy函数,在其中删除掉this指针,销毁对话框对象;8 M% j4 \3 `! p
' i k( T) K" {; [8 s' ^5. 如果对话框有OK, Cancel或Exit等出口按钮,一定要重载相应的响应函数,去掉OnOK之类的出口函数,用SendMessage(WM_DESTROY)来代替。之所以这么做的原因,是非模态对话框在被调用者的程序范围内无法得知其何时结束(不同于模态对话框的DoModal),因此只能由OnDestroy函数内完成销毁动作。当然还有其它的解决办法,此处推荐这种。
* B; P! u, d6 i7 H* Y0 @* Q0 ~
! ?; ~% t: ]: {! Z9 Z6. Last but not the least,非常不引人注意而又非常致命的一点,在ufusr_ask_unload函数中要使用UF_UNLOAD_SEL_DIALOG而非UF_UNLOAD_IMMEDIATELY作为返回值,否则ug加载对话框时将出错!!! | . P6 p6 ^- K) |; Q+ F
|
|