绘图后如何刷新??

ATMCash4423 2011-05-09 05:57:25
我想写一个可以随对话框大小随意伸缩的背景,图形已经绘制好了,对话框放大背景可以跟着放大,缩小就不行!然后我加了个刷新函数Invalidate()这下连背景也显示不出来了~~
代码如下:

void CMyDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
reght_x=cx;reght_y=cy;//把获取到右下角的坐标赋给全局变量。
//Invalidate();//强制刷新
}
void CMyDlg::OnPaint()
{
if (IsIconic())
{
……
}
else
{
BeiJingXian(left_x,left_y,reght_x,reght_y);//调用自定义函数,用于画背景的。参数1和2是
//左上角坐标,参数3,4是右下角坐标
// Invalidate();//强制刷新
CDialog::OnPaint();
}
}

不管我在OnPaint() 还是OnSize中加入Invalidate();都不显示绘图了!
我该如何实现我想要的功能???
...全文
163 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ATMCash4423 2011-05-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 pop1210 的回复:]
1. Invalidate函数本身就会导致OnPaint函数的调用,所以不能在OnPaint中调用Invalidate函数,不然会造成无限递归.

2.去掉CDialog::OnPaint();
[/Quote]
我去掉CDialog::OnPaint()之后对话框不断刷新,我不动他也刷,导致对话框不停闪烁~~!
pop1210 2011-05-09
  • 打赏
  • 举报
回复
1. Invalidate函数本身就会导致OnPaint函数的调用,所以不能在OnPaint中调用Invalidate函数,不然会造成无限递归.

2.去掉CDialog::OnPaint();
ATMCash4423 2011-05-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xiaohuh421 的回复:]
1. Invalidate函数本身就会导致OnPaint函数的调用,所以不能在OnPaint中调用Invalidate函数,不然会造成无限递归.

2. 确认你传入的绘图坐标是否正确,有可能坐标已经不在你窗口的区域了,特别注意屏幕坐标和客户坐标之分.
3. 确定你使用的绘图DC是正确的.

一个简单的测试程序.部分代码:
void CTestDlg::OnPaint()
{
if ……
[/Quote]
我经过测试了,显示aaaaa,并且随着放大或者缩小~~~
真怪了,一样一样的代码,我在公司的电脑上就不是这效果,公司的是WIN7,我现在调试成功的是xp,
我在win7上把Invalidate函数放在onsize()里连绘制的图形都显示不出来~~
原封不动的代码考回来就能用了~~~
xiaohuh421 2011-05-09
  • 打赏
  • 举报
回复
1. Invalidate函数本身就会导致OnPaint函数的调用,所以不能在OnPaint中调用Invalidate函数,不然会造成无限递归.

2. 确认你传入的绘图坐标是否正确,有可能坐标已经不在你窗口的区域了,特别注意屏幕坐标和客户坐标之分.
3. 确定你使用的绘图DC是正确的.

一个简单的测试程序.部分代码:
void CTestDlg::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
{
DrawBgn();
CDialog::OnPaint();
}
}


void CTestDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
Invalidate(TRUE);
// TODO: 在此处添加消息处理程序代码
}

void CTestDlg::DrawBgn()
{
CPaintDC dc(this);
CRect rect;
GetClientRect(&rect);
CString Str=TEXT("aaaa");
dc.TextOut(rect.Width()/2,rect.Height()/2,Str);
}

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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