其实这个问题应该是CBitmap这个类我不会用……
给定一个位图,比如,星形,然后把窗口弄成位图里的形状,在这里当然就是指星形。这个可以用BitmapToRegion这个函数生成WindowRegion,可是,这个函数生成的窗口区域是位图有多大它也就有多大,如果窗口的大小改变了该怎么办呢?
这个应该就是把一个CBitmap放大的问题。怎么做呢?
还有哦,我想把某个位图备份一下,也就是,用一个CBitmap生成另一个完全一样的CBitmap对象,而这两个东西之间完全没有依赖关系,即便其中一个被析构了另一个也能不受影响。这个又该怎么做呢?
感觉就是CBitmap这个类的问题……
给定一个位图,比如,星形,然后把窗口弄成位图里的形状,在这里当然就是指星形。这个可以用BitmapToRegion这个函数生成WindowRegion,可是,这个函数生成的窗口区域是位图有多大它也就有多大,如果窗口的大小改变了该怎么办呢?
这个应该就是把一个CBitmap放大的问题。怎么做呢?
还有哦,我想把某个位图备份一下,也就是,用一个CBitmap生成另一个完全一样的CBitmap对象,而这两个东西之间完全没有依赖关系,即便其中一个被析构了另一个也能不受影响。这个又该怎么做呢?
感觉就是CBitmap这个类的问题……
static bool fStretchBitmap(CBitmap * src, CBitmap * dest)
实现者给全分。
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);
还有就是你改变了把窗口改成星形之后还能点到将窗口拉伸的边吗?好像我改变了窗口的外形后就点不到了.
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();
大小的CBitmap对象。
bool fStretchBitmap(CBitmap * src, int width, int height, CBitmap *& toReturn)
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;
}
好主意,我怎么就没想过用NULL做参数呢……
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下实现了,但是速度实在是慢,比乌龟还慢...主要是两个循环花太长时间了,在网上查了一下,是有优化方法的,但我水平有限,正在研究中.这个函数只能属于理论上的实现,楼主可以试试看,说不定有启发作用,期待高手早日出现啊.