查看: 3326|回复: 0

[原创] ug中调用mfc对话框需要注意的地方

[复制链接]

4

主题

3

回帖

40

积分

管理员

积分
40
发表于 2017-8-31 13:20:47 | 显示全部楼层 |阅读模式

请使用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
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.doteam.tech
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

在本版发帖
关注公众号
QQ客服返回顶部