我觉得在OnDraw()中设置也是可以的吧

解决方案 »

  1.   

    可以在 CMainFrame::PreCreateWindow函数里吧
    还有InitInstance函数里也行
      

  2.   

    在OnPrepareDC中设置,因为每次DC构造好之后都要调用该功能
      

  3.   

    这引发我想起一个问题,在win32编程中,需要hdc=BeginPaint(hWnd,&ps);
    相信大家都记得的吧,如果你SelectObject(hdc,hMyBrush);
    以后,不用原来的Brush替换就结束的话,下次画的时候不执行SelectObject,就不会再使用你的这个hMyBrush。
    这是不是说明我的操作在hdc句柄释放以后就失效了呢?
    根据我的理解,dc这个gdi对象是和我的窗口同时存在的,只是要通过hdc访问,但为什么我的修改会失效呢?
    它的机理到底是怎么样的?
    回答问题的朋友我会另外加分的,谢了。
      

  4.   

    void CEMapView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo) 
    {
    // TODO: Add your specialized code here and/or call the base class
    CScrollView::OnPrepareDC(pDC, pInfo);
    CEMapDoc* pDoc = GetDocument();
    CSize sizeDoc = pDoc->GetSize();
    CPoint ptOrg;
    CRect rectClient;
    GetClientRect(&rectClient);
    pDC->DPtoLP(&rectClient);
    ptOrg.x = min(-sizeDoc.cx / 2,-rectClient.Size().cx/2);
    ptOrg.y = max(sizeDoc.cy / 2,-rectClient.Size().cy/2);
    // ptOrg is in logical coordinates
    pDC->SetWindowOrg(ptOrg);
    }
      

  5.   

    看了msdn终于明白了我上面说的问题,dc还分为Common Dc 和Private DC,我们一般使用的前一种,dc是在返回句柄前由System以Default Object构建的,所以必须在每次显示前都进行设定。
    结论是在OnPrepareDC()或者OnDraw()中都可以。
      

  6.   

    void CView::OnPaint()
    {
    // standard paint routine
    CPaintDC dc(this);
    OnPrepareDC(&dc);
    OnDraw(&dc);
    }