|
|
请使用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
|
|