PLM之家PLMHome-国产软件践行者

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

[复制链接]

2017-8-31 13:20:47 2996 0

admin 发表于 2017-8-31 13:20:47 |阅读模式

admin 楼主

2017-8-31 13:20:47

请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!

您需要 登录 才可以下载或查看,没有账号?注册

x
* i0 J) E4 D" M% Z6 }* }

) y% S) H* h) n# o/ A" X! m& [- d, w
4 r6 I2 ^' A- A" p2 @
6 J+ I1 R9 J5 S
UG中调用mfc对话框的文章很多了,这里仅专门针对非模态对话框要特别注意的几个事项进行说明:  w' K  U1 O8 N5 ~3 b0 s

, b# k" [# {, L- B6 v4 w) v# l' G& W1. 在创建和调用对话框之前一定要使用AFX_MANAGE_STATE(AfxGetStaticModuleState()),这是因为mfc创建的project类型肯定只能是dll,需要告诉在运行时去dll所在的模块下找资源文件而不是去应用程序(也就是ug)中找。这一点适用于所有ug调用的mfc项目;
$ A- [) I: [3 k
& e& V5 B! s" q- I7 b) |, \  d2. 创建对话框的代码如下6 r( Y- |! a+ @! S% o$ p
& s* C  ~! x) _9 O' P% ^
    HWND UGHwnd = (HWND) UF_UI_get_default_parent();
& r( i! s" H- ]4 A. g# t, j    CWnd *ugwindow = CWnd::FromHandle(UGHwnd);; ^8 d& m9 H7 [: i! j# t$ _( |

3 [: F, O/ n: F" C, T" E7 k    CMfcDialog *pMfcDlg=NULL;
1 I- p0 j  ]+ e! i- I9 g    pMfcDlg= new pMfcDlg(ugwindow);  
8 z" Q% F: k' \5 u! L; a; D    pMfcDlg->Create(IDD_DIALOG, ugwindow);. N! x7 O+ l7 [% u& V# Z
    //可以在此处添加SetWindowPos设置对话框出现的位置
; G+ l6 E" j) B/ L/ e2 y    pSimDlg->ShowWindow(SW_NORMAL);4 ^, D! z- o% ^. _) Q
; T: z! I8 h1 A$ m) F2 R& U
创建时一定要使用指针,这点在很多文章和帖子上已经反复强调过。这里想强调的一点是最好得到ug自身的窗口(句柄或者CWnd),将其作为父窗口传给对话框,很有好处和必要;- z: g% B3 {4 ]. \' g

