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

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

[复制链接]

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

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

admin 楼主

2017-8-31 13:20:47

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

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

x
/ x6 ?. n6 D% j+ v# h5 W

3 p+ x4 H) H  X
  E% |1 J+ F7 q; F8 X0 g) e
0 @7 @, S$ W+ d: Q/ g- [4 o
UG中调用mfc对话框的文章很多了,这里仅专门针对非模态对话框要特别注意的几个事项进行说明:
9 U! R- |" |& s! u' ?  e
. C1 J( Y; W/ E1. 在创建和调用对话框之前一定要使用AFX_MANAGE_STATE(AfxGetStaticModuleState()),这是因为mfc创建的project类型肯定只能是dll,需要告诉在运行时去dll所在的模块下找资源文件而不是去应用程序(也就是ug)中找。这一点适用于所有ug调用的mfc项目;
3 `- ~+ {8 |* ?. y/ E
9 B& u) m& N% Y. q! H2. 创建对话框的代码如下6 @3 u# K: A' h) F* e, n  ?
0 p' M( n( C; o% O) e" l! l
    HWND UGHwnd = (HWND) UF_UI_get_default_parent();2 J$ K6 x* K) K4 W$ h
    CWnd *ugwindow = CWnd::FromHandle(UGHwnd);
0 K) M3 K" V( N! U& Q) b1 E
* S" K4 p" Q. Z    CMfcDialog *pMfcDlg=NULL;1 }1 z( ]- p$ j) {3 T& d1 E
    pMfcDlg= new pMfcDlg(ugwindow);  
& w3 c. R/ D- Y5 r    pMfcDlg->Create(IDD_DIALOG, ugwindow);4 K- X" F2 H* T" [! Z# x
    //可以在此处添加SetWindowPos设置对话框出现的位置
3 B; u  Q% m3 x: i3 U' s) B    pSimDlg->ShowWindow(SW_NORMAL);
1 Q2 [* ^4 {1 @' ~! a6 q8 l/ j: @- M7 c: C% q" _1 a
创建时一定要使用指针,这点在很多文章和帖子上已经反复强调过。这里想强调的一点是最好得到ug自身的窗口(句柄或者CWnd),将其作为父窗口传给对话框,很有好处和必要;. W* H: l' z, p: H0 G4 ~) E9 ^

5 Q+ V# K# E, l5 z, D3 l0 S3. 第三点是我发帖子刚刚在论坛上求问过的,就是非模态对话框和ug本身交互对话框的冲突,原来是要用UF_UI_lock_ug_access( UF_UI_FROM_CUSTOM )和UF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM )把ug对话框的函数包起来,具体原因可参见ug帮助文档(虽然从来没什么太大帮助)。eg:$ a3 _" k# e0 k8 a
ShowWindow(SW_HIDE);//Optional, 隐藏父窗口1 g2 r; Q2 {3 S; B
UF_UI_lock_ug_access( UF_UI_FROM_CUSTOM ); UF_UI_select_by_class(message,&opts,&response,&count,&selectedItem );5 n' V% ~* i0 u5 T# C8 O& A5 \
UF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM );, R8 @4 a: l1 l1 H. Y9 k
ShowWindow(SW_SHOW);//Optional,再次显示父窗口
' S: F( M2 B  N7 Y  R; X+ m+ d1 F, ~5 `
PS:对于隐藏和显示父窗口,对于模态对话框来说要稍微复杂一点,此处不赘言。" H3 M2 X: _% O9 o

3 q) x+ p* ]  `) J5 c! Z5 _* K* O4. 也是其他文章经常讲到的,为对话框添加OnDestroy函数,在其中删除掉this指针,销毁对话框对象;
: n; u8 V- x: b( P# R. ]
5 ]+ J2 o+ O# [5. 如果对话框有OK, Cancel或Exit等出口按钮,一定要重载相应的响应函数,去掉OnOK之类的出口函数,用SendMessage(WM_DESTROY)来代替。之所以这么做的原因,是非模态对话框在被调用者的程序范围内无法得知其何时结束(不同于模态对话框的DoModal),因此只能由OnDestroy函数内完成销毁动作。当然还有其它的解决办法,此处推荐这种。6 H  e+ O0 k' g' U( u( }

+ O/ L% o# s: W2 e2 {6. Last but not the least,非常不引人注意而又非常致命的一点,在ufusr_ask_unload函数中要使用UF_UNLOAD_SEL_DIALOG而非UF_UNLOAD_IMMEDIATELY作为返回值,否则ug加载对话框时将出错!!!
的文章很多了,这里仅专门针对非模态对话框要特别注意的几个事项进行说明:
% G/ j7 c/ ?; K) |
3 g8 T4 u+ ?) g1. 在创建和调用对话框之前一定要使用AFX_MANAGE_STATE(AfxGetStaticModuleState()),这是因为mfc创建的project类型肯定只能是dll,需要告诉在运行时去dll所在的模块下找资源文件而不是去应用程序(也就是ug)中找。这一点适用于所有ug调用的mfc项目;
; I: T# V: F7 W2 S, E, r' w, L! L( c% g; V
2. 创建对话框的代码如下# G# l% k" n! d7 z6 \

- y" v  l8 {6 H; i/ p& K2 Y    HWND UGHwnd = (HWND) UF_UI_get_default_parent();! g7 h2 `5 S. Z0 }
    CWnd *ugwindow = CWnd::FromHandle(UGHwnd);; l6 b3 [$ ~6 C! P
  @2 p9 i4 L6 ~
    CMfcDialog *pMfcDlg=NULL;: W, W/ g  G, P5 U- m
    pMfcDlg= new pMfcDlg(ugwindow);  
& G5 v$ r! j) u1 ~6 D    pMfcDlg->Create(IDD_DIALOG, ugwindow);
4 h$ k/ v" G7 v8 G/ ~7 [    //可以在此处添加SetWindowPos设置对话框出现的位置
. @' W1 k4 ?- ?- \1 \9 D    pSimDlg->ShowWindow(SW_NORMAL);
3 b" Z& Q; J5 p$ B+ A0 t# Y8 S
2 ?7 x1 K% E# q* y4 h1 j2 B$ @: ?创建时一定要使用指针,这点在很多文章和帖子上已经反复强调过。这里想强调的一点是最好得到ug自身的窗口(句柄或者CWnd),将其作为父窗口传给对话框,很有好处和必要;
$ V3 x" d- l; R; F) z1 u) f- Z2 a! ~# w" S! N
3. 第三点是我发帖子刚刚在论坛上求问过的,就是非模态对话框和ug本身交互对话框的冲突,原来是要用UF_UI_lock_ug_access( UF_UI_FROM_CUSTOM )和UF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM )把ug对话框的函数包起来,具体原因可参见ug帮助文档(虽然从来没什么太大帮助)。eg:
# L. k7 o' C, q8 |ShowWindow(SW_HIDE);//Optional, 隐藏父窗口
' e- ]' T/ `# |' O. Q; |UF_UI_lock_ug_access( UF_UI_FROM_CUSTOM ); UF_UI_select_by_class(message,&opts,&response,&count,&selectedItem );
/ h( A$ e  W; V( w1 dUF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM );
! Y9 v+ S5 F$ k  @ShowWindow(SW_SHOW);//Optional,再次显示父窗口
) m3 h  W! V$ B2 s
% H; x1 @% T! f4 i" |4 C0 J; M6 wPS:对于隐藏和显示父窗口,对于模态对话框来说要稍微复杂一点,此处不赘言。  ^4 t1 X' E6 H# }' h' j5 T

$ Z+ i6 l' d. H' a' B. T# [8 I4. 也是其他文章经常讲到的,为对话框添加OnDestroy函数,在其中删除掉this指针,销毁对话框对象;
* D4 V' x# E2 s) V$ q, g# V# H) c9 r3 d/ I( s: W
5. 如果对话框有OK, Cancel或Exit等出口按钮,一定要重载相应的响应函数,去掉OnOK之类的出口函数,用SendMessage(WM_DESTROY)来代替。之所以这么做的原因,是非模态对话框在被调用者的程序范围内无法得知其何时结束(不同于模态对话框的DoModal),因此只能由OnDestroy函数内完成销毁动作。当然还有其它的解决办法,此处推荐这种。
7 ~* D* h6 n1 B$ E) L7 M+ E0 E$ ^* t( Z- V8 r3 B  W0 t6 h" i3 {
6. Last but not the least,非常不引人注意而又非常致命的一点,在ufusr_ask_unload函数中要使用UF_UNLOAD_SEL_DIALOG而非UF_UNLOAD_IMMEDIATELY作为返回值,否则ug加载对话框时将出错!!!
8 w! [* H; r( c' ~
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了