paint中:
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);  //
HBITMAP hbitmap =   //
::LoadBitmap(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_MAINMAP));
HDC hMemDC = ::CreateCompatibleDC(NULL); //
SelectObject(hMemDC, hbitmap);
::StretchBlt(dc.m_hDC,0,0,1000,1000,hMemDC,0,0,1000,1000,SRCCOPY);
::DeleteDC(hMemDC);
::DeleteObject(hbitmap);
::DeleteDC(dc);// 从注册表取CString值然后textout
CString result;
LPCTSTR data_Set="Software\\Microsoft\\MS Setup (ACME)\\User Info\\";
 result = GetRegValue(HKEY_CURRENT_USER, data_Set, "logoname", (LPCTSTR)_T(""), 255);
CFont font;
CDC *pDC = GetDC();
font.CreateFont(38,0,0,0,0,0,0,0,0,1,1,1,1,_T("Arial"));    
pDC->SelectObject( &font );
pDC->SetBkMode(TRANSPARENT);//
pDC->SetTextColor(RGB(0, 0,255));//
UpdateData();
pDC->TextOut(350,20,result);//
ReleaseDC(pDC);
        
//输出副标题
CFont font1;
CDC *pDC1 = GetDC();
font.CreateFont(24,0,0,0,0,0,0,0,0,1,1,1,1,"黑体");    
//font.CreatePointFont(50,"MS Sans Serif");
pDC1->SelectObject( &font );
pDC1->SetBkMode(TRANSPARENT);//
pDC1->SetTextColor(RGB(0, 0,255));//
UpdateData();
pDC1->TextOut(600,58,"JTJ-DTS32............");/////////
ReleaseDC(pDC1);//输出磁盘使用情况
font.CreateFont(15,0,0,0,0,0,0,0,0,1,1,1,1,_T("Arial")); 
CDC *pDC2 = GetDC();
pDC2->SelectObject( &font );
pDC2->SetBkMode(TRANSPARENT);//
pDC2->SetTextColor(RGB(255,255,255));//
pDC2->TextOut(90,580,showuse);
pDC2->TextOut(90,600,showfree);
pDC2->TextOut(90,620,showtotal);
ReleaseDC(pDC2);程序启动后一切正常,但是连续按“显示桌面”大约60次时,第一,第二的输出变成同样大小切字体相同,第一个输出的字体变小,第二个输出的字体变大。
第三个字体变大。变成和前二者大小不同的大小。
且有时候背景图不再能正确加载。
郁闷,大家分析下。
对了,字体变的时候连给各个按纽做的tooltip的字体都变大了好多!

解决方案 »

  1.   

    pDC1->TextOut(600,58,"JTJ-DTS32............");改为:
    CString strText = "JTJ-DTS32............";
    pDC1->TextOut(600,58,strText);
      

  2.   

    请在三个font对象后加入font.deleteobject()再试试!
      

  3.   

    一般是GDI资源泄露引起的.每个GDI Create后,配合DeleteObject/使用.
      

  4.   

    对了,楼主你selectobject时没有保存老的对象。你试试保存老的对象,写完字后再select回去试试!
      

  5.   

    所有的new,creat,GetDc之类的都检查了,没有忘记delete
      

  6.   

    CFont font1;
    CDC *pDC1 = GetDC();
    font.CreateFont(24,0,0,0,0,0,0,0,0,1,1,1,1,"黑体");    
    //font.CreatePointFont(50,"MS Sans Serif");
    pDC1->SelectObject( &font );
    pDC1->SetBkMode(TRANSPARENT);//
    pDC1->SetTextColor(RGB(0, 0,255));//
    UpdateData();
    pDC1->TextOut(600,58,"JTJ-DTS32............");/////////
    ReleaseDC(pDC1);
    楼主这里你到底想用Font还是Font1啊?是不是写错了?另外,如果第二次使用font的话,使用前应该释放第一次的font对象,然后再createfont!
    CFont font;
    CDC *pDC = GetDC();
    font.CreateFont(38,0,0,0,0,0,0,0,0,1,1,1,1,_T("Arial"));    
    CFont * oldfont = pDC->SelectObject( &font );
    pDC->SetBkMode(TRANSPARENT);//
    pDC->SetTextColor(RGB(0, 0,255));//
    pDC->TextOut(350,20,result);//
    pDC->SelectObject(oldfont);
    font.DeleteObject();
    ReleaseDC(pDC);
    另外,楼主应该在你这个Else的最前后加上CDialog:OnPaint();
      

  7.   

    我这里用一个简单的对话框,加入你的代码,如果不font.deleteobject()的话,运行就出错。如果不加CDialog::OnPaint()的话,CPU占用率>90%.
      

  8.   

    可是我的cpu使用率在5%左右才怎么
      

  9.   

    solobird(索罗博德) 
    我的font定义是乱了,现在已经改好,用font1,font2,font3。不过还是同样的问题。
    最后保存老的对象,写完字后再select回去就好了。
    非常感谢!
    我一般看不保存旧的就运行的很好就没有加,这会吸取教训了。不过我不是很清楚保存旧的字体那么重要啊怎么就?能详细解释下吗?