我使用了的是单文档结构,使用了ScrollView视图,在视图上用了不同字体输出内容,结果在编译成功后,我拖动滚动条,视图中的内容糊成一团。
有人知道这是为什么吗?
下面是部分字体样式代码:
LOGFONT logFont1;
logFont1.lfHeight = 48;
logFont1.lfWidth = 0;
logFont1.lfEscapement = 0;
logFont1.lfOrientation = 0;
logFont1.lfWidth = FW_DONTCARE;
logFont1.lfItalic = 0;
logFont1.lfUnderline = 0;
logFont1.lfStrikeOut = 0;
logFont1.lfCharSet = ANSI_CHARSET;
logFont1.lfOutPrecision= OUT_DEFAULT_PRECIS;
logFont1.lfClipPrecision = CLIP_DEFAULT_PRECIS;
logFont1.lfQuality = PROOF_QUALITY;
logFont1.lfPitchAndFamily = VARIABLE_PITCH|FF_ROMAN;
strcpy(logFont1.lfFaceName,"Times New Roman"); LOGFONT logFont;
logFont.lfHeight = 24;
logFont.lfWidth = 0;
logFont.lfEscapement = 0;
logFont.lfOrientation = 0;
logFont.lfWidth = FW_DONTCARE;
logFont.lfItalic = 0;
logFont.lfUnderline = 0;
logFont.lfStrikeOut = 0;
logFont.lfCharSet = ANSI_CHARSET;
logFont.lfOutPrecision= OUT_DEFAULT_PRECIS;
logFont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
logFont.lfQuality = PROOF_QUALITY;
logFont.lfPitchAndFamily = VARIABLE_PITCH|FF_ROMAN;
strcpy(logFont.lfFaceName,"Times New Roman"); LOGFONT logFont2;
logFont2.lfHeight = 16;
logFont2.lfWidth = 0;
logFont2.lfEscapement = 0;
logFont2.lfOrientation = 0;
logFont2.lfWidth = FW_DONTCARE;
logFont2.lfItalic = 0;
logFont2.lfUnderline = 0;
logFont2.lfStrikeOut = 0;
logFont2.lfCharSet = ANSI_CHARSET;
logFont2.lfOutPrecision= OUT_DEFAULT_PRECIS;
logFont2.lfClipPrecision = CLIP_DEFAULT_PRECIS;
logFont2.lfQuality = PROOF_QUALITY;
logFont2.lfPitchAndFamily = VARIABLE_PITCH|FF_ROMAN;
strcpy(logFont2.lfFaceName,"articl");

解决方案 »

  1.   

    问题出在滚动上,不是字体上看看MSDN上关于下列函数及相关函数
    SetViewportOrg
    GetClipBoxoffsetviewportorg
      

  2.   

    重点是你在哪里写上在View里面写东西的代码WM_ERASEBKGND消息的内容有没有修改呢
      

  3.   

    我在OnDraw最后加了:
        CSize docSize(700,h/35*(58+34+37*26+8)+h%35*26+58+34+34);
    CRect rect;
    GetClientRect(&rect);
    CSize pageSize(rect.right,rect.bottom);
    CSize lineSize(700,logFont.lfHeight);
    SetScrollSizes(MM_LOENGLISH,docSize,pageSize,lineSize);各位看看对不对啊
      

  4.   

    void CVCreportView::OnDraw(CDC* pDC)
    {
    CVCreportDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
    LOGFONT logFont1;
    logFont1.lfHeight = 48;
    logFont1.lfWidth = 0;
    logFont1.lfEscapement = 0;
    logFont1.lfOrientation = 0;
    logFont1.lfWidth = FW_DONTCARE;
    logFont1.lfItalic = 0;
    logFont1.lfUnderline = 0;
    logFont1.lfStrikeOut = 0;
    logFont1.lfCharSet = ANSI_CHARSET;
    logFont1.lfOutPrecision= OUT_DEFAULT_PRECIS;
    logFont1.lfClipPrecision = CLIP_DEFAULT_PRECIS;
    logFont1.lfQuality = PROOF_QUALITY;
    logFont1.lfPitchAndFamily = VARIABLE_PITCH|FF_ROMAN;
    strcpy(logFont1.lfFaceName,"Times New Roman"); LOGFONT logFont;
    logFont.lfHeight = 24;
    logFont.lfWidth = 0;
    logFont.lfEscapement = 0;
    logFont.lfOrientation = 0;
    logFont.lfWidth = FW_DONTCARE;
    logFont.lfItalic = 0;
    logFont.lfUnderline = 0;
    logFont.lfStrikeOut = 0;
    logFont.lfCharSet = ANSI_CHARSET;
    logFont.lfOutPrecision= OUT_DEFAULT_PRECIS;
    logFont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
    logFont.lfQuality = PROOF_QUALITY;
    logFont.lfPitchAndFamily = VARIABLE_PITCH|FF_ROMAN;
    strcpy(logFont.lfFaceName,"Times New Roman"); LOGFONT logFont2;
    logFont2.lfHeight = 16;
    logFont2.lfWidth = 0;
    logFont2.lfEscapement = 0;
    logFont2.lfOrientation = 0;
    logFont2.lfWidth = FW_DONTCARE;
    logFont2.lfItalic = 0;
    logFont2.lfUnderline = 0;
    logFont2.lfStrikeOut = 0;
    logFont2.lfCharSet = ANSI_CHARSET;
    logFont2.lfOutPrecision= OUT_DEFAULT_PRECIS;
    logFont2.lfClipPrecision = CLIP_DEFAULT_PRECIS;
    logFont2.lfQuality = PROOF_QUALITY;
    logFont2.lfPitchAndFamily = VARIABLE_PITCH|FF_ROMAN;
    strcpy(logFont2.lfFaceName,"articl"); int y = 0;
    int i = 1;
    int j1 = 35;
    int h = 70;
    int j2 =0;
    m_pageall = h/j1 + 1;
    CString num;
    CFont font;
    font.CreateFontIndirect(&logFont1);
    CFont* oldFont = pDC->SelectObject(&font);
    CRect client;
    pDC->GetClipBox(&client);
    TRACE("ClipBox %d %d %d %d\r\n", client.left, client.top, client.right, client.bottom); y -= GetScrollPos(SB_VERT);
    SIZE size = pDC->GetTextExtent("学");
    while (j2<h)
    {
    j2 = j1;
    pDC->TextOut(20,y,"学生成绩");
    y += size.cy+1;
    pDC->SelectObject(oldFont);
    if (font.m_hObject)
    font.DeleteObject();
    font.CreateFontIndirect(&logFont);
    pDC->SelectObject(&font); CTime now = CTime::GetCurrentTime();
    CString date = now.Format("打印日期:%B %d %Y");
    if (y >= client.top && y <= client.bottom)
    pDC->TextOut(20,y,date);
    size = pDC->GetTextExtent("学");
    y += size.cy+2;
    pDC->SelectObject(oldFont);
    font.DeleteObject();
    font.CreateFontIndirect(&logFont2);
    pDC->SelectObject(&font);
    pDC->TextOut(20,y,"学号");
    pDC->TextOut(210,y,"课程代码");
    pDC->TextOut(330,y,"课程名");
    pDC->TextOut(440,y,"教师");
    pDC->TextOut(550,y,"成绩");
    pDC->TextOut(610,y,"基点");
    pDC->TextOut(670,y,"编号");
    size = pDC->GetTextExtent("学");
    y += size.cy+2;

    for(i ;i<=j1&&i<=h; i++)
    {
    num.Format("%d",i);
    pDC->TextOut(20,y,"00000000000000000000");
    pDC->TextOut(210,y,"00000.00");
    pDC->TextOut(330,y,"000000000000");
    pDC->TextOut(440,y,"000000000000");
    pDC->TextOut(550,y,"000000");
    pDC->TextOut(610,y,"000000");
    pDC->TextOut(670,y,num);
    y += size.cy+2;
    }
    y += size.cy+2;
    j1 = j1 +35;
    } y += size.cy+2;
    pDC->SelectObject(oldFont);
    font.DeleteObject();
    font.CreateFontIndirect(&logFont);
    pDC->SelectObject(&font);
    pDC->TextOut(20,y,"总计人数:");
    pDC->TextOut(670,y,num);
    //pDC->SelectObject(oldFont);
    //,pageSize,lineSize);
     /* CRect rect;
    GetClientRect(&rect);
    CSize pageSize(rect.right,rect.bottom);
    CSize lineSize(700,logFont.lfHeight);*/
    /* CPoint xx = GetDeviceScrollPosition( );
    pDC->SetViewportOrg(0,xx.y);*/
    pDC->SelectObject(oldFont);
    font.DeleteObject();}
      

  5.   

    滚动以后,y方向已经偏移了另内存泄露很多,我也帮你修改了还有动态计算文字的高度 SIZE size = pDC->GetTextExtent("学");
      

  6.   

    CVCreportDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here pDC->SetMapMode(MM_TEXT);
    LOGFONT logFont1;
    int nheight= pDC->GetDeviceCaps(LOGPIXELSX);
    logFont1.lfHeight = MulDiv(48, nheight, 720);//动态计算字体
    logFont1.lfEscapement = 0;
    logFont1.lfOrientation = 0;
    logFont1.lfWidth = FW_DONTCARE;
    logFont1.lfItalic = 0;
    logFont1.lfUnderline = 0;
    logFont1.lfStrikeOut = 0;
    logFont1.lfCharSet = ANSI_CHARSET;
    logFont1.lfOutPrecision= OUT_DEFAULT_PRECIS;
    logFont1.lfClipPrecision = CLIP_DEFAULT_PRECIS;
    logFont1.lfQuality = PROOF_QUALITY;
    logFont1.lfPitchAndFamily = VARIABLE_PITCH|FF_ROMAN;
    strcpy(logFont1.lfFaceName,"Times New Roman"); LOGFONT logFont;
    logFont.lfHeight = MulDiv(24, nheight, 72);
    logFont.lfEscapement = 0;
    logFont.lfOrientation = 0;
    logFont.lfWidth = FW_DONTCARE;
    logFont.lfItalic = 0;
    logFont.lfUnderline = 0;
    logFont.lfStrikeOut = 0;
    logFont.lfCharSet = ANSI_CHARSET;
    logFont.lfOutPrecision= OUT_DEFAULT_PRECIS;
    logFont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
    logFont.lfQuality = PROOF_QUALITY;
    logFont.lfPitchAndFamily = VARIABLE_PITCH|FF_ROMAN;
    strcpy(logFont.lfFaceName,"Times New Roman"); LOGFONT logFont2;
    logFont2.lfHeight = MulDiv(16, nheight, 72);
    logFont2.lfEscapement = 0;
    logFont2.lfOrientation = 0;
    logFont2.lfWidth = FW_DONTCARE;
    logFont2.lfItalic = 0;
    logFont2.lfUnderline = 0;
    logFont2.lfStrikeOut = 0;
    logFont2.lfCharSet = ANSI_CHARSET;
    logFont2.lfOutPrecision= OUT_DEFAULT_PRECIS;
    logFont2.lfClipPrecision = CLIP_DEFAULT_PRECIS;
    logFont2.lfQuality = PROOF_QUALITY;
    logFont2.lfPitchAndFamily = VARIABLE_PITCH|FF_ROMAN;
    strcpy(logFont2.lfFaceName,"articl"); int y = 0;
    int i = 1;
    int j1 = 35;
    int h = 70;
    int j2 =0;
    m_pageall = h/j1 + 1;
    CString num;
    CFont font;
    font.CreateFontIndirect(&logFont1);
    CFont* oldFont = pDC->SelectObject(&font); y -= GetScrollPos(SB_VERT);
    SIZE size = pDC->GetTextExtent("学");
    CRect rc(0, 0, 0, 0);
    while (j2<h)
    {
    j2 = j1;
    pDC->DrawText("学生成绩", &rc, DT_TOP | DT_SINGLELINE | DT_CALCRECT);
    rc.OffsetRect(20, y);
    pDC->DrawText("学生成绩", &rc, DT_TOP | DT_SINGLELINE);
    // pDC->TextOut(20,y,"学生成绩");
    y += size.cy+1;
    pDC->SelectObject(oldFont);
    if (font.m_hObject)
    font.DeleteObject();
    font.CreateFontIndirect(&logFont);
    pDC->SelectObject(&font); CTime now = CTime::GetCurrentTime();
    CString date = now.Format("打印日期:%B %d %Y");
    pDC->TextOut(20,y,date);
    size = pDC->GetTextExtent("学");
    y += size.cy+2;
    pDC->SelectObject(oldFont);
    font.DeleteObject();
    font.CreateFontIndirect(&logFont2);
    pDC->SelectObject(&font);
    pDC->TextOut(20,y,"学号");
    pDC->TextOut(210,y,"课程代码");
    pDC->TextOut(330,y,"课程名");
    pDC->TextOut(440,y,"教师");
    pDC->TextOut(550,y,"成绩");
    pDC->TextOut(610,y,"基点");
    pDC->TextOut(670,y,"编号");
    size = pDC->GetTextExtent("学");
    y += size.cy+2;

    for(i ;i<=j1&&i<=h; i++)
    {
    num.Format("%d",i);
    pDC->TextOut(20,y,"00000000000000000000");
    pDC->TextOut(210,y,"00000.00");
    pDC->TextOut(330,y,"000000000000");
    pDC->TextOut(440,y,"000000000000");
    pDC->TextOut(550,y,"000000");
    pDC->TextOut(610,y,"000000");
    pDC->TextOut(670,y,num);
    y += size.cy+2;
    }
    y += size.cy+2;
    j1 = j1 +35;
    } y += size.cy+2;
    pDC->SelectObject(oldFont);
    font.DeleteObject();
    font.CreateFontIndirect(&logFont);
    pDC->SelectObject(&font);
    pDC->TextOut(20,y,"总计人数:");
    pDC->TextOut(670,y,num);
    pDC->SelectObject(oldFont);
    font.DeleteObject();
      

  7.   

    另外,你的textout的x方向的大小都要动态计算,自己算吧
    字体的高度要根据dc动态计算