关于镂空图片的制作问题

riusksk 2010-01-29 07:27:45
我想用C语言来制作出镂空图片,图片如下,我想去掉图中的粉红色。
http://hiphotos.baidu.com/combojiang/pic/item/eeb88d2cc004c2fb8b13993b.jpg
代码虽然编译通过,但图片依然未镂空,不知道错在何处了,望大牛指点一下。
资源中的rgn文件是用老外写的一个工具生成的:http://www.codeproject.com/KB/GDI/rgncreator.aspx,我把它放在资源中来加载。
工程文件已随附牛上传,源代码如下:
#include "windows.h"

/************************************************************/
#define ButtonID 1000
#define RANGE 103
#define IDB_BITMAP1 102
#define PictureW 300
#define PictureH 300

HWND g_hwndButton;
HWND g_hWnd;
HRSRC g_RsrcHand;
HGLOBAL g_RsrcPoint;
DWORD g_RsrcSize;


HINSTANCE g_hInstance;
char ClassName[]="cws_class";
char DisplayName[] = "custom windows shape";
char RsrcType[] = "RGN";
char ButtonClassName[] = "button";
char ButtonText[] = "Click Me!";
char Text[] = "good bye...";

LRESULT CALLBACK WindowProc( HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)

{
PAINTSTRUCT ps;
HDC hdc;
switch(uMsg)
{
case WM_CREATE:
g_RsrcHand = FindResource(g_hInstance,RANGE,RsrcType);
g_RsrcPoint = LoadResource(g_hInstance,g_RsrcHand);
g_RsrcSize = SizeofResource(g_hInstance,g_RsrcHand);
g_RsrcPoint = LockResource(g_RsrcPoint);

SetWindowRgn(hwnd,ExtCreateRegion(NULL,g_RsrcSize,(const struct _RGNDATA *)g_RsrcPoint),TRUE);
g_hwndButton = CreateWindowEx(NULL,ButtonClassName,ButtonText,
WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,
150,185,100,25,hwnd,(HMENU)ButtonID,g_hInstance,NULL);

break;
case WM_COMMAND:
if(LOWORD(wParam) == ButtonID)
{
MessageBox(hwnd,Text,DisplayName,MB_OK);
SendMessage(hwnd,WM_DESTROY,NULL,NULL);
}
break;
case WM_LBUTTONDOWN:
SendMessage(hwnd,WM_NCLBUTTONDOWN,HTCAPTION,lParam);
break;
case WM_DESTROY:
PostQuitMessage(NULL);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
WNDCLASSEX wc;
MSG msg;
g_hInstance = hInstance;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW |CS_BYTEALIGNWINDOW;
wc.lpfnWndProc = WindowProc;
wc.cbClsExtra = NULL;
wc.cbWndExtra = NULL;
wc.hInstance = hInstance;
wc.hbrBackground = CreatePatternBrush(LoadBitmap(hInstance,IDB_BITMAP1));
wc.lpszMenuName = NULL;
wc.lpszClassName = ClassName;

wc.hIcon = NULL;
wc.hCursor = LoadCursor(NULL,IDC_CROSS);
wc.hIconSm = NULL;
RegisterClassEx(&wc);

g_hWnd = CreateWindowEx(WS_EX_LEFT,
ClassName,
DisplayName,
WS_POPUP,
(GetSystemMetrics(SM_CXSCREEN) - PictureW)/2,
(GetSystemMetrics(SM_CYSCREEN) - PictureH)/2,
PictureW,
PictureH,
NULL,
NULL,
hInstance,
NULL
);

ShowWindow(g_hWnd,SW_SHOWNORMAL);
UpdateWindow(g_hWnd);

while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}

...全文
281 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
riusksk 2010-02-02
  • 打赏
  • 举报
回复
去掉粉红色后剩余部分的形状
sjdev 2010-01-31
  • 打赏
  • 举报
回复
是纯粹的把粉红色去掉,还是做个去掉粉红色后剩余部分的形状?
riusksk 2010-01-31
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xsc2001 的回复:]
给你两个函数吧,我都是用这两个函数,还不错……

[/Quote]
函数编译未通过,我创建的是C源文件,而非cpp文件,把上面的CDC、CBitmap那些类改为HDC、HBITMAP也不行,不知道哪位能给个完整的C代码,谢谢
riusksk 2010-01-29
  • 打赏
  • 举报
回复
谢谢xsc2001兄弟,可否直接给个实例代码
xsc2001 2010-01-29
  • 打赏
  • 举报
