switch (message) { case WM_CREATE: hInstance = ((LPCREATESTRUCT) lParam)->hInstance ; // Load the original image and get its size hBitmapImag = LoadBitmap (hInstance, TEXT ("Matthew")) ; GetObject (hBitmapImag, sizeof (BITMAP), &bitmap) ; cxBitmap = bitmap.bmWidth ; cyBitmap = bitmap.bmHeight ; // Select the original image into a memory DC hdcMemImag = CreateCompatibleDC (NULL) ; SelectObject (hdcMemImag, hBitmapImag) ; // Create the monochrome mask bitmap and memory DC hBitmapMask = CreateBitmap (cxBitmap, cyBitmap, 1, 1, NULL) ; hdcMemMask = CreateCompatibleDC (NULL) ; SelectObject (hdcMemMask, hBitmapMask) ; // Color the mask bitmap black with a white ellipse
m_Chessman.Create(36, 36, ILC_COLOR24, 0, 14);//棋子对象
for ( int ii=0; ii<14; ii++)
{
CBitmap * pBitmap = new CBitmap();
pBitmap->LoadBitmap(IDB_BITMAP1+ii);
m_Chessman.Add(pBitmap, COLORREF(RGB(0,0,0)));
delete pBitmap;
};
可用:
hRgn=CreateRgn(xLeft,yTop,xRight,yBottom);
或
hRgn = CreateRectRgnIndirect (&rect );
来建立矩形区域,也可以用:
hRgn= CreatEllipseRgn (xLeft,yTop,xRight,yBOttom);
或:
hRgn =CreateEllipseRgnIndirect (&rect);
来建立椭圆形区域;还可以用:
hRgn=CreatePolygonRgn (Upoint,nCount,nPolyFillMode);
来建立多边形区域,用:
hRgn=CreateRoundRectRgn(xl,yl,x2,y2,x3,y3);
来建立一个带有圆角的矩形区域,(xl,y1)表示区域左上角,(x2,y2)表示区域右下角,x3和y3分别用于指定产生圆角的椭圆的宽度和高度。
各个特定区域的句柄产生之后,
还可以使用:
nRgnType= CombineRgn (hDestRgn,hSrcRgnl,hSrcRgn2,nCombine);
通过组合两个已存在区域而产生一个新的区域。组合区域的方法由nCombine参数加以说明:
这里的hSrcRgnl和hSrcRgn2标识两个已存在的区域,hDestRgn标识将被新区域替换的作为目标的已存在区域。
一个区域用完后,可用DeleteObject(hRgn)删除它。
{
CCISBitmap m_BitmapBLACK,m_BitmapWHITE;
m_BitmapBLACK.LoadBitmap(IDB_BITMAPBLACK);
m_BitmapWHITE.LoadBitmap(IDB_BITMAPWHITE);
int height,width,totalnum,m;
height = m_BitmapBLACK.Height()/2;
width = m_BitmapBLACK.Width()/2;
CWuziDoc* pDoc = GetDocument();
Coordinate gethead;
int xcoor,ycoor; ASSERT_VALID(pDoc);
pDC=GetDC(); if (!pDoc->MyList.IsEmpty()) //判断链表是否为空
{
totalnum=pDoc->MyList.GetCount(); //得到链表元素个数 for(m=0; m<totalnum; m++)
{
gethead=pDoc->MyList.GetHead(); //读出链表头,赋给gethead
xcoor=gethead.xCoordinate;
ycoor=gethead.yCoordinate;
if(m%2==0)
{
m_BitmapBLACK.DrawTransparent(pDC,((xcoor+1)*20+15-height),((ycoor+1)*20+10-width),RGB(236,184,100));
}
else
{
m_BitmapWHITE.DrawTransparent(pDC,((xcoor+1)*20+15-height),((ycoor+1)*20+10-width),RGB(236,184,100));
}
pDoc->MyList.RemoveHead();
pDoc->MyList.AddTail(gethead);
}
}
}
第二次bitblt用SRCINVERT第一张图。因为第一张图背景是黑的,所以xor得到的结果是背景不画。
就是按楼上那位所说的处理的楼上那位老兄把我要说的话说了
好不容易碰到一个我会的,真是顺便问一下楼主,你的象棋程序有AI吗?
我一直不知道该怎么做AI
[email protected]
有AI啊
当然了
核心的算法是抄的
呵呵
因为那个东西太难理解了
我现在整个程序都弄完了
但还是不能准确地自己写一个搜索算法
form1.PaintPicture picBoxChess.Picture,picBoxChess.Left, picBoxChess.Top, 45, 45, 0, 0, 45, 45, vbSrcPaintform1为棋盘
picBoxMask为棋子的掩模
picBoxChess为棋子mask.picture为一掩模,即一矩形,中间是一个黑色的圆,四周是白色
首先,将掩模图象复制到form1的指定位置,为一矩形
黑色圆与棋盘上的颜色进行"and"运算,得出的结果为黑色圆,棋盘上出现一个黑色的圆
白色的边框与棋盘上的颜色进行"and"运算,得出的结果还是棋盘上的颜色
这是第一个语句的作用。然后,将棋子图象复制到form1的那个位置,也为一矩形
棋子的图象与第一步得出的黑色圆形区域进行"or"运算,结果还是棋子的图象
棋子的黑色边框与第一步得出的棋盘图象进行"or"运算,结果得到棋盘的图象
这是第二句的作用,即把棋子图象复制到棋盘上去。paintpicture方法的作用是将源图象复制到目标图象中
paintpicture的语法为:
object.paintpicture picture,x1,y1,width1,height1,x2,y2,width2,height2
,opcode其中object可以为form,picturebox等,即目标图象
picture为源图象,我用的是mask.picture(mask是一个picuturbox)x1,y1为被复制的图象在目标图象中的坐标
width1,height1指示源图象被复制到目标图象后的大小 x2,y2为源图象中哪个坐标的点开始剪贴
width2,height2表示剪贴区的大小paintpicture方法中有一个位操作符"OpCode",我上面用了两种位操作"vbSrcAnd",
"vbSrcPaint",前者是"and"运算,后者是"or"运算。
没有图片不大好讲清楚,如果要把所有工程文件发给你的话,太大了(4.xxM),我的邮箱没那么
大的附件,不如在QQ上面传。
2。用掩码位图技术。《windows程序设计》DDB那节说的很清楚的,自己看看。
/*-------------------------------------------
BITMASK.C -- Bitmap Masking Demonstration
(c) Charles Petzold, 1998
-------------------------------------------*/#include <windows.h>LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName [] = TEXT ("BitMask") ;
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (LTGRAY_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;
if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
hwnd = CreateWindow (szAppName, TEXT ("Bitmap Masking Demo"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL) ; ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ; while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HBITMAP hBitmapImag, hBitmapMask ;
static HINSTANCE hInstance ;
static int cxClient, cyClient, cxBitmap, cyBitmap ;
BITMAP bitmap ;
HDC hdc, hdcMemImag, hdcMemMask ;
int x, y ;
PAINTSTRUCT ps ;
switch (message)
{
case WM_CREATE:
hInstance = ((LPCREATESTRUCT) lParam)->hInstance ; // Load the original image and get its size hBitmapImag = LoadBitmap (hInstance, TEXT ("Matthew")) ;
GetObject (hBitmapImag, sizeof (BITMAP), &bitmap) ;
cxBitmap = bitmap.bmWidth ;
cyBitmap = bitmap.bmHeight ; // Select the original image into a memory DC hdcMemImag = CreateCompatibleDC (NULL) ;
SelectObject (hdcMemImag, hBitmapImag) ; // Create the monochrome mask bitmap and memory DC hBitmapMask = CreateBitmap (cxBitmap, cyBitmap, 1, 1, NULL) ;
hdcMemMask = CreateCompatibleDC (NULL) ;
SelectObject (hdcMemMask, hBitmapMask) ; // Color the mask bitmap black with a white ellipse
SelectObject (hdcMemMask, GetStockObject (BLACK_BRUSH)) ;
Rectangle (hdcMemMask, 0, 0, cxBitmap, cyBitmap) ;
SelectObject (hdcMemMask, GetStockObject (WHITE_BRUSH)) ;
Ellipse (hdcMemMask, 0, 0, cxBitmap, cyBitmap) ; // Mask the original image BitBlt (hdcMemImag, 0, 0, cxBitmap, cyBitmap,
hdcMemMask, 0, 0, SRCAND) ; DeleteDC (hdcMemImag) ;
DeleteDC (hdcMemMask) ;
return 0 ; case WM_SIZE:
cxClient = LOWORD (lParam) ;
cyClient = HIWORD (lParam) ;
return 0 ; case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ; // Select bitmaps into memory DCs hdcMemImag = CreateCompatibleDC (hdc) ;
SelectObject (hdcMemImag, hBitmapImag) ; hdcMemMask = CreateCompatibleDC (hdc) ;
SelectObject (hdcMemMask, hBitmapMask) ; // Center image x = (cxClient - cxBitmap) / 2 ;
y = (cyClient - cyBitmap) / 2 ;
// Do the bitblts BitBlt (hdc, x, y, cxBitmap, cyBitmap, hdcMemMask, 0, 0, 0x220326) ;
BitBlt (hdc, x, y, cxBitmap, cyBitmap, hdcMemImag, 0, 0, SRCPAINT) ; DeleteDC (hdcMemImag) ;
DeleteDC (hdcMemMask) ;
EndPaint (hwnd, &ps) ;
return 0 ; case WM_DESTROY:
DeleteObject (hBitmapImag) ;
DeleteObject (hBitmapMask) ;
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}