OnPaint里的故事

这是典型的OnPaint的处理

void CMyDlg::OnPaint() 

{

if (IsIconic())

{

CPaintDC dc(this); // 用于绘制的设备上下文

 

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

 

// 使图标在工作矩形中居中

int cxIcon = GetSystemMetrics(SM_CXICON);

int cyIcon = GetSystemMetrics(SM_CYICON);

CRect rect;

GetClientRect(&rect);

int x = (rect.Width() - cxIcon + 1) / 2;

int y = (rect.Height() - cyIcon + 1) / 2;

 

// 绘制图标

dc.DrawIcon(x, y, m_hIcon);

}

else

{

CDialog::OnPaint();

}

}

在窗口有区域无效时,系统往窗口消息队列里放WM_PAINT消息,OnPaint正是这个消息的响应函数。

在处理WM_PAINT消息时,正确的做法是调用BeginPaint从消息队列中取出消息将无效区去除,如果需要擦除的话,

则发送WM_ERASEBKGND消息,最后调用的是EndPaint,如果你没有调用BeginPaint,消息队列中一直会有WM_PAINT消息且

系统会不断发送这个消息,因为他发现一直都有无效的区域。

再看这个OnPaint的处理,如果是窗口已经图标话,则使用CPaintDC,注意看看这个类,它的构造函数里是调用了

BeginPaint函数的。如果窗口没有图标化,调用了父类的CDialog::OnPaint(),你可以删除这句运行程序看看,客户区的

东西是不是出不来?这就对了,窗口一直在那处理onPaint消息呢,而onPaint里又什么都没做。子控件也显示不了。

正确的做法是先调用父类,如果还想做其它处理,请在调用了父类的处理之后

 

最近在写一个显示波形的程序,自认为双缓冲在这里体现得很好,过段时间完善了贴上来

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值