关于mfc页面重绘的问题,在定时器里调用了自己写的画图函数,用来画实时图,结果页面没更新,该怎么解决

voiddrawPic(inttype){CDC*pDC=this->GetDC();//GetDlgItem(IDD_FISH_TAIL_DIALOG)->GetDC(... void drawPic(int type)
{
CDC *pDC = this->GetDC();//GetDlgItem(IDD_FISH_TAIL_DIALOG)->GetDC();
pDC->SetDCPenColor(RGB(11,200,35));
/*
用pDC绘图
*/
ReleaseDC(pDC);

}
void OnTimer(UINT_PTR nIDEvent)
{

if(nIDEvent == 1)
{
//int Type = ComType.GetCurSel();
//GetDlgItem(IDC_STATIC_T_PIC)->Invalidate(true);
getData();
//drawPic(ComType.GetCurSel());
//GetDlgItem(IDC_STATIC_T_PIC)->Invalidate(true);
OnPaint();
}
CDialogEx::OnTimer(nIDEvent);
}
void 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;
}
else
{
// TODO: 在此处添加消息处理程序代码
CDialog::OnPaint(); // 重绘对话框
CDialog::UpdateWindow(); // 更新windows窗口,如果无这步调用,图片显示还会出现问题
drawPic(ComType.GetCurSel());
}

// 不为绘图消息调用 CDialogEx::OnPaint()
}
以上是代码的一部分,我去掉了一些不想关的东西,一些我试过没用的函数被我注释掉了,求高手指教。
展开
 我来答
inLineHook
2013-04-14
知道答主
回答量:20
采纳率:0%
帮助的人:10万
展开全部
你如果只写了一个定时器,那么不需要在ontimer里判断是否为1,多余的;然后如果没有被清理,那么你可以自己写一个在调用OnPaint函数之前的一个清理的函数,希望可以帮助你~~~
追问
谢了
this->Invalidate(FALSE);不行,不过把FALSE改成true就行了。呵呵
xiaoyaowujie
2013-04-14
知道答主
回答量:16
采纳率:0%
帮助的人:13.6万
展开全部

使用 Invalidate()刷新

代码如下:

 

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
{
CDialog::OnPaint();
CDialog::UpdateWindow();

this->DrawPic();
}
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CTestDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}


void CTestDlg::DrawPic(void)
{
CDC *pDC = this->GetDC();
pDC->SetBkMode(TRANSPARENT);
pDC->SetDCPenColor(RGB(11,200,35));

CBrush Bru1(RGB(0,255,0));
CBrush Bru2(RGB(255,0,0));
CBrush Bru3(RGB(0,0,255));

if(style == 1)
{
pDC->SelectObject(&Bru1);
}
else if(style == 2)
{
pDC->SelectObject(&Bru2);
}
else if(style == 3)
{
pDC->SelectObject(&Bru3);
}
pDC->Rectangle(10,10,400,300);

this->ReleaseDC(pDC);}
void CTestDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值

style = style++%3;
/*****************************************************************/
//重绘之后调用此函数
/*****************************************************************/
this->Invalidate(FALSE);

CDialog::OnTimer(nIDEvent);}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
jimoyaohong
2013-04-14
知道答主
回答量:13
采纳率:0%
帮助的人:13.9万
展开全部
你加了很多定时器吗?如果只有一个那么if(nIDEvent == 1)判断没用,他会自动执行ontimer
追问
只有一个定时器,但这个应该没关系吧,我感觉是定时器调用OnPaint()的时候,OnPaint()没把之前的图像给清掉,切换页面的时候就会清掉,
追答
那你既然知道是哪个函数的问题那就改啊!窗口重绘!repaint()
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式