关于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()
}
以上是代码的一部分,我去掉了一些不想关的东西,一些我试过没用的函数被我注释掉了,求高手指教。 展开
{
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()
}
以上是代码的一部分,我去掉了一些不想关的东西,一些我试过没用的函数被我注释掉了,求高手指教。 展开
3个回答
展开全部
使用 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);}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你加了很多定时器吗?如果只有一个那么if(nIDEvent == 1)判断没用,他会自动执行ontimer
追问
只有一个定时器,但这个应该没关系吧,我感觉是定时器调用OnPaint()的时候,OnPaint()没把之前的图像给清掉,切换页面的时候就会清掉,
追答
那你既然知道是哪个函数的问题那就改啊!窗口重绘!repaint()
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询