本人设计了一个象棋程序,棋子用其他的图像处理软件生成,是方形的40X40像素大,半径为20的圆的以内的部分是彩色的,外面是白色的,平时看不出来,但拖动棋子的时候,尤其是在九宫内有斜线的时候,能看出白色的部分,很不好看。所以希望使用时只显示半径为20的圆的大小,将外面的部分屏蔽掉,连白色的也不让它显示,请问可以编程实现吗?
谢谢!

解决方案 »

  1.   

    我的代码如下:
    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;
        };
      

  2.   

    区域用以描述显示器上的一个由矩形、其他多边形和椭圆组合而成的部分、可以用区域进行绘制或裁剪。
    可用:
    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)删除它。
      

  3.   

    你可以在photoshop里面先处理成圆形然后用DrawTransparent这个函数来实现我原来做五子棋的时候就是这样做下面是相应代码 void CWuziView::ReDrawAllChessman(CDC* pDC)
    {
    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);    
     }
    }

    }
      

  4.   

    拖动时也要不断绘制背景透明的“棋子BMP”,而不是直接绘制这张“棋子BMP”
      

  5.   

    两张棋子的图,第一张是正常的(背景用黑,棋子彩色),第二张是黑白的(棋子的部分全黑,背景全白)。第一次bitblt用SRCAND第二张图,这样的结果画出一个黑色的圆。
    第二次bitblt用SRCINVERT第一张图。因为第一张图背景是黑的,所以xor得到的结果是背景不画。
      

  6.   

    我两年前也写过一个象棋程序,不地是用VB写的
    就是按楼上那位所说的处理的楼上那位老兄把我要说的话说了
    好不容易碰到一个我会的,真是顺便问一下楼主,你的象棋程序有AI吗?
    我一直不知道该怎么做AI
      

  7.   

    楼上的能否把你的代码给我一份啊!我出100分,谢谢!
    [email protected]
      

  8.   

    TO: captainchain(cc#船长一路漂着)  
    有AI啊
    当然了
    核心的算法是抄的
    呵呵
    因为那个东西太难理解了
    我现在整个程序都弄完了
    但还是不能准确地自己写一个搜索算法
      

  9.   

    其实vb中只需要两句:form1.PaintPicture picBoxMask.Picture, picBoxChess.Left, picBoxChess.Top, 45, 45, 0, 0, 45, 45, vbSrcAnd
     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上面传。
      

  10.   

    1。用区域;
    2。用掩码位图技术。《windows程序设计》DDB那节说的很清楚的,自己看看。
      

  11.   

    贴段书上的代码:
    /*-------------------------------------------
       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) ;
    }