" v8 i; f& A+ R' ^7 B3. 第三点是我发帖子刚刚在论坛上求问过的,就是非模态对话框和ug本身交互对话框的冲突,原来是要用UF_UI_lock_ug_access( UF_UI_FROM_CUSTOM )和UF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM )把ug对话框的函数包起来,具体原因可参见ug帮助文档(虽然从来没什么太大帮助)。eg:# O/ @* Y' ]& t, M( G' t
ShowWindow(SW_HIDE);//Optional, 隐藏父窗口* d$ x. g% F& A, ?9 A
UF_UI_lock_ug_access( UF_UI_FROM_CUSTOM ); UF_UI_select_by_class(message,&opts,&response,&count,&selectedItem );* a5 n! E/ v  J2 {( J- D# p3 N
UF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM );
- s5 A+ o4 m' |& DShowWindow(SW_SHOW);//Optional,再次显示父窗口
5 y1 ]6 x3 q: Z1 A( v9 i: x. {) F# T# T# ^; ]5 o
PS:对于隐藏和显示父窗口,对于模态对话框来说要稍微复杂一点,此处不赘言。$ m0 G: I. n( I( Q7 Q$ ^# D
6 _: P9 H3 a& d( _+ W( x4 c
4. 也是其他文章经常讲到的,为对话框添加OnDestroy函数,在其中删除掉this指针,销毁对话框对象;+ b  [+ l) e* Y5 b9 J( {/ E

+ e7 {+ ^3 r: q% Q5 n3 z5. 如果对话框有OK, Cancel或Exit等出口按钮,一定要重载相应的响应函数,去掉OnOK之类的出口函数,用SendMessage(WM_DESTROY)来代替。之所以这么做的原因,是非模态对话框在被调用者的程序范围内无法得知其何时结束(不同于模态对话框的DoModal),因此只能由OnDestroy函数内完成销毁动作。当然还有其它的解决办法,此处推荐这种。2 y5 s6 m8 B7 h3 k" o: a
# T& J) |, {1 ~
6. Last but not the least,非常不引人注意而又非常致命的一点,在ufusr_ask_unload函数中要使用UF_UNLOAD_SEL_DIALOG而非UF_UNLOAD_IMMEDIATELY作为返回值,否则ug加载对话框时将出错!!!
的文章很多了,这里仅专门针对非模态对话框要特别注意的几个事项进行说明:
# ?( q1 ?& H  e1 \$ R+ q( d3 S' z+ f' H3 [' K/ u
1. 在创建和调用对话框之前一定要使用AFX_MANAGE_STATE(AfxGetStaticModuleState()),这是因为mfc创建的project类型肯定只能是dll,需要告诉在运行时去dll所在的模块下找资源文件而不是去应用程序(也就是ug)中找。这一点适用于所有ug调用的mfc项目;9 q' b/ e4 U( L: {
2 n, j( f4 O/ m- ^; Q
2. 创建对话框的代码如下* i( C6 j. \' S* y' o6 H- D5 B1 L

* m& K1 m0 m9 U6 \$ n    HWND UGHwnd = (HWND) UF_UI_get_default_parent();/ l* x  \* X$ N8 G  d& Q: V  T
    CWnd *ugwindow = CWnd::FromHandle(UGHwnd);
/ U7 @3 v' Q" T! B5 Q
2 K% A  k) j& i0 _: Z: }8 A- ?    CMfcDialog *pMfcDlg=NULL;  T* N( i* y: r* }
    pMfcDlg= new pMfcDlg(ugwindow);  
+ c, J* S, a7 _5 K; w  j    pMfcDlg->Create(IDD_DIALOG, ugwindow);$ ^' c. s8 u* V8 ?
    //可以在此处添加SetWindowPos设置对话框出现的位置: j( J9 H" g# q
    pSimDlg->ShowWindow(SW_NORMAL);6 Q* d3 q2 s! Y

* R9 v- l; P5 f1 }- V/ I" _0 n' n! j创建时一定要使用指针,这点在很多文章和帖子上已经反复强调过。这里想强调的一点是最好得到ug自身的窗口(句柄或者CWnd),将其作为父窗口传给对话框,很有好处和必要;
3 _( S: D) d8 u, Y0 d4 }4 w! N/ a, M& @
3. 第三点是我发帖子刚刚在论坛上求问过的,就是非模态对话框和ug本身交互对话框的冲突,原来是要用UF_UI_lock_ug_access( UF_UI_FROM_CUSTOM )和UF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM )把ug对话框的函数包起来,具体原因可参见ug帮助文档(虽然从来没什么太大帮助)。eg:: l5 [4 D2 _7 k5 ^4 e: U0 w( }; i
ShowWindow(SW_HIDE);//Optional, 隐藏父窗口* n0 l0 h  g5 [: d
UF_UI_lock_ug_access( UF_UI_FROM_CUSTOM ); UF_UI_select_by_class(message,&opts,&response,&count,&selectedItem );# ~  u! F6 u3 k) o9 P8 N% }3 T
UF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM );4 R9 A1 p% `! f, C/ X3 K8 P  R
ShowWindow(SW_SHOW);//Optional,再次显示父窗口
/ w' N; ?* G% m
  B; Z) k$ `$ k+ LPS:对于隐藏和显示父窗口,对于模态对话框来说要稍微复杂一点,此处不赘言。( |2 _; q6 G5 V: G: p/ D
) s" n- d" l: _7 N9 S
4. 也是其他文章经常讲到的,为对话框添加OnDestroy函数,在其中删除掉this指针,销毁对话框对象;
" M& k3 N- z- [+ u9 E7 n1 W* p9 P: O. [! D; ?9 d
5. 如果对话框有OK, Cancel或Exit等出口按钮,一定要重载相应的响应函数,去掉OnOK之类的出口函数,用SendMessage(WM_DESTROY)来代替。之所以这么做的原因,是非模态对话框在被调用者的程序范围内无法得知其何时结束(不同于模态对话框的DoModal),因此只能由OnDestroy函数内完成销毁动作。当然还有其它的解决办法,此处推荐这种。0 T4 P( t2 P* t' _. @5 h
& g+ d! K* _; x
6. Last but not the least,非常不引人注意而又非常致命的一点,在ufusr_ask_unload函数中要使用UF_UNLOAD_SEL_DIALOG而非UF_UNLOAD_IMMEDIATELY作为返回值,否则ug加载对话框时将出错!!!
" ^5 i, q4 U; j& r' X, e4 h$ E4 R; n
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.diantuankj.com/ doTeam.tech
回复

使用道具 举报

发表回复

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

返回列表 本版积分规则

  • 发布新帖

  • 在线客服

  • 微信

  • 客户端

  • 返回顶部

  • x
    温馨提示

    本网站(plmhome.com)为PLM之家工业软件学习官网站

    展示的视频材料全部免费,需要高清和特殊技术支持请联系 QQ: 939801026

    PLM之家NX CAM二次开发专题模块培训报名开始啦

    我知道了