电脑象棋开发-vc界面图形绘制

象棋百科全书有一个开发教程。

象棋小巫师里面vc图形绘制介绍:

1. 所有图形通过添加资源的方式加到项目中

2. 调用LoadResBmp加载资源

3. 绘制的基本方式是:

    hdcTmp = CreateCompatibleDC(hdc)

    SelectObject(hdcTmp, hBitmap); // hBitmap是通过LoadResBmp加载的资源

    BitBlt(hdc, 0, 0, width, height, hdcTmp, 0, 0, SRCCOPY);

    DeleteDC(hdcTmp);

4. 透明区域绘制 这是最重要的,在象棋小巫师代码中位于函数TransparentBlt2

在棋盘上画棋子步骤是这样的:

4.1 首先将棋子图片绘制到一个中间DC上:

hImageBMP = CreateCompatibleBitmap(hdcDest, nWidthDest, nHeightDest);
hImageDC = CreateCompatibleDC(hdcDest);
hOldImageBMP = (HBITMAP) SelectObject(hImageDC, hImageBMP);
BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest,
        hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY);

4.2 创建hMaskDC,相关联的Bitmap为hMaskBMP = CreateBitmap(width, height, 1, 1, NULL)

这个关联的Bitmap创建的时候第4个参数cBitsPerPel为1,说明每个像素用1位表示,即只有黑白

这个过程完了以后hMaskDC的中间是黑的圆(0),周围是白色(1)

hMaskBMP = CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL);
hMaskDC = CreateCompatibleDC(hdcDest);
hOldMaskBMP = (HBITMAP) SelectObject(hMaskDC, hMaskBMP);

SetBkColor(hImageDC, crTransparent);
BitBlt(hMaskDC, 0, 0, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCCOPY);

4.3 将这个mask绘制到棋盘上,作用效果相当于给棋盘打孔:有棋子的地方是黑圈

SRCAND这个标志绘制,对于hMaskDC上的1,则原始图像不变,对于hMaskDC上的0,则设置原始图像像素点值为0

BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest,
      hMaskDC, 0, 0, SRCAND);

4.4 接下来是在棋盘打洞的位置绘制正确的棋子,对前面创建的hImageDC要做一些处理,4.3步对棋盘有棋子的地方打了洞,这一步则希望将hImageDC绘制成周围全黑的棋子

这样就可以用SRCPAINT标志绘制。

下面操作将棋子周围原始透明色绘制成黑色:

SetBkColor(hImageDC, RGB(0,0,0));
SetTextColor(hImageDC, RGB(255,255,255));
BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);

4.5 绘制

BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest,
      hImageDC, 0, 0, SRCPAINT);

4.6 最后删除创建的中间DC和object



你可能感兴趣的:(电脑象棋开发-vc界面图形绘制)