请教如何将对话框显示在Picture控件上?

Evil_cloud 2010-08-16 02:04:24
CRect rcBaseFrm;
GetDlgItem(IDC_BASE)->GetWindowRect(&rcBaseFrm);

configPanel.Create(IDD_CONFIG_DIALOG,this);
m_arhwndPage[1]=configPanel.GetSafeHwnd();

filecopyPanel.Create(IDD_FILECOPY_DIALOG,this);
m_arhwndPage[0]=filecopyPanel.GetSafeHwnd();

ScreenToClient(&rcBaseFrm);
for(int i=0;i<2;i++)
{
::MoveWindow(m_arhwndPage[i],rcBaseFrm.left,rcBaseFrm.top,rcBaseFrm.Width(),rcBaseFrm.Height(),0);
}
::ShowWindow(m_arhwndPage[0],SW_SHOW);

IDC_BASE是picture控件ID
我要实现的是将IDD_FILECOPY_DIALOG显示在picture控件上
可是程序一运行,IDD_FILECOPY_DIALOG却显示在左上角,不是显示在picture上!!
请教高手答疑!!小弟不甚感激
...全文
78 点赞 收藏 12
写回复
12 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
Evil_cloud 2010-08-16
[Quote=引用 11 楼 windsonzhl 的回复:]

啊???

LZ结帖也太快了点吧(︶︿︶)
[/Quote]

主要是当时那个问题已经解决了 就是style设置成child就行了 所以就结了 呵呵!
呵呵
回复
啊???

LZ结帖也太快了点吧(︶︿︶)
回复
第一,面板子对话框的父窗体最好是Picture,否则Picture必须设隐藏属性。
这一点我想你应该是清楚的吧:)

第二,缓存子面板,没有必要一定缓存句柄,缓存窗体类指针就可以了
(当然你的子面板最好有统一的基类)

第三,GetWindowRect返回的是屏幕坐标,MoveWindow对于子窗口是父窗口客户区坐标
各位应在好好看看MSDN:) LZ调用ScreenToClient是正确的。

第四,客户区坐标原点是窗口客户区(不包括标题栏和边框)左上点,不是窗口左上点。

第五,怀疑问题不是定位的问题,而是你的子面板的风格(Style)设置问题。
一般子对话框应设置WS_CHILD、DS_CONTROL和WS_EX_CONTROLPARENT。
使用资源模板的话,在属性窗口中设置;或者使用CWnd::CreateEx方法,指定相应参数。

回复
Evil_cloud 2010-08-16
[Quote=引用 8 楼 shanda485250 的回复:]
引用 7 楼 evil_cloud 的回复:

引用 6 楼 shanda485250 的回复:
GetWindowRect
函数功能:该函数返回指定窗口的边框矩形的尺寸。该尺寸以相对于屏幕坐标左上角的屏幕坐标给出。
ScreenToClient
函数功能:该函数把屏幕上指定点的屏幕坐标转换成用户坐标。
函数原型:BOOL ScreenToClient(HWND hWnd, LPPO……
[/Quote]


谢谢啦!原来如此 设置为child之后 就好了 太感谢了
回复
shanda485250 2010-08-16
[Quote=引用 7 楼 evil_cloud 的回复:]

引用 6 楼 shanda485250 的回复:
GetWindowRect
函数功能:该函数返回指定窗口的边框矩形的尺寸。该尺寸以相对于屏幕坐标左上角的屏幕坐标给出。
ScreenToClient
函数功能:该函数把屏幕上指定点的屏幕坐标转换成用户坐标。
函数原型:BOOL ScreenToClient(HWND hWnd, LPPOINT lpPoint);
MoveWindow……
[/Quote]
是IDC_BASE相对于整个桌面的左上角的点和他的宽度和高度。
刚又从新看了下MoveWindow定义,如果有父窗口存在它的值确实是相对于父窗口,应该用ScreenToClient。
Dialog的属性确实设为Child了?
回复
Evil_cloud 2010-08-16
[Quote=引用 6 楼 shanda485250 的回复:]
GetWindowRect
函数功能:该函数返回指定窗口的边框矩形的尺寸。该尺寸以相对于屏幕坐标左上角的屏幕坐标给出。
ScreenToClient
函数功能:该函数把屏幕上指定点的屏幕坐标转换成用户坐标。
函数原型:BOOL ScreenToClient(HWND hWnd, LPPOINT lpPoint);
MoveWindow
函数功能:改变指定窗口的位置和大小.对顶窗口来说,……
[/Quote]


我从最后IDD_FILECOPY_DIALOG显示来看,
GetDlgItem(IDC_BASE)->GetWindowRect(&rcBaseFrm);
这个rcBaseFrm的值,坐标原点是主对话框的左上角定点?????????
回复
shanda485250 2010-08-16
GetWindowRect
函数功能:该函数返回指定窗口的边框矩形的尺寸。该尺寸以相对于屏幕坐标左上角的屏幕坐标给出。
ScreenToClient
函数功能:该函数把屏幕上指定点的屏幕坐标转换成用户坐标。
函数原型:BOOL ScreenToClient(HWND hWnd, LPPOINT lpPoint);
MoveWindow
函数功能:改变指定窗口的位置和大小.对顶窗口来说,位置和大小取决于屏幕的左上角;对子窗口来说,位置和大小取决于父窗口客户区的左上角.
函数原型:BOOL MoveWindow( HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint );

3L说的不错。MoveWindow其实应该是桌面的坐标,而不是客户区的。
回复
Evil_cloud 2010-08-16
[Quote=引用 3 楼 xxd_qd 的回复:]

ScreenToClient(&rcBaseFrm);
这句去掉。
[/Quote]

去掉也不行啊!主对话框在屏幕中心 而IDD_FILECOPY_DIALOG现在是屏幕的左上角位置
回复
Evil_cloud 2010-08-16
[Quote=引用 2 楼 shanda485250 的回复:]

不明白你想问的。
是不是想用picture确定个范围,然后让窗口根据这个范围来显示?
现在窗口是在屏幕的左上角还是在主窗口左上角?
[/Quote]

屏幕左上角
回复
xxd_qd 2010-08-16
ScreenToClient(&rcBaseFrm);
这句去掉。
回复
shanda485250 2010-08-16
不明白你想问的。
是不是想用picture确定个范围,然后让窗口根据这个范围来显示?
现在窗口是在屏幕的左上角还是在主窗口左上角?
回复
Evil_cloud 2010-08-16
在线等答案!
回复
相关推荐
发帖
界面
创建于2007-09-28

1.5w+

社区成员

VC/MFC 界面
申请成为版主
帖子事件
创建了帖子
2010-08-16 02:04
社区公告
暂无公告