象棋百科全书有一个开发教程。
象棋小巫师里面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);
这个关联的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);
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);
BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCPAINT);