hur.cn - 华软网

 热门搜索

自定义控件最大化的问题

  作者:未知    来源:网络    更新时间:2011/1/13
我需要做一个.EXE程序,程序运行结果是再控件里显示特定地址上的图像。现在想实现控件显示图像的时候能够随着窗口最大化而实现满屏幕显示,下边是控件最大化的实现程序,麻烦列位帮助看看问题出在那里?应该是获得窗口句柄失利!
BOOL CGraphShowDlg::OnInitDialog()
{
CDialog::OnInitDialog();
  ......
  // TODO: Add extra initialization here

//在初始化函数中计算当前对话框的巨细和最大化的放大比率,其中放大比率要用float型,否则不差很大
CRect rectC;
::GetWindowRect(m_hWnd,rectC);
ScreenToClient (rectC);
m_nDlgWidth = rectC.right - rectC.left;
m_nDlgHeight = rectC.bottom - rectC.top;
//计算屏幕巨细
m_nWidth = GetSystemMetrics(SM_CXSCREEN);
m_nHeight = GetSystemMetrics(SM_CYSCREEN);
//计算放大倍数
m_Multiple_width = float(m_nWidth)/float(m_nDlgWidth);
m_Multiple_heith = float(m_nHeight)/float(m_nDlgHeight);
change_flag = TRUE; //用来判断onsize执行时之前计算是否完成

CLoad loadmap;
loadmap.DoModal(); //弹出登录对话框
  ......
}
  ....

void CGraphShowDlg::OnSize(UINT nType, int cx, int cy)  
{
CDialog::OnSize(nType, cx, cy);

// TODO: Add your message handler code here
if(change_flag) //确定前边对对话框的放大倍数的计算完成了
{
ReSize(IDC_ActiveX); //重绘窗口控件

  //恢复放大倍数,并保存 (保证还原时候能够还原到原来的巨细)
  m_Multiple_width = float(1)/m_Multiple_width ;  
  m_Multiple_heith = float(1)/m_Multiple_heith ;  
}

}

void CGraphShowDlg::ReSize(UINT nID)
{
CRect Rect;
if(GetDlgItem(IDC_ActiveX)->GetSafeHwnd())
{
 GetDlgItem(nID)->GetWindowRect(Rect);
 ScreenToClient(Rect);
//计算控件左上角的点
CPoint OldTLPoint,TLPoint;
OldTLPoint = Rect.TopLeft();
TLPoint.x = long(OldTLPoint.x * m_Multiple_width);
TLPoint.y = long(OldTLPoint.y * m_Multiple_heith);

//计算控件右下角点
CPoint OldBRPoint,BRPoint;
OldBRPoint = Rect.BottomRight();
BRPoint.x = long(OldBRPoint.x * m_Multiple_width);
BRPoint.y = long(OldBRPoint.x * m_Multiple_heith);

//把控件移动到新矩形里
Rect.SetRect(TLPoint,BRPoint);
GetDlgItem(nID)->MoveWindow (Rect, TRUE);
}
else
MessageBox("获得窗口句柄失利!");
}
---华软 网友回答---
你Debug下调试一下看看哪一个窗口句柄为NULL?
---华软网友回复---
引用 1 楼 visualeleven 的回复:
你Debug下调试一下看看哪一个窗口句柄为NULL?

 怎么知道哪一个窗口句柄是空的?高手,你告诉我怎么改吧,托付了!
---华软网友回复---
引用 1 楼 visualeleven 的回复:
你Debug下调试一下看看哪一个窗口句柄为NULL?

现在出问题的只有主窗口,子窗口都能正常运行。
---华软网友回复---
引用 2 楼 fudexiao 的回复:
引用 1 楼 visualeleven 的回复:
你Debug下调试一下看看哪一个窗口句柄为NULL?

 怎么知道哪一个窗口句柄是空的?高手,你告诉我怎么改吧,托付了!

你把OnInitDialog函数中的
CLoad loadmap;
loadmap.DoModal(); //弹出登录对话框
这两句注释掉另有这个问题吗?
---华软网友回复---
引用 4 楼 visualeleven 的回复:
引用 2 楼 fudexiao 的回复:
引用 1 楼 visualeleven 的回复:
你Debug下调试一下看看哪一个窗口句柄为NULL?

怎么知道哪一个窗口句柄是空的?高手,你告诉我怎么改吧,托付了!

你把OnInitDialog函数中的
CLoad loadmap;
loadmap.DoModal(); //弹出登录对话框
这两句注释掉另有这个问题吗?


照旧出来那个弹出消息:获得窗口句柄失利!,看来不是那的问题!这个Resize应该是我点击最大化按钮的时候触发的吧,可是我单步执行的时候,初始化函数执行前就弹出这个“获得窗口句柄失利!”的消息了。是怎么回事!
---华软网友回复---
引用 4 楼 visualeleven 的回复:
引用 2 楼 fudexiao 的回复:
引用 1 楼 visualeleven 的回复:
你Debug下调试一下看看哪一个窗口句柄为NULL?

怎么知道哪一个窗口句柄是空的?高手,你告诉我怎么改吧,托付了!

你把OnInitDialog函数中的
CLoad loadmap;
loadmap.DoModal(); //弹出登录对话框
这两句注释掉另有这个问题吗?


单步执行,初始化之前执行的OnSize函数,然后调用ReSize,到if(GetDlgItem(IDC_ActiveX)->GetSafeHwnd())就出现毛病,是个OMF毛病!      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。