回复
给你两个函数吧,我都是用这两个函数,还不错。

void SetupRegion(CDC *pDC, CBitmap &cBitmap, COLORREF TransColor)
{
CDC memDC;
//创建与传入DC兼容的临时DC
memDC.CreateCompatibleDC(pDC);

CBitmap *pOldMemBmp=NULL;
//将位图选入临时DC
pOldMemBmp=memDC.SelectObject(&cBitmap);

CRgn wndRgn;
//创建总的窗体区域,初始region为0
wndRgn.CreateRectRgn(0,0,0,0);


BITMAP bit;
cBitmap.GetBitmap (&bit);//取得位图参数,这里要用到位图的长和宽

int y;
for(y=0;y<=bit.bmHeight ;y++)
{
CRgn rgnTemp; //保存临时region

int iX = 0;
do
{
//跳过透明色找到下一个非透明色的点.
while (iX <= bit.bmWidth && memDC.GetPixel(iX, y) == TransColor)
iX++;

//记住这个起始点
int iLeftX = iX;

//寻找下个透明色的点
while (iX <= bit.bmWidth && memDC.GetPixel(iX, y) != TransColor)
++iX;

//创建一个包含起点与重点间高为1像素的临时“region”
rgnTemp.CreateRectRgn(iLeftX, y, iX, y+1);

//合并到主"region".
wndRgn.CombineRgn(&wndRgn, &rgnTemp, RGN_OR);

//删除临时"region",否则下次创建时和出错
rgnTemp.DeleteObject();
}while(iX <bit.bmWidth );
iX = 0;
}

if(pOldMemBmp)
memDC.SelectObject(pOldMemBmp);

CWnd * pWnd = pDC->GetWindow();
pWnd->SetWindowRgn(wndRgn,TRUE);
pWnd->SetForegroundWindow();

}

void SetupCoverRegion(CDC *pDC, CBitmap &cBitmap, COLORREF TransColor)
{
CDC memDC;
//创建与传入DC兼容的临时DC
memDC.CreateCompatibleDC(pDC);

CBitmap *pOldMemBmp=NULL;
//将位图选入临时DC
pOldMemBmp=memDC.SelectObject(&cBitmap);

CRgn wndRgn;
//创建总的窗体区域,初始region为0
wndRgn.CreateRectRgn(0,0,0,0);


BITMAP bit;
cBitmap.GetBitmap (&bit);//取得位图参数,这里要用到位图的长和宽

int y;
for(y=0;y<=bit.bmHeight ;y++)
{
CRgn rgnTemp; //保存临时region

int iX = 0;
do
{
//跳过透明色找到下一个非透明色的点.
while (iX <= bit.bmWidth && memDC.GetPixel(iX, y) == TransColor)
iX++;

//记住这个起始点
int iLeftX = iX;

//寻找下个透明色的点
if(iX > 10 && iX < bit.bmWidth - 60 && y <= bit.bmHeight - 15)
iX = bit.bmWidth - 60;
while (iX <= bit.bmWidth && memDC.GetPixel(iX, y) != TransColor)
++iX;

//创建一个包含起点与重点间高为1像素的临时“region”
rgnTemp.CreateRectRgn(iLeftX, y, iX, y+1);

//合并到主"region".
wndRgn.CombineRgn(&wndRgn, &rgnTemp, RGN_OR);

//删除临时"region",否则下次创建时和出错
rgnTemp.DeleteObject();
}while(iX <bit.bmWidth );
iX = 0;
}

if(pOldMemBmp)
memDC.SelectObject(pOldMemBmp);

CWnd * pWnd = pDC->GetWindow();

int iSize = wndRgn.GetRegionData(NULL, sizeof(RGNDATA));
RGNDATA* pData = (RGNDATA*)calloc(iSize, 1);
pData->rdh.dwSize = iSize;
int iSize2 = wndRgn.GetRegionData(pData, iSize);


FILE *f;
f = fopen("e:\\abc.rgn", "wb");
fwrite(pData, sizeof(BYTE), iSize, f);
fclose(f);
free(pData);

pWnd->SetWindowRgn(wndRgn,TRUE);
pWnd->SetForegroundWindow();
}
riusksk 2010-01-29
  • 打赏
  • 举报
回复
附件下载地址:http://d.download.csdn.net/down/2033735/riusksk
riusksk 2010-01-29
  • 打赏
  • 举报
回复
不知道如何上传附件啊

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