onsize 中获得控件的句柄??

baiyizhujian 2009-06-24 03:47:37

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 是一个仪表控件,不知道为什么 ,就是获得不了!!!
...全文
53 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
supconsupcon 2009-06-25
  • 打赏
  • 举报
回复
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获得为空??
}

这段代码中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);
baiyizhujian 2009-06-25
  • 打赏
  • 举报
回复
但是程序运行后,窗口尺寸改变后 ,该控件的消失了
supconsupcon 2009-06-24
  • 打赏
  • 举报
回复
对于窗口指针,不能只判断指针是否合法,还应判定其句柄是否为空,
窗口指针不为空,并不代表其窗口就一定存在,我觉得最好的做法如下:
CWnd* pWnd;
...
if ( pWnd && pWnd->m_hWnd )
{
// do something;
}
qingfeng5211 2009-06-24
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 happyparrot 的回复:]

if(pWnd1 != NULL)
pWnd1->MoveWindow(( double )x*0.33,( double )y*0.13,( double )150*rate1,( double )150*rate2,TRUE);
就行了啊。
用指针前,先判定是否为空啊
[/Quote]
指针的使用不是都应该考虑是否为空的情况吗?
  • 打赏
  • 举报
回复
可以GetSafeWnd判断一下窗口是否建立 然后再使用
baiyizhujian 2009-06-24
  • 打赏
  • 举报
回复
我再试试!!
快乐鹦鹉 2009-06-24
  • 打赏
  • 举报
回复

if(pWnd1 != NULL)
pWnd1->MoveWindow(( double )x*0.33,( double )y*0.13,( double )150*rate1,( double )150*rate2,TRUE);
就行了啊。
用指针前,先判定是否为空啊
baiyizhujian 2009-06-24
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 happyparrot 的回复:]
为空你不需要管。
正常启动后,pWnd就有值了
第一次调用时你不需要处理
[/Quote]

但是以上的代码加上 这句 pWnd1->MoveWindow(( double )x*0.33,( double )y*0.13,( double )150*rate1,( double )150*rate2,TRUE);

执行程序 直接报错!
快乐鹦鹉 2009-06-24
  • 打赏
  • 举报
回复
之需要用pWnd的地方先判断是否为空就行。为空就不处理
Ryanwen 2009-06-24
  • 打赏
  • 举报
回复
因为OnSize第一次调用时控件还没有完成初始化,给你个取巧的办法,

BOOL m_bResizeFlag; //定义个成员变量

m_bResizeFlag = FALSE; 初始化

BOOL CXXXDlg::OnInitDialog()
{
......
m_bResizeFlag = TRUE;
}

void CXXXDlg::OnSize(UINT nType, int cx, int cy)
{
if(m_bResizeFlag)
{
...... //调整窗口
}
}
快乐鹦鹉 2009-06-24
  • 打赏
  • 举报
回复
为空你不需要管。
正常启动后,pWnd就有值了
第一次调用时你不需要处理
baiyizhujian 2009-06-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 happyparrot 的回复:]
OnSize第一次运行时,所有控件对象都没有创建呢
系统启动时,会调用三次OnSize
[/Quote]

那我该怎么获得 控件的句柄呢??
fandh 2009-06-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 happyparrot 的回复:]
OnSize第一次运行时,所有控件对象都没有创建呢
系统启动时,会调用三次OnSize
[/Quote]
楼上说的对!
快乐鹦鹉 2009-06-24
  • 打赏
  • 举报
回复
OnSize第一次运行时,所有控件对象都没有创建呢
系统启动时,会调用三次OnSize
baiyizhujian 2009-06-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fandh 的回复:]
IDC_DAS_CIRCLEGAUGE1 这个仪表控件的父窗口是TopLabelView2么?
你把创建的代码贴出来!
[/Quote]


class TopLabelView2 : public CFormView
{
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);

峰白 2009-06-24
  • 打赏
  • 举报
回复
OnSize不止会运行一次的,应该


if(::IsWindow(GetDlgItem(IDC_DAS_CIRCLEGAUGE1)->GetSafeHwnd())
{
……
}

可以在里面设置个断点看一下
fandh 2009-06-24
  • 打赏
  • 举报
回复
IDC_DAS_CIRCLEGAUGE1 这个仪表控件的父窗口是TopLabelView2么?
你把创建的代码贴出来!

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