void TopLabelView2::OnSize(UINT nType, int cx, int cy)
{
CFormView::OnSize(nType, cx, cy);
// TODO: Add your message handler code here CRect rc;
GetClientRect(&rc);
int x=rc.Width(); // 929 1036 1204
int y=rc.Height(); // 524 822 822
int area=x*y;
double rate1,rate2;
rate1=x/1204;
rate2=y/822;
CWnd *pWnd1;
pWnd1 = GetDlgItem(IDC_DAS_CIRCLEGAUGE1); //pWnd1获得为空??
}
IDC_DAS_CIRCLEGAUGE1 是一个仪表控件,不知道为什么 ,就是获得不了!!!
你把创建的代码贴出来!
if(::IsWindow(GetDlgItem(IDC_DAS_CIRCLEGAUGE1)->GetSafeHwnd())
{
……
} 可以在里面设置个断点看一下
{
protected:
TopLabelView2(); // protected constructor used by dynamic creation
DECLARE_DYNCREATE(TopLabelView2)// Attributes
public:
CDAS_CircleGauge m_CGauge1;
。
void TopLabelView2::DoDataExchange(CDataExchange *pDX)
{
CFormView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CPrintView)
// NOTE: the ClassWizard will add DDX and DDV calls here
DDX_Control(pDX, IDC_DAS_CIRCLEGAUGE1, m_CGauge1);
系统启动时,会调用三次OnSize
正常启动后,pWnd就有值了
第一次调用时你不需要处理
{
......
m_bResizeFlag = TRUE;
}void CXXXDlg::OnSize(UINT nType, int cx, int cy)
{
if(m_bResizeFlag)
{
...... //调整窗口
}
}
但是以上的代码加上 这句 pWnd1->MoveWindow(( double )x*0.33,( double )y*0.13,( double )150*rate1,( double )150*rate2,TRUE);执行程序 直接报错!
if(pWnd1 != NULL)
pWnd1->MoveWindow(( double )x*0.33,( double )y*0.13,( double )150*rate1,( double )150*rate2,TRUE);
就行了啊。
用指针前,先判定是否为空啊
窗口指针不为空,并不代表其窗口就一定存在,我觉得最好的做法如下:
CWnd* pWnd;
...
if ( pWnd && pWnd->m_hWnd )
{
// do something;
}
{
CFormView::OnSize(nType, cx, cy);
// TODO: Add your message handler code here CRect rc;
GetClientRect(&rc);
int x=rc.Width(); // 929 1036 1204
int y=rc.Height(); // 524 822 822
int area=x*y;
double rate1,rate2;
rate1=x/1204;
rate2=y/822;
CWnd *pWnd1;
pWnd1 = GetDlgItem(IDC_DAS_CIRCLEGAUGE1); //pWnd1获得为空??
}这段代码中rate1,rate2式用来表示缩放比例的吧???
如果真是这样的,请看rate1=x/1204;这句代码,它的计算过程是:
1. 两个整形的数相除,得到的是一个舍去小数位的整数;
2. 将结果(整数)赋值给一个double型变量;
也就是说,如果x < 1024,rate1永远都是零;
我猜你在其它地方肯定调用了MoveWindow(rate1*x,...)或SetWindowPos(rate1*x, ...)等改变窗口大小和位置的函数吧,
此时窗口不变成零才怪。这句代码rate2=y/822;也有同样的问题
建议这样修改rate1 = (double)(1.0 * x / 1024);