hur.cn - 华软网

 热门搜索

关于控件最大化的问题,请教各位高手!

  作者:未知    来源:网络    更新时间:2011/1/10
我需要做一个.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;
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);
}
---华软 网友回答---
WM_SIZE会调用屡次,应该是
ReSize(IDC_ActiveX); //重绘窗口控件
这个函数中的毛病,窗口还没有创建完成,而在这个ReSize函数中你却做了相关窗口的操作了
---华软网友回复---
void CGraphShowDlg::ReSize(UINT nID)
函数中的
GetDlgItem(nID)->GetWindowRect(Rect);
这句,看看GetDlgItem(nID)->GetSafeHwnd()是否为NULL
---华软网友回复---
引用 1 楼 visualeleven 的回复:
WM_SIZE会调用屡次,应该是
ReSize(IDC_ActiveX); //重绘窗口控件
这个函数中的毛病,窗口还没有创建完成,而在这个ReSize函数中你却做了相关窗口的操作了

+1
---华软网友回复---
多谢楼上Eleven的回答,那我需要怎么修改一下?
---华软网友回复---
引用 4 楼 fudexiao 的回复:
多谢楼上Eleven的回答,那我需要怎么修改一下?

你在操作窗口之前,你要先判断一下窗口句柄是否不为NULL,即窗口类对象已经联系关系好了窗口对象(窗口类的m_hWnd成员变量不为NULL)。
只有窗口句柄不为NULL,你才能够执行与窗口相关的操作
---华软网友回复---
引用 1 楼 visualeleven 的回复:
WM_SIZE会调用屡次,应该是
ReSize(IDC_ActiveX); //重绘窗口控件
这个函数中的毛病,窗口还没有创建完成,而在这个ReSize函数中你却做了相关窗口的操作了


下边是我再对话框初始化函数中增加的程序,按照您的意思这些应该在那里去实现对照好呢?谢谢!
         CLoad loadmap;
loadmap.DoModal();   //弹出登录对话框

CHiGraph higraph;
higraph.SetUserId(CGraphShowDlg::username);      //设置用户名
higraph.SetSzHttpUrl(CGraphShowDlg::httpurl);    //设置远程服务器地址
    higraph.SetSzFlConnectionString(CGraphShowDlg::connectionstring); //设置连接字符串
    higraph.SetExtendInterfaceString(CGraphShowDlg::extendinterfacestring); //设置扩展接口字符串

    //在初始化函数中计算当前对话框的巨细和最大化的放大比率,其中放大比率要用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执行时之前计算是否完成

---华软网友回复---
引用 1 楼 visualeleven 的回复:
WM_SIZE会调用屡次,应该是
ReSize(IDC_ActiveX); //重绘窗口控件
这个函数中的毛病,窗口还没有创建完成,而在这个ReSize函数中你却做了相关窗口的操作了

需要在那里完成窗口的创建?      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。