posts - 23,  comments - 20,  trackbacks - 0
少了硬编码  代码确实好看了很多...
上个例子... 滚动视图部分的
修改前的代码
void CTransportWnd::OnPaint()
{    
    CPaintDC dc(
this);
    
    m_tooltip.RemoveAllTools();    
//清空所有标记

    CRect rect;    
    GetClientRect(rect);    
    DocToClient(rect);
    HDC dcMem;
    HBITMAP bm;

    bm 
= CreateCompatibleBitmap(dc.m_hDC, rect.Width(), rect.Height());
    dcMem 
= CreateCompatibleDC(dc);
    SelectObject(dcMem, bm);

    
//////////////////////////
    Graphics graphics(dcMem);    
    graphics.SetSmoothingMode(SmoothingModeHighQuality);

    
// background
    graphics.FillRectangle(&SolidBrush(Color(255255255255)), rect.left, rect.top, rect.Width(), rect.Height());

    
// concrete flow
    DrawAllPlaces(graphics, rect);

    BitBlt(dc, 
00, rect.Width(), rect.Height(), dcMem, 00, SRCCOPY);

    DeleteObject(bm);
    DeleteDC(dcMem);

    
//更改滚动条
    GetClientRect(&rect);
    
int iCount = m_vecPlaces.size();
    
int iTotalHeight = (iCount / 2* (FLOW_HEIGHT+10);
    SetScrollSizes( MM_LOENGLISH, CSize(rect.Width() 
- 20, iTotalHeight) );
}

修改过后的代码
void CWorksiteWnd::OnDraw(CDC* pDC)
{
    
// TODO: 在此处为本机数据添加绘制代码
    m_tooTip.RemoveAllTools();    //清空所有标记

    CRect rect;    
    GetClientRect(rect);        

    
//绘图
    Graphics graphics( pDC->m_hDC );
    DrawAllPlaces(graphics, rect);

    
//更新滚动条
    GetClientRect(&rect);
    
int iCount = m_vecPlaces.size();
    
int iTotalHeight = iCount  * (FLOW_HEIGHT+10+ 20;
    SetScrollSizes( MM_TEXT, CSize(rect.Width() 
- 20, iTotalHeight) );    
}
单单抛开双缓冲不说   那个DocToClient这个函数简直是丑陋无比 而且是设备相关的(换了分辨率就变样了...)

void CTransportWnd::DocToClient(CRect& rect)
{    
    CClientDC dc(
this);
    OnPrepareDC(
&dc, NULL);
    dc.LPtoDP(rect);
    rect.NormalizeRect();
    
//rect.bottom += 5000;
    
//rect.top -= 198;
}
代码的丑陋可能现在还看不出来...在上一段小小的代码  后面画图部分的

void CTransportWnd::DrawAllPlaces(Graphics& graphics, CRect rect)
{
    
//rect.top += 188;
    CRect rectTemp;
    GetClientRect(
&rectTemp);
    rect.top 
+= rectTemp.bottom;
    
//rect.top = 0;
    vector<PLACE_STATION*>::iterator it = m_vecPlaces.begin();
简直就是war3里面的憎恶...  用肉缝起来的代码  后面还有大量的
CPoint pointScorll = GetScrollPosition();
            rectTemp.bottom 
+= pointScorll.y;
            rectTemp.top 
+= pointScorll.y; 
哎  今天花了一早上更改代码   现在的代码看着要舒服多了  还是听感谢侯捷的<深入浅出MFC>  昨晚无意间翻到的CScorllView这一节  一下就看明白代码的设备相关性的问题出在哪了...   看来还是要时不时翻翻书

posted on 2009-11-09 14:42 李佳 阅读(386) 评论(0)  编辑 收藏 引用 所属分类: WIN32 应用开发

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2009年11月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

常用链接

留言簿

随笔分类

随笔档案

文章档案

相册

搜索

  •  

最新评论

阅读排行榜

评论排行榜