本人想抓文字点阵,但又不想通过在屏幕上显示搞,希望能自己建立一个内存DC,将文字在无声无息中输入到这个看不见的DC里,然后完成所有的抓取工作.
有高人知道怎么弄吗?谢谢了

解决方案 »

  1.   

    CreateCompatibleDC()
    直接画到这个内存位图上就可以了,要显示再blt到你的当前DC上
      

  2.   

    所谓的内存DC实际是这样的
    CDC MemDC;
    CPaintDC dc(this);
    CRect rect;
    GetClientRect(&rect);MemDC.CreateCompatibleDC(&dc);
    ...
    比喻说我要画一些线段
    MemDC.MoveTo(...)
    MemDC.LineTo(...)再写上一段文字
    MemDC.DrawText(...)还要画一个圆
    MemDC.DrawEdge(...)好了,这些工作已经在MemDC(也就是内存DC)中完成了,这里并没有画到设备上来,只是仅仅在内存中画好了.这时我们就可以一次性画到屏上来了
    dc.BitBlt(0, 0, rect.Width(), rect.Height(), &MemDC, 0, 0, SRCCOPY);
    MemDC.DeleteDC();
      

  3.   

    void CXXXView::OnDraw(CDC *pDC){
    CDC memDC;
    CBitmap bmp;
    memDC.CreateCompatibleDC(pDC);
    bmp.CreateCompatibleBitmap(pDC, 100, 100);memDC.SelectObject(&bmp);以下代码为在memDC上绘图操作
      

  4.   

    #ifndef _MEMDC_H_
    #define _MEMDC_H_//////////////////////////////////////////////////
    // CMemDC - memory DC
    //
    // Author: Keith Rule
    // Email:  [email protected]
    // Copyright 1996-1999, Keith Rule
    //
    // You may freely use or modify this code provided this
    // Copyright is included in all derived versions.
    //
    // History - 10/3/97 Fixed scrolling bug.
    //                   Added print support. - KR
    //
    //           11/3/99 Fixed most common complaint. Added
    //                   background color fill. - KR
    //
    //           11/3/99 Added support for mapping modes other than
    //                   MM_TEXT as suggested by Lee Sang Hun. - KR
    //
    // Modified by Mark Malburg  March 12, 1998
    // Email:  [email protected]
    //  (added new construction and clipboard handling)
    //
    // Construction :
    // |
    // | CMemDC pDC (dc, &drawRect, toMemDC) ;
    // |
    // | where:
    // | "dc" - pointer to the CDC that is an argument to OnDraw
    // | "drawRect" - pointer to the rectangle to draw in
    // | "boolToMemory" - TRUE: to the client, FALSE: to clipboard or printer
    // |
    //
    // This class implements a memory Device Context which allows
    // flicker free drawing.class CMemDC : public CDC 
    {
    private:
    CBitmap m_bitmap; // Offscreen bitmap
    CBitmap* m_oldBitmap; // bitmap originally found in CMemDC
    CDC* m_pDC; // Saves CDC passed in constructor
    CRect m_rect; // Rectangle of drawing area.
    BOOL m_bMemDC; // TRUE if CDC really is a Memory DC.
    public:

    CMemDC(CDC* pDC, const CRect* pRect = NULL, bool boolToMemory = TRUE) : CDC()
    {
    ASSERT(pDC != NULL);  // Some initialization
    m_pDC = pDC;
    m_oldBitmap = NULL;
    if (boolToMemory)
    m_bMemDC = !pDC->IsPrinting();
    else
    m_bMemDC = FALSE ; // Get the rectangle to draw
    if (pRect == NULL) 
    {
    pDC->GetClipBox(&m_rect);

    else 
    {
    m_rect = *pRect;
    }

    if (m_bMemDC) 
    {
    // Create a Memory DC
    CreateCompatibleDC(pDC);
    pDC->LPtoDP(&m_rect); m_bitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), m_rect.Height());
    m_oldBitmap = SelectObject(&m_bitmap);

    SetMapMode(pDC->GetMapMode());
    pDC->DPtoLP(&m_rect);
    SetWindowOrg(m_rect.left, m_rect.top);

    else 
    {
    // Make a copy of the relevent parts of the current DC for printing
    if (pDC->IsPrinting())
    m_bPrinting = pDC->m_bPrinting;
    m_hDC       = pDC->m_hDC;
    m_hAttribDC = pDC->m_hAttribDC;
    } // Fill background 
    FillSolidRect(m_rect, pDC->GetBkColor());
    }
    ~CMemDC()
    {
    if (m_bMemDC) 
    {
    // Copy the offscreen bitmap onto the screen.
    m_pDC->BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(),
                this, m_rect.left, m_rect.top, SRCCOPY);

    //Swap back the original bitmap.
    SelectObject(m_oldBitmap);

    else 
    {
    // All we need to do is replace the DC with an illegal value,
    // this keeps us from accidently deleting the handles associated with
    // the CDC that was passed to the constructor.
    m_hDC = m_hAttribDC = NULL;
    }
    }

    // Allow usage as a pointer
    CMemDC* operator->() 
    {
    return this;
    } // Allow usage as a pointer
    operator CMemDC*() 
    {
    return this;
    }
    };#endif
      

  5.   

    还有不解之处!!
    CDC *pdc=GetWindowDC();
    CDC memdc;
    memdc.CreateCompatibleDC(pdc);
    UINT iRet=memdc.SetPixel(0,0,RGB(0x0,0x1,0x2));为什么iRet的返回值是-1呢?
      

  6.   

    iRet=memdc.GetPixel(20,20);
    为何返回值是-1?