PLM之家PLMHome-工业软件与AI结合践行者

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

[复制链接]

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

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

admin 楼主

2017-8-31 13:20:47

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

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

x
$ {# i5 x  v" _, i9 c, z! f" K

' J8 Y/ Z3 T' S3 i& G; Z& u0 X; B
. s. g4 \. Q" _9 N( m

/ B0 v  ]/ Q2 L: |9 JUG中调用mfc对话框的文章很多了,这里仅专门针对非模态对话框要特别注意的几个事项进行说明:
6 j: s/ G0 z1 j3 C" d% t/ g! P6 X# i; W9 m* V3 A6 K% k5 w% q: \
1. 在创建和调用对话框之前一定要使用AFX_MANAGE_STATE(AfxGetStaticModuleState()),这是因为mfc创建的project类型肯定只能是dll,需要告诉在运行时去dll所在的模块下找资源文件而不是去应用程序(也就是ug)中找。这一点适用于所有ug调用的mfc项目;5 R' Q' v4 V- _; g* {$ o( w; I

1 G3 E5 ^8 @! U  K  `4 [2. 创建对话框的代码如下& p, B5 X8 Q" n* I" J6 e8 c% z  K
1 n9 C- a0 h4 I+ U% ~
    HWND UGHwnd = (HWND) UF_UI_get_default_parent();
) K+ v; c& T. E: T( L6 K4 _2 b    CWnd *ugwindow = CWnd::FromHandle(UGHwnd);3 ^2 _! g" g" x

9 H6 {3 y. R0 R' [! k    CMfcDialog *pMfcDlg=NULL;4 O, h# Z$ T0 T( ~6 E
    pMfcDlg= new pMfcDlg(ugwindow);  
  P5 _- w. `3 ]& p. J    pMfcDlg->Create(IDD_DIALOG, ugwindow);; e3 |# n  X6 |' u1 k" ~$ _
    //可以在此处添加SetWindowPos设置对话框出现的位置6 |% ^& V) |9 `
    pSimDlg->ShowWindow(SW_NORMAL);
' @  k* F& i$ h& ?0 S0 s7 d
: [  h9 h* r* [- L创建时一定要使用指针,这点在很多文章和帖子上已经反复强调过。这里想强调的一点是最好得到ug自身的窗口(句柄或者CWnd),将其作为父窗口传给对话框,很有好处和必要;
  j' E7 |9 d& C* d  O: J6 }5 @: S6 m$ p- H& [9 D5 @' [/ ^0 e
3. 第三点是我发帖子刚刚在论坛上求问过的,就是非模态对话框和ug本身交互对话框的冲突,原来是要用UF_UI_lock_ug_access( UF_UI_FROM_CUSTOM )和UF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM )把ug对话框的函数包起来,具体原因可参见ug帮助文档(虽然从来没什么太大帮助)。eg:
9 g5 d& Z' _( w: h; ZShowWindow(SW_HIDE);//Optional, 隐藏父窗口5 C! Z: |# B- A2 Z  Q- P
UF_UI_lock_ug_access( UF_UI_FROM_CUSTOM ); UF_UI_select_by_class(message,&opts,&response,&count,&selectedItem );
  `; r* X6 ~3 M* nUF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM );
/ ~0 S, {1 c$ L; Z+ i/ u) V5 f+ ZShowWindow(SW_SHOW);//Optional,再次显示父窗口
# ]3 \4 x7 K( y0 z' q/ z0 S. D$ E7 ]& k8 W* @; ?
PS:对于隐藏和显示父窗口,对于模态对话框来说要稍微复杂一点,此处不赘言。
3 H( H5 v' [: Y: [* k1 Y9 }& E( G5 |+ l2 c3 `" U
4. 也是其他文章经常讲到的,为对话框添加OnDestroy函数,在其中删除掉this指针,销毁对话框对象;
9 [: d8 t/ b! e; D& T  D% E4 e2 d+ y9 p$ `# S* \
5. 如果对话框有OK, Cancel或Exit等出口按钮,一定要重载相应的响应函数,去掉OnOK之类的出口函数,用SendMessage(WM_DESTROY)来代替。之所以这么做的原因,是非模态对话框在被调用者的程序范围内无法得知其何时结束(不同于模态对话框的DoModal),因此只能由OnDestroy函数内完成销毁动作。当然还有其它的解决办法,此处推荐这种。
- q  F9 ?- {! L" [5 ^- ?! \9 n; I, m) u: W
6. Last but not the least,非常不引人注意而又非常致命的一点,在ufusr_ask_unload函数中要使用UF_UNLOAD_SEL_DIALOG而非UF_UNLOAD_IMMEDIATELY作为返回值,否则ug加载对话框时将出错!!!
的文章很多了,这里仅专门针对非模态对话框要特别注意的几个事项进行说明:. r! i' R3 s( ]1 m, X$ a
2 W3 |: S' N; \* ~" e
1. 在创建和调用对话框之前一定要使用AFX_MANAGE_STATE(AfxGetStaticModuleState()),这是因为mfc创建的project类型肯定只能是dll,需要告诉在运行时去dll所在的模块下找资源文件而不是去应用程序(也就是ug)中找。这一点适用于所有ug调用的mfc项目;
' p; x/ z2 x. s. s* T  E
: D( P2 I2 n, _2. 创建对话框的代码如下
" x: a1 c! O' K* z& h
/ |# c3 @8 T) Z- L- ]$ H    HWND UGHwnd = (HWND) UF_UI_get_default_parent();
6 S, ^! N! d3 {( {- ^) L0 Y" W$ I  V- I    CWnd *ugwindow = CWnd::FromHandle(UGHwnd);
, T* ^2 e. R: W/ U7 \4 U/ V0 ?# g2 \9 z; {& W
    CMfcDialog *pMfcDlg=NULL;2 p) l+ u. m" g
    pMfcDlg= new pMfcDlg(ugwindow);    {' R5 {7 d1 b
    pMfcDlg->Create(IDD_DIALOG, ugwindow);
0 o# W; _3 d& N% x    //可以在此处添加SetWindowPos设置对话框出现的位置
" c; i9 s% d9 X7 h1 ~    pSimDlg->ShowWindow(SW_NORMAL);
4 n2 U. d8 y4 Z
' X0 f* i, r9 o  e/ _创建时一定要使用指针,这点在很多文章和帖子上已经反复强调过。这里想强调的一点是最好得到ug自身的窗口(句柄或者CWnd),将其作为父窗口传给对话框,很有好处和必要;
7 o2 S$ i+ r8 x. H1 r( i( d7 J- {$ P* R, J2 @7 a
3. 第三点是我发帖子刚刚在论坛上求问过的,就是非模态对话框和ug本身交互对话框的冲突,原来是要用UF_UI_lock_ug_access( UF_UI_FROM_CUSTOM )和UF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM )把ug对话框的函数包起来,具体原因可参见ug帮助文档(虽然从来没什么太大帮助)。eg:5 |- q# I% ~3 w# k; E7 c; ?9 k
ShowWindow(SW_HIDE);//Optional, 隐藏父窗口
! {5 w5 @1 |* `4 j" dUF_UI_lock_ug_access( UF_UI_FROM_CUSTOM ); UF_UI_select_by_class(message,&opts,&response,&count,&selectedItem );
+ o! |, K. k: |0 h# ?( W/ _  i' _UF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM );0 E! {- Z, g- G# l' J; L4 V& A/ w
ShowWindow(SW_SHOW);//Optional,再次显示父窗口! t! o# [3 ~2 K; D" C4 S( E  t

+ e0 b& a  n2 S1 B; b9 v6 F  j8 W! lPS:对于隐藏和显示父窗口,对于模态对话框来说要稍微复杂一点,此处不赘言。0 ^2 m0 B' a& h' \. |4 M

* a  u2 o0 k1 A4. 也是其他文章经常讲到的,为对话框添加OnDestroy函数,在其中删除掉this指针,销毁对话框对象;6 @: i0 e3 n# ~% `, B4 @* S
6 |4 p, ^. t5 N- J7 G2 }( m" J
5. 如果对话框有OK, Cancel或Exit等出口按钮,一定要重载相应的响应函数,去掉OnOK之类的出口函数,用SendMessage(WM_DESTROY)来代替。之所以这么做的原因,是非模态对话框在被调用者的程序范围内无法得知其何时结束(不同于模态对话框的DoModal),因此只能由OnDestroy函数内完成销毁动作。当然还有其它的解决办法,此处推荐这种。+ x5 Q* T) D8 ?* L# h
! K% t- y/ T$ a6 g+ D
6. Last but not the least,非常不引人注意而又非常致命的一点,在ufusr_ask_unload函数中要使用UF_UNLOAD_SEL_DIALOG而非UF_UNLOAD_IMMEDIATELY作为返回值,否则ug加载对话框时将出错!!!
  L, [0 R- W4 T, @6 V. w
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 doTeam.tech
回复

使用道具 举报

发表回复

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

返回列表 本版积分规则

  • 发布新帖

  • 在线客服

  • 微信

  • 客户端

  • 返回顶部

  • x
    温馨提示

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

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

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

    我知道了