首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

对话框部分遮挡后重绘,该怎么解决

2012-01-13 
对话框部分遮挡后重绘程序是基于对话框的,就一个无标题栏的主对话框,初始化为:SetWindowPos(NULL,10,10,67

对话框部分遮挡后重绘
程序是基于对话框的,就一个无标题栏的主对话框,初始化为:SetWindowPos(NULL,   10,   10,   672,   294,   SWP_NOZORDER   |   SWP_NOMOVE);
我在WM_PAINT消息下绘制一个方框,方框是7行5列里面有31个小格子,每个格子里面填充汉字。现在的问题是如果窗体的一部分被遮挡后,那部分的字就消失了,画的格子线还在。请问大哥们,我该怎么重绘窗体,让字也不消失。程序如下:
void   CDialogTestDlg::OnPaint()  
{
if   (IsIconic())
{
CPaintDC   dc(this);   //   device   context   for   painting

SendMessage(WM_ICONERASEBKGND,   (WPARAM)   dc.GetSafeHdc(),   0);

//   Center   icon   in   client   rectangle
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;

//   Draw   the   icon
dc.DrawIcon(x,   y,   m_hIcon);
}
else
{


CPaintDC   dc(this);
for   (int   i   =   0;   i   <   6;   i++)//垂直线
{
int   x   =   i*32+5;
if   (i   <   2)
{
dc.MoveTo(x,   68);
dc.LineTo(x,   278);
}
dc.MoveTo(x,   68);
dc.LineTo(x,   248);
}
for   (i   =   0;   i   <   7;   i++)//水平线
{
int   y   =   i*30   +   68;
dc.MoveTo(5,   y);
dc.LineTo(165,   y);
}
dc.MoveTo(5,   278);
for   (i   =   0;   i   <   7;   i++)
{
int   y   =   30*i   +   68;
for   (int   j   =   0;   j   <   5;   j++)
{
int   x   =   32*j   +   5;
CString   strText;
m_rcLocation[i][j].SetRect(x,   y,   x+32,   y+30);//设置每个省简称方框的坐标
if   (m_strLocation.GetLength()   >   0)
{
strText=m_strLocation.Left(2);
m_strLocation.Delete(0,2);
dc.DrawText(strText,   m_rcLocation[i][j],   DT_SINGLELINE   |   DT_CENTER   |   DT_VCENTER);
}
}
}
              UpdateData(FALSE);
ReleaseDC(&dc);
CDialog::OnPaint();
          }
}
这只是程序的部分,程序没有问题,就是把各省的简称填充到表格里面。
m_strLocation= "鄂京津沪渝冀晋辽吉黑苏浙皖闽赣鲁豫湘粤琼川贵云陕甘青藏桂蒙宁新 ";
m_rcLocation[7][5]是CRect类的对象,现在的问题是窗体一被遮挡这部分的字就消失了,方框还是能看见的。我该怎么重绘呢?大哥们帮帮忙谢谢!

[解决办法]
UpdateData(FALSE);这个最好不要放在OnPaint里;
//ReleaseDC(&dc);不需要
//CDialog::OnPaint();注释掉

你的问题像是在if (m_strLocation.GetLength() > 0)循环里面将m_strLocation清空了,这样刷新一次后当然不会再绘制里面的内容。

数据的修改处理不要放在OnPaint中,因为刷新是随时都可能发生的,这样你就不能控制数据。
[解决办法]
m_strLocation.Delete(0,2);问题再这,重绘的时候m_strLocation里面什么都没有了.
if (m_strLocation.GetLength() > =2*(i*5+j))
{
strText=m_strLocation.Mid(2*(i*5+j),2);
// m_strLocation.Delete(0,2);
dc.DrawText(strText, m_rcLocation[i][j], DT_SINGLELINE | DT_CENTER | DT_VCENTER);
}}

热点排行