其实这个问题应该是CBitmap这个类我不会用……
给定一个位图,比如,星形,然后把窗口弄成位图里的形状,在这里当然就是指星形。这个可以用BitmapToRegion这个函数生成WindowRegion,可是,这个函数生成的窗口区域是位图有多大它也就有多大,如果窗口的大小改变了该怎么办呢?
这个应该就是把一个CBitmap放大的问题。怎么做呢?
还有哦,我想把某个位图备份一下,也就是,用一个CBitmap生成另一个完全一样的CBitmap对象,而这两个东西之间完全没有依赖关系,即便其中一个被析构了另一个也能不受影响。这个又该怎么做呢?
感觉就是CBitmap这个类的问题……

解决方案 »

  1.   

    一般作异型窗口都是固定大小或者部分固定尺寸,就是为了简单;位图缩放也有成熟的算法的,搜索一下很多,也可以就用StretchBlt。
      

  2.   

    呃……不会,就是用bitblt好像可以进行位图复制的,可是我不会。能给个代码吗?我也好结帖给分……
      

  3.   

    还有哦,这个不仅仅是位图缩放的问题,如果是在窗口上缩放倒还好说,可是现在我都不知道该创建什么DC,CWindowDC? CClientDC? CPaintDC? CMetaFileDC? CDC?都不对。如果一个位图离开了DC要怎么处理呢?我可不想去自己实现什么图形算法,有没有用MFC里现有的函数来实现的呢?
    static bool fStretchBitmap(CBitmap * src, CBitmap * dest)
    实现者给全分。
      

  4.   

    在OnDraw()中处理:
              CImage img;
    img.Load(TEXT("XXX.jpg")); CBitmap bmp;
    bmp.Attach(img.Detach());
    BITMAP bmpInfo;
    bmp.GetBitmap(&bmpInfo);
    CDC dcMemory;
    dcMemory.CreateCompatibleDC(pDC);
    CBitmap* pOldBitmap = dcMemory.SelectObject(&bmp);
    CRect rect;
    GetClientRect(&rect);
             pDC->StretchBlt(0,0,rect.Width(),rect.Height (),&dcMemory,0,0,bmpInfo.bmWidth,bmpInfo.bmHeight,SRCCOPY);
             dcMemory.SelectObject(pOldBitmap);
      

  5.   

    但是这样位图是放大了并画在那个DC里了,那这个放大的位图要怎么取出来呢?不是要把这个位图画出来,如果是这样很简单的,就是不知道怎么把画在某个DC里的位图给保存成CBitmap。
      

  6.   

    初学者,不太明白,想问一下搂主,BitmapToRegion这个函数是那里来的啊?我查MSDN怎么查不到?
    还有就是你改变了把窗口改成星形之后还能点到将窗口拉伸的边吗?好像我改变了窗口的外形后就点不到了.
      

  7.   

    抓屏并保存成Bitmap,下面是相关代码。
    CDC dcScreen;
    VERIFY(dcScreen.CreateDC("DISPLAY", NULL, NULL, NULL)); 
    //创建内存设备上下文
    CDC dcCompatible;
    VERIFY(dcCompatible.CreateCompatibleDC(&dcScreen));  
    //创建跟屏幕兼容的bitmap对象
    CBitmap bmpScreen;
    VERIFY(bmpScreen.CreateCompatibleBitmap(&dcScreen,
    dcScreen.GetDeviceCaps(HORZRES), 
        dcScreen.GetDeviceCaps(VERTRES))); 
    //将bitmaps选入兼容的内存设备对象中 
    CBitmap* pOldBmp = NULL;
    pOldBmp = dcCompatible.SelectObject(&bmpScreen);
    //隐藏主窗口
    //AfxGetApp()->m_pMainWnd->ShowWindow(SW_HIDE);
    //抓取屏幕
    BITMAP bmpInfo;
    VERIFY(bmpScreen.GetBitmap(&bmpInfo));
    VERIFY(dcCompatible.BitBlt( 
                   0,0, 
                   bmpInfo.bmWidth,bmpInfo.bmHeight,    
                   &dcScreen, 
                   0,0, 
                   SRCCOPY)); 
         //重新绘制主窗口
     AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOW);
     //显示在当前视图中
     //获得当前视图关联的CDC指针
     CDC* pDC = GetDC();
     CRect rect;  
     GetClientRect(&rect);  
     CSize size = rect.Size();
     pDC->StretchBlt(0,0,size.cx,size.cy,
     &dcCompatible,
     0,0,
     bmpInfo.bmWidth,bmpInfo.bmHeight,
     SRCCOPY);
    //恢复
     dcCompatible.SelectObject(pOldBmp);
     CImage img;
     img.Attach(bmpScreen);
     img.Save("screen.bmp");
     img.Detach();
      

  8.   

    没人有办法吗?那,换个简单点的问法,给一个CBitmap对象,要求用MFC已有的函数,获得一个指定
    大小的CBitmap对象。
    bool fStretchBitmap(CBitmap * src, int width, int height, CBitmap *& toReturn)
      

  9.   

    试试
    HBITMAP GetSizeBITMAP(HBITMAP hBitmap, int w, int h)
    {
    CDC sourceDC, destDC;
    sourceDC.CreateCompatibleDC( NULL );
    destDC.CreateCompatibleDC( NULL );
    BITMAP bm;
    ::GetObject( hBitmap, sizeof( bm ), &bm );
    HBITMAP hbmResult = ::CreateCompatibleBitmap(CClientDC(NULL), w, h);
    HBITMAP hbmOldSource = (HBITMAP)::SelectObject( sourceDC.m_hDC, hBitmap );
    HBITMAP hbmOldDest = (HBITMAP)::SelectObject( destDC.m_hDC, hbmResult );
    destDC.BitBlt(0, 0, w, h, &sourceDC, 0, 0, SRCCOPY );
    ::SelectObject( sourceDC.m_hDC, hbmOldSource );
    ::SelectObject( destDC.m_hDC, hbmOldDest );
    return hbmResult;
    }
      

  10.   

    CreateCompatibleDC( NULL )
    好主意,我怎么就没想过用NULL做参数呢……
      

  11.   

    写了个函数:
    BOOL ChangeShape(HBITMAP hBitmap, HWND hWnd, 
    int iWidth, int iHeight, COLORREF cTransparentColor)
    {
    HDC hdcTemp = NULL;
    hdcTemp = CreateCompatibleDC(NULL);
    SelectObject(hdcTemp, hBitmap); HDC hdcMem = NULL;
    hdcMem = CreateCompatibleDC(NULL);
    HBITMAP hBmpTemp = NULL;
    hBmpTemp = CreateCompatibleBitmap(hdcTemp, iWidth, iHeight);
    SelectObject(hdcMem, hBmpTemp);
    DeleteObject(hBmpTemp); BITMAP bmInfo;
    GetObject(hBitmap, sizeof(BITMAP), &bmInfo);
    StretchBlt(hdcMem, 0, 0, iWidth, iHeight, 
    hdcTemp, 0, 0, bmInfo.bmWidth, bmInfo.bmHeight, SRCCOPY); DeleteDC(hdcTemp); HRGN hRgn_1 = NULL;
    HRGN hRgn_2 = NULL;
    hRgn_1 = CreateRectRgn(0, 0, iWidth, iHeight); int iTempX,iTempY; for (iTempY=0; iTempY < iHeight; iTempY++)
    {
    for (iTempX=0; iTempX < iWidth; iTempX++)
    {
    if (GetPixel(hdcMem, iTempX, iTempY) == cTransparentColor)
    {
    hRgn_2 = CreateRectRgn(iTempX, iTempY, iTempX+1, iTempY+1);
    CombineRgn(hRgn_1, hRgn_1, hRgn_2, RGN_XOR);
    DeleteObject(hRgn_2);
    }
    }
    } SetWindowRgn(hWnd, hRgn_1, TRUE);

    DeleteObject(hRgn_1);
    DeleteDC(hdcMem); return TRUE;
    }    放在WM_SIZE下实现了,但是速度实在是慢,比乌龟还慢...主要是两个循环花太长时间了,在网上查了一下,是有优化方法的,但我水平有限,正在研究中.这个函数只能属于理论上的实现,楼主可以试试看,说不定有启发作用,期待高手早日出现啊.