PLM之家精品课程培训

PLM之家精品课程培训

联系电话:18301858168   |   QQ咨询:939801026
NX二次开发培训

NX二次开发培训

UFUN/NXOpen C++和实战案例

适合初级入门或想深入了解二次开发的工程师,本培训结合ufun,NXOpen C++,大量的实例及官方内部的开发技术。
公众号二维码

关注公众号

点击扫描二维码免费在线高清教程

课程详情
Catia二次开发培训

Catia二次开发培训

市场需求大,掌握核心技术前景广阔

Catia二次开发的市场需求大,人才稀缺。掌握开发技能潜力巨大,随着经验积累将在汽车、航空等领域有所作为。
B站二维码

在线原创B站视频

点击关注工业软件传道士主页

课程详情
Teamcenter培训

Teamcenter培训

全方位培训,从基础应用到高级开发全覆盖

涵盖用户应用基础培训、管理员基础培训、管理员高级培训及二次开发培训等全方位内容,由多年经验讲师打造。
QQ群二维码

加入同行交流

点击扫描二维码加入QQ群

课程详情
×

PLM之家plmhome公众号

课程涵盖: PLM之家所有原创视频

×

关注B站视频

所有高清视频一览无余,全部在线播放学习

×

加入PLM之家QQ群

同行交流,疑问解答,更多互助

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

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

[复制链接]

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

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

admin 楼主

2017-8-31 13:20:47

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

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

x
: }+ r: V5 p: @! h# g
. F+ F! e( p2 C! M( J: l
: `) J( Y8 `" [
9 I, |" f- c& k  H- \- ~8 [6 B; s
UG中调用mfc对话框的文章很多了,这里仅专门针对非模态对话框要特别注意的几个事项进行说明:
% d0 B9 N6 q1 m# k
, l" d1 v) Y0 M  q) N1. 在创建和调用对话框之前一定要使用AFX_MANAGE_STATE(AfxGetStaticModuleState()),这是因为mfc创建的project类型肯定只能是dll,需要告诉在运行时去dll所在的模块下找资源文件而不是去应用程序(也就是ug)中找。这一点适用于所有ug调用的mfc项目;
- q' Y% O, G: m1 Y; B$ m+ D+ D3 [* ^5 W
2. 创建对话框的代码如下
& }. Y" S# |/ B( K0 ~
9 O8 S4 X0 l( Z+ O9 K    HWND UGHwnd = (HWND) UF_UI_get_default_parent();9 G2 h2 `$ S5 i( u- U
    CWnd *ugwindow = CWnd::FromHandle(UGHwnd);1 F0 J4 n8 m  i5 A) d4 D
9 H( b  m5 e& T+ o: d0 r. o* n
    CMfcDialog *pMfcDlg=NULL;
' Y6 H+ @! `4 r* V& @  Y    pMfcDlg= new pMfcDlg(ugwindow);  , v- K: J( T: _. y4 K& v
    pMfcDlg->Create(IDD_DIALOG, ugwindow);
6 [( G8 G0 P9 Q3 g    //可以在此处添加SetWindowPos设置对话框出现的位置  y8 h6 ?2 H& F/ ~' l. v
    pSimDlg->ShowWindow(SW_NORMAL);
( Y# Z  {8 a8 M! R8 F
) l3 x& h; o: l% ^$ D创建时一定要使用指针,这点在很多文章和帖子上已经反复强调过。这里想强调的一点是最好得到ug自身的窗口(句柄或者CWnd),将其作为父窗口传给对话框,很有好处和必要;0 i5 p; {0 j  [- v+ v* q
9 ?: J2 M, F+ @4 K, Z$ y
3. 第三点是我发帖子刚刚在论坛上求问过的,就是非模态对话框和ug本身交互对话框的冲突,原来是要用UF_UI_lock_ug_access( UF_UI_FROM_CUSTOM )和UF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM )把ug对话框的函数包起来,具体原因可参见ug帮助文档(虽然从来没什么太大帮助)。eg:8 N$ Z' V! M7 v  _( l$ V
ShowWindow(SW_HIDE);//Optional, 隐藏父窗口
0 _. S& q: e6 E  H$ h% fUF_UI_lock_ug_access( UF_UI_FROM_CUSTOM ); UF_UI_select_by_class(message,&opts,&response,&count,&selectedItem );
1 o% C# {5 U" ]: X, I) j  fUF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM );
$ t: Z: z; T' }ShowWindow(SW_SHOW);//Optional,再次显示父窗口" E) j+ B* i3 j

6 g  Y4 g) l, SPS:对于隐藏和显示父窗口,对于模态对话框来说要稍微复杂一点,此处不赘言。7 w- Q3 Q# t+ T" K: g1 }! U+ R
  S2 v# X+ T0 W# u: }
4. 也是其他文章经常讲到的,为对话框添加OnDestroy函数,在其中删除掉this指针,销毁对话框对象;3 h: w4 w: r# O! [7 z- l

9 N" Z" K; r* a% K# A# R6 p7 r! o5. 如果对话框有OK, Cancel或Exit等出口按钮,一定要重载相应的响应函数,去掉OnOK之类的出口函数,用SendMessage(WM_DESTROY)来代替。之所以这么做的原因,是非模态对话框在被调用者的程序范围内无法得知其何时结束(不同于模态对话框的DoModal),因此只能由OnDestroy函数内完成销毁动作。当然还有其它的解决办法,此处推荐这种。; {: \7 Q. _$ ?5 j$ n' Y4 r9 u/ g
" l" E0 \( y6 E2 \# V! v( E
6. Last but not the least,非常不引人注意而又非常致命的一点,在ufusr_ask_unload函数中要使用UF_UNLOAD_SEL_DIALOG而非UF_UNLOAD_IMMEDIATELY作为返回值,否则ug加载对话框时将出错!!!
的文章很多了,这里仅专门针对非模态对话框要特别注意的几个事项进行说明:+ z# U) e  z: [8 l6 I
. r( ^, v$ l; h+ r& Z
1. 在创建和调用对话框之前一定要使用AFX_MANAGE_STATE(AfxGetStaticModuleState()),这是因为mfc创建的project类型肯定只能是dll,需要告诉在运行时去dll所在的模块下找资源文件而不是去应用程序(也就是ug)中找。这一点适用于所有ug调用的mfc项目;
+ a, B8 ]' ]9 w; \! R) c- Q1 X3 H
2. 创建对话框的代码如下
( K* |2 G5 V+ |) O! H% m3 ^/ e" x3 G8 M5 L
    HWND UGHwnd = (HWND) UF_UI_get_default_parent();
! M' q# F9 ~5 f. y& |    CWnd *ugwindow = CWnd::FromHandle(UGHwnd);
! \9 U9 F0 ?( I3 U1 M
' Y9 f0 g' X. J& ]: s    CMfcDialog *pMfcDlg=NULL;4 y/ x; i4 V7 J3 W* S% `" g
    pMfcDlg= new pMfcDlg(ugwindow);  
6 o1 T8 C4 k: _. I  y4 t) q    pMfcDlg->Create(IDD_DIALOG, ugwindow);; `1 z1 [9 q, Z3 P1 W. Y
    //可以在此处添加SetWindowPos设置对话框出现的位置- f/ E# H3 B/ N7 w
    pSimDlg->ShowWindow(SW_NORMAL);
5 }3 I6 ^$ @) c5 @) W. R5 I- H  \  I6 k0 I* x7 K
创建时一定要使用指针,这点在很多文章和帖子上已经反复强调过。这里想强调的一点是最好得到ug自身的窗口(句柄或者CWnd),将其作为父窗口传给对话框,很有好处和必要;- n: a# K9 W3 c; I

! \# I: w4 C$ X' }, k3. 第三点是我发帖子刚刚在论坛上求问过的,就是非模态对话框和ug本身交互对话框的冲突,原来是要用UF_UI_lock_ug_access( UF_UI_FROM_CUSTOM )和UF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM )把ug对话框的函数包起来,具体原因可参见ug帮助文档(虽然从来没什么太大帮助)。eg:
7 k/ j( t# p9 s+ mShowWindow(SW_HIDE);//Optional, 隐藏父窗口
/ R5 q+ [$ Q4 T% k* z% pUF_UI_lock_ug_access( UF_UI_FROM_CUSTOM ); UF_UI_select_by_class(message,&opts,&response,&count,&selectedItem );2 P: Y+ X/ N6 Y' w2 x! j
UF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM );4 L+ p1 F: R. L
ShowWindow(SW_SHOW);//Optional,再次显示父窗口
# d, S4 g* }2 j" Z7 h  x
! W& l; Z& W. ]. fPS:对于隐藏和显示父窗口,对于模态对话框来说要稍微复杂一点,此处不赘言。
3 _. B& W4 w2 X! g) y# l
/ Q; o6 Y  R' A! \' q9 H0 _4. 也是其他文章经常讲到的,为对话框添加OnDestroy函数,在其中删除掉this指针,销毁对话框对象;
7 j6 @/ Y, o) E; ]2 [5 _8 x$ x7 d* W3 e. ]! B8 ?, a; e- n8 Z* }
5. 如果对话框有OK, Cancel或Exit等出口按钮,一定要重载相应的响应函数,去掉OnOK之类的出口函数,用SendMessage(WM_DESTROY)来代替。之所以这么做的原因,是非模态对话框在被调用者的程序范围内无法得知其何时结束(不同于模态对话框的DoModal),因此只能由OnDestroy函数内完成销毁动作。当然还有其它的解决办法,此处推荐这种。
# J' f2 z2 y- p! W4 Z4 A4 e4 E7 g- }( R% U3 g
6. Last but not the least,非常不引人注意而又非常致命的一点,在ufusr_ask_unload函数中要使用UF_UNLOAD_SEL_DIALOG而非UF_UNLOAD_IMMEDIATELY作为返回值,否则ug加载对话框时将出错!!!
* u& t) r8 j8 y
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了