PLM之家PLMHome-工业软件践行者

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

[复制链接]

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

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

admin 楼主

2017-8-31 13:20:47

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

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

x

) a+ h0 c9 B" R7 Y" s% ~# S6 S
# z( _3 q( m% f- B' S/ R+ X2 m

% Q( Z5 o, j7 R, k  _
" P- Y/ h+ X0 [1 OUG中调用mfc对话框的文章很多了,这里仅专门针对非模态对话框要特别注意的几个事项进行说明:
9 N' g0 I$ l% @: s& R( r- V8 ~: n. m( ^: q" ~! I
1. 在创建和调用对话框之前一定要使用AFX_MANAGE_STATE(AfxGetStaticModuleState()),这是因为mfc创建的project类型肯定只能是dll,需要告诉在运行时去dll所在的模块下找资源文件而不是去应用程序(也就是ug)中找。这一点适用于所有ug调用的mfc项目;+ T( ^, B9 v$ k& |0 {

7 v. ]3 i- N1 E; I# ^) t; N$ r" x2. 创建对话框的代码如下
, _# g3 {* b# \* u; b, d
, e9 j, @! |: {# B    HWND UGHwnd = (HWND) UF_UI_get_default_parent();; z) n8 M- b9 [, Z) ?
    CWnd *ugwindow = CWnd::FromHandle(UGHwnd);
& P. P; f* z( E; e, }" v& l7 j# r. R1 M& t
    CMfcDialog *pMfcDlg=NULL;
$ q* X0 P) {% j% o# a    pMfcDlg= new pMfcDlg(ugwindow);  
+ h$ W' @+ D& _% I  g/ n    pMfcDlg->Create(IDD_DIALOG, ugwindow);
( x2 s9 U# k8 i9 E; T    //可以在此处添加SetWindowPos设置对话框出现的位置5 X5 E4 I& e: W3 {& R/ h$ P" D
    pSimDlg->ShowWindow(SW_NORMAL);
/ b+ Z# H6 v* c2 o/ V! ~6 r5 G/ V2 b: t( n; }
创建时一定要使用指针,这点在很多文章和帖子上已经反复强调过。这里想强调的一点是最好得到ug自身的窗口(句柄或者CWnd),将其作为父窗口传给对话框,很有好处和必要;# E- ^9 c; v8 X  j7 p) Z7 i9 @, H
4 H5 t" U/ T/ K
3. 第三点是我发帖子刚刚在论坛上求问过的,就是非模态对话框和ug本身交互对话框的冲突,原来是要用UF_UI_lock_ug_access( UF_UI_FROM_CUSTOM )和UF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM )把ug对话框的函数包起来,具体原因可参见ug帮助文档(虽然从来没什么太大帮助)。eg:' J! t  z! S% V; y
ShowWindow(SW_HIDE);//Optional, 隐藏父窗口
8 t' L8 E( ]+ k2 S# O4 }0 ZUF_UI_lock_ug_access( UF_UI_FROM_CUSTOM ); UF_UI_select_by_class(message,&opts,&response,&count,&selectedItem );
, t# N8 g0 M. r/ rUF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM );6 ~( ]9 N# X3 }+ U
ShowWindow(SW_SHOW);//Optional,再次显示父窗口
+ u/ W& v) u! f/ `
6 }( U: [: d* k3 M4 tPS:对于隐藏和显示父窗口,对于模态对话框来说要稍微复杂一点,此处不赘言。1 X3 a# v  _3 A* M) O5 x. b

. _9 }. {) v$ k  f5 X+ G: r4. 也是其他文章经常讲到的,为对话框添加OnDestroy函数,在其中删除掉this指针,销毁对话框对象;( h1 n* k# J) O: |& i8 Z
4 ?  ]7 u& ^4 Z9 o6 C4 u
5. 如果对话框有OK, Cancel或Exit等出口按钮,一定要重载相应的响应函数,去掉OnOK之类的出口函数,用SendMessage(WM_DESTROY)来代替。之所以这么做的原因,是非模态对话框在被调用者的程序范围内无法得知其何时结束(不同于模态对话框的DoModal),因此只能由OnDestroy函数内完成销毁动作。当然还有其它的解决办法,此处推荐这种。
  @1 a) d2 H0 k6 x3 ^9 a$ i# d3 g9 f4 q# Z6 K3 F, H3 t
6. Last but not the least,非常不引人注意而又非常致命的一点,在ufusr_ask_unload函数中要使用UF_UNLOAD_SEL_DIALOG而非UF_UNLOAD_IMMEDIATELY作为返回值,否则ug加载对话框时将出错!!!
的文章很多了,这里仅专门针对非模态对话框要特别注意的几个事项进行说明:
( P- h/ A4 S/ W4 e! w
0 J' @2 m: `) b2 t( C$ L1. 在创建和调用对话框之前一定要使用AFX_MANAGE_STATE(AfxGetStaticModuleState()),这是因为mfc创建的project类型肯定只能是dll,需要告诉在运行时去dll所在的模块下找资源文件而不是去应用程序(也就是ug)中找。这一点适用于所有ug调用的mfc项目;8 H, d* [5 ]0 `: @
' d2 f, _( r& u$ R1 A/ B/ H+ t3 p2 }
2. 创建对话框的代码如下& r5 p$ w# c- n/ `# t, f
* c% O. l. I( b3 ]
    HWND UGHwnd = (HWND) UF_UI_get_default_parent();8 p& B' b, D) M! O
    CWnd *ugwindow = CWnd::FromHandle(UGHwnd);( ]( V& y' `9 D/ Z6 _* l

- S4 |# P7 H: Y$ q7 H    CMfcDialog *pMfcDlg=NULL;
. d' n8 V: V, J  ~! Y    pMfcDlg= new pMfcDlg(ugwindow);  
3 L6 C! a2 m! \, R0 X8 u+ n) i1 g; m    pMfcDlg->Create(IDD_DIALOG, ugwindow);9 N, J5 I* H6 H3 U% M1 W- ]: [6 q
    //可以在此处添加SetWindowPos设置对话框出现的位置$ D* {2 w8 s! {- T7 t' ?
    pSimDlg->ShowWindow(SW_NORMAL);
/ C, }" Y  I# ]" j% m# N+ W1 r% ~, O9 r) H2 B% r
创建时一定要使用指针,这点在很多文章和帖子上已经反复强调过。这里想强调的一点是最好得到ug自身的窗口(句柄或者CWnd),将其作为父窗口传给对话框,很有好处和必要;
" @2 z9 G( V4 R6 Z( y9 `4 f5 Q
/ R4 Q- e6 R% n$ U8 L3. 第三点是我发帖子刚刚在论坛上求问过的,就是非模态对话框和ug本身交互对话框的冲突,原来是要用UF_UI_lock_ug_access( UF_UI_FROM_CUSTOM )和UF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM )把ug对话框的函数包起来,具体原因可参见ug帮助文档(虽然从来没什么太大帮助)。eg:
$ w1 y* F& {% q& H6 V7 `% nShowWindow(SW_HIDE);//Optional, 隐藏父窗口6 L5 }. q6 L: j4 [7 ?' ^
UF_UI_lock_ug_access( UF_UI_FROM_CUSTOM ); UF_UI_select_by_class(message,&opts,&response,&count,&selectedItem );
4 {6 B1 C7 P" Y8 f6 V; uUF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM );
6 b4 l& P/ a3 x/ K8 x& |ShowWindow(SW_SHOW);//Optional,再次显示父窗口
! C4 j( i2 B* l& Y, F2 j
% c$ r/ C7 Z& ^5 ~6 k4 uPS:对于隐藏和显示父窗口,对于模态对话框来说要稍微复杂一点,此处不赘言。, l& e* b! W: |

' c5 C/ Y3 s! v8 v) q. b4. 也是其他文章经常讲到的,为对话框添加OnDestroy函数,在其中删除掉this指针,销毁对话框对象;
) p3 ]8 [2 i4 c/ L6 ~* |
5 Y7 V# _8 W9 D5. 如果对话框有OK, Cancel或Exit等出口按钮,一定要重载相应的响应函数,去掉OnOK之类的出口函数,用SendMessage(WM_DESTROY)来代替。之所以这么做的原因,是非模态对话框在被调用者的程序范围内无法得知其何时结束(不同于模态对话框的DoModal),因此只能由OnDestroy函数内完成销毁动作。当然还有其它的解决办法,此处推荐这种。
% o* A- x. c% P
' E+ U$ b5 Q4 F6 x6. Last but not the least,非常不引人注意而又非常致命的一点,在ufusr_ask_unload函数中要使用UF_UNLOAD_SEL_DIALOG而非UF_UNLOAD_IMMEDIATELY作为返回值,否则ug加载对话框时将出错!!!

2 n1 |; x' z) S' }% p0 ]4 u- j# p
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了