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 2947 0

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

admin 楼主

2017-8-31 13:20:47

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

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

x

( r. C1 z5 `! X! {+ f" _
& g3 @- z! L) q. _# r

, U- s& ^6 a1 g( T
! Q( \# e5 U( {7 e5 O1 QUG中调用mfc对话框的文章很多了,这里仅专门针对非模态对话框要特别注意的几个事项进行说明:
3 ~! s. i2 ^! b* i7 p$ q; [; r1 ]9 t
$ _7 }# |8 L7 K9 b1. 在创建和调用对话框之前一定要使用AFX_MANAGE_STATE(AfxGetStaticModuleState()),这是因为mfc创建的project类型肯定只能是dll,需要告诉在运行时去dll所在的模块下找资源文件而不是去应用程序(也就是ug)中找。这一点适用于所有ug调用的mfc项目;9 f: G9 g+ s  q1 A  g
1 H& u5 M" U! Y$ K4 D
2. 创建对话框的代码如下1 G3 u0 w6 m5 j1 @* ~& I0 T

& M4 _" Y3 O6 \- m. v* Z, r    HWND UGHwnd = (HWND) UF_UI_get_default_parent();
" ]' D$ w: G6 a: i) }8 E/ \6 g! Z* T    CWnd *ugwindow = CWnd::FromHandle(UGHwnd);" J: t. C! z4 c9 }6 t; B

3 V  [6 A4 x4 {( H3 [    CMfcDialog *pMfcDlg=NULL;/ w* h' j6 D1 D) @9 j
    pMfcDlg= new pMfcDlg(ugwindow);  1 x: I* _+ L/ d( G
    pMfcDlg->Create(IDD_DIALOG, ugwindow);5 z! M" O9 S. z
    //可以在此处添加SetWindowPos设置对话框出现的位置
% l* u" M# u( e/ @) b    pSimDlg->ShowWindow(SW_NORMAL);# v# G! E2 S( p, V

  W( j" ^' B( i7 w8 Y. e创建时一定要使用指针,这点在很多文章和帖子上已经反复强调过。这里想强调的一点是最好得到ug自身的窗口(句柄或者CWnd),将其作为父窗口传给对话框,很有好处和必要;+ {/ I$ r7 u4 W

. a* Q! E0 k& b3 D' E# H3. 第三点是我发帖子刚刚在论坛上求问过的,就是非模态对话框和ug本身交互对话框的冲突,原来是要用UF_UI_lock_ug_access( UF_UI_FROM_CUSTOM )和UF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM )把ug对话框的函数包起来,具体原因可参见ug帮助文档(虽然从来没什么太大帮助)。eg:
8 m/ x8 J4 A* j6 }7 BShowWindow(SW_HIDE);//Optional, 隐藏父窗口
2 g8 H& e% i+ o9 z# n$ z. BUF_UI_lock_ug_access( UF_UI_FROM_CUSTOM ); UF_UI_select_by_class(message,&opts,&response,&count,&selectedItem );
. s2 ?' a" c6 J# ]( L8 r3 f2 GUF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM );( ~3 Y9 o& r- x* y/ U, u  m0 L# ?
ShowWindow(SW_SHOW);//Optional,再次显示父窗口
7 u: P6 c* E+ v6 b  z3 W. q8 f" {2 N) o6 [: S: g$ ^
PS:对于隐藏和显示父窗口,对于模态对话框来说要稍微复杂一点,此处不赘言。
" i: E3 d- R3 y9 l% H, K5 }" f% ]1 W; ~+ p( j9 _
4. 也是其他文章经常讲到的,为对话框添加OnDestroy函数,在其中删除掉this指针,销毁对话框对象;
, \( ?$ W) w. R& L- T; P4 {. \. a% P6 u# d
5. 如果对话框有OK, Cancel或Exit等出口按钮,一定要重载相应的响应函数,去掉OnOK之类的出口函数,用SendMessage(WM_DESTROY)来代替。之所以这么做的原因,是非模态对话框在被调用者的程序范围内无法得知其何时结束(不同于模态对话框的DoModal),因此只能由OnDestroy函数内完成销毁动作。当然还有其它的解决办法,此处推荐这种。
- `5 N* G9 l* b' f7 E2 v3 O# J# F9 f9 t& R2 u9 d1 h
6. Last but not the least,非常不引人注意而又非常致命的一点,在ufusr_ask_unload函数中要使用UF_UNLOAD_SEL_DIALOG而非UF_UNLOAD_IMMEDIATELY作为返回值,否则ug加载对话框时将出错!!!
的文章很多了,这里仅专门针对非模态对话框要特别注意的几个事项进行说明:; v. j8 o; T5 ?/ p( c4 Z5 I

7 R. A; |. k: W' ]1. 在创建和调用对话框之前一定要使用AFX_MANAGE_STATE(AfxGetStaticModuleState()),这是因为mfc创建的project类型肯定只能是dll,需要告诉在运行时去dll所在的模块下找资源文件而不是去应用程序(也就是ug)中找。这一点适用于所有ug调用的mfc项目;% r+ }4 f* ~0 {2 T0 s8 r2 f) q' z. g

1 w; e6 u3 a: Q, {/ f2. 创建对话框的代码如下/ @1 f$ A7 }8 j1 ^
: S9 X! n' t& b! A" h: R
    HWND UGHwnd = (HWND) UF_UI_get_default_parent();
8 @, [# [2 Z: k- w& x3 ^    CWnd *ugwindow = CWnd::FromHandle(UGHwnd);& K* ~" ?# |; f/ b+ U2 i3 k
' h  B% S; |8 a: M  p7 L
    CMfcDialog *pMfcDlg=NULL;3 b! K( e+ k  G8 G# {8 w
    pMfcDlg= new pMfcDlg(ugwindow);  
. a2 @: n7 R+ z0 s2 j( b    pMfcDlg->Create(IDD_DIALOG, ugwindow);$ T7 i0 t# D" z+ K+ ~; H; |
    //可以在此处添加SetWindowPos设置对话框出现的位置
9 ~# _" x1 g9 b, Z1 O    pSimDlg->ShowWindow(SW_NORMAL);
! N' C1 e/ {" Y" Z
, N5 w: B: }; X! W创建时一定要使用指针,这点在很多文章和帖子上已经反复强调过。这里想强调的一点是最好得到ug自身的窗口(句柄或者CWnd),将其作为父窗口传给对话框,很有好处和必要;
8 J8 f+ O/ V$ x  p0 D. U( @8 @) r3 q/ e- a6 J% \) v
3. 第三点是我发帖子刚刚在论坛上求问过的,就是非模态对话框和ug本身交互对话框的冲突,原来是要用UF_UI_lock_ug_access( UF_UI_FROM_CUSTOM )和UF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM )把ug对话框的函数包起来,具体原因可参见ug帮助文档(虽然从来没什么太大帮助)。eg:
& b3 F% m; m& M  g. dShowWindow(SW_HIDE);//Optional, 隐藏父窗口9 O+ C3 \8 ^1 H
UF_UI_lock_ug_access( UF_UI_FROM_CUSTOM ); UF_UI_select_by_class(message,&opts,&response,&count,&selectedItem );( b7 ^1 p. E( f9 w/ G& x8 P
UF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM );! G1 V+ c9 }/ _9 h5 k5 i3 I9 A
ShowWindow(SW_SHOW);//Optional,再次显示父窗口9 n: r! F3 y/ }1 W3 d6 h

7 K- l9 [- e& B  \PS:对于隐藏和显示父窗口,对于模态对话框来说要稍微复杂一点,此处不赘言。
& e0 E: E7 f6 c9 T; ~+ H- r3 P1 V5 v2 h2 o7 M% [* q( V5 Q% x" W% i
4. 也是其他文章经常讲到的,为对话框添加OnDestroy函数,在其中删除掉this指针,销毁对话框对象;
5 `) ]0 X% x7 j6 V
  w6 }2 T0 h1 [% |( i4 a5. 如果对话框有OK, Cancel或Exit等出口按钮,一定要重载相应的响应函数,去掉OnOK之类的出口函数,用SendMessage(WM_DESTROY)来代替。之所以这么做的原因,是非模态对话框在被调用者的程序范围内无法得知其何时结束(不同于模态对话框的DoModal),因此只能由OnDestroy函数内完成销毁动作。当然还有其它的解决办法,此处推荐这种。
8 F, A3 Z' W* b8 i3 T. |
! Y. I4 x( i3 L. N4 R6. Last but not the least,非常不引人注意而又非常致命的一点,在ufusr_ask_unload函数中要使用UF_UNLOAD_SEL_DIALOG而非UF_UNLOAD_IMMEDIATELY作为返回值,否则ug加载对话框时将出错!!!

  r+ A* w& a+ G/ I
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了