关于WS_CHILD与WS_POPUP的关系和MoveWindow的坐标 popupwindow

在MFC中,经常如果你的程序窗口需要在弹出窗口和子窗口之间转换,那么,我们来看下面的问题:

假设有CTestDlg,CPopDlg的继承自CDialog的对话框类

1.模式对话框

CTestDlg dlg1

dlg1.DoModal()

.....

dlg1的某个按钮处理函数

CPopDlg dlg2;

dlg2.DoModal();

.....

2.无模式对话框

CTestDlg dlg1

dlg1.DoModal()

.....

dlg1的某个按钮处理函数

CPopDlg *dlg2;

dlg2=new CPopDlg;

dlg2->Crate(IDD_DLG2,this);

dlg2->ModifyStyle(WS_POPUP|WS_BORDER,WS_CHILD,true)

RECT rc;

GetDlgItem(IDC_DLG2_POS)->GetDWindowRect(&rc);

ScreenToClient(&rc);

关于WS_CHILD与WS_POPUP的关系和MoveWindow的坐标 popupwindow

dlg2->MoveWindow(&rc,true);

dlg2->ShowWindow(SW_SHOW);

.....

第一段代码没有问题,第二段代码很有问题,第二段代码目的是要实现类似属性页的功能,但是未了代码通用性,没有为DLG2重新写过一个对象,而是重用弹出对话框的代码。结果,我们发现没有办法把dlg2移动到IDC_DLG2_POS控件的位置上,而且dlg2的编辑控件没有响应用户界面消息,下面详细解释这是为什么。

1。关于MoveWindow

MoveWindow是移动窗口的WINAPI,其有一个LPRECT的参数,代表新的窗口坐标,如果窗口本省具有WS_POPUP属性,那么新的窗口坐标是以屏幕坐标为坐标系,如果具有WS_CHILD属性,那么以父窗口坐标为坐标系,但是不能同时具有WS_POPUP和WS_CHILD属性。

在上面的代码中,已经取消了WS_POPUP属性,同时也增加了WS_CHILD属性,获得的IDC_DLG2_POS也从屏幕坐标系转换成了客户坐标系,但是位置怎么就是不对呢,而且子控件没有响应?

2.关于WS_CHILD,WS_POPUP之间的切换

如果将WS_POPUP改成WS_CHILD的时候,有一点很容易忽视

CPopDlg *dlg2;

dlg2=new CPopDlg;

dlg2->Crate(IDD_DLG2,this);

dlg2->ModifyStyle(WS_POPUP|WS_BORDER,WS_CHILD,true)

dlg2在Create的时候,指定了父窗口,所有ModifyStyle之后,就利索当然的是WS_CHILD了,错!在Create的时候,dlg2还是WS_POPUP属性,所以,千万要记住,在将WS_POPUP修改成WS_CHILD之后,一定要调用下面的语句:

dlg2->SetParent(this);

所用功能正常了,dlg2的子窗口————也有响应了。当然如果你的资源定义的本来就是WS_CHILD,那么就没有那么复杂了,希望对大家有用!

  

爱华网本文地址 » http://www.aihuau.com/a/25101016/317394.html

更多阅读

柯云路:关于爱情与婚姻的经典格言_左岸右岸

柯云路:关于爱情与婚姻的经典格言分享自柯云路新浪博客/>>情感系列>>男人女人>>一见钟情 1、就爱情的微妙而言,天下大多数人的相爱,本质上都是一见钟情的。2、异性的美丽和才华,既有吸引力,也有压力。对自己力量有充分自信的男性不

关于星星与月亮的传说 拥抱星星的月亮演员表

关于星星与月亮的传说在很久以前,夜空中没有星星与月亮,也无法确知那究竟是什么时候,当太阳从地平线上消失后,世界便全都笼罩在黑暗中。在遥远的地方,有个小山村,小山村又有一户离村子很远的人家,有个小男孩只跟着他父亲生活。小男孩从

关于借条与欠条的区别及书写注意事项 借条与欠条区别

关于借条与欠条的区别及书写注意事项(上)在日常经济生活往来中,人们往往将借条写成欠条,将欠条写成借条。其实,借条和欠条是有重要区别的。下面就二者的区别和书写注意事项简述如下:一、借条和欠条的区别: 1、含义及其相应法律关系不同:

声明:《关于WS_CHILD与WS_POPUP的关系和MoveWindow的坐标 popupwindow》为网友所以辜负分享!如侵犯到您的合法权益请联系我们删除