咋点击Tlabel控件就显示出黑白子的图片呢我用的是c++builder上vcl

应该直接画上去,不要用控件。你先把背景图片放进TBitmap里面,然后每次窗口刷新就可以拿到TCanvas画图。你先标记好每一个坐标在屏幕上的位置(自己用画图程序采集),最后再TCanvas画个圈了事。
所有的这些事情都可以只用一个TForm就完成,干净利落。如果你要避免窗口闪烁的话,你可以把所有的东西都画在内存的一个TBitmap里面,画完了一次性刷窗口上。如果你顺便能找到漂亮的黑白子的图片的话,先确定一个背景颜色(譬如说粉红色),RGB值要稳定,然后用下面这个函数就可以在画图的时候把这个颜色过滤掉。这是从珍藏的高中写的代码里弄出来的,居然还在也是牛逼。
HDC和HBitmap分别是TCanvas和TBitmap的Handle属性。
Procedure DrawTransparent(DstHdc:HDC;SrcHld:HBitmap;X,Y,CopyX,CopyY,CopyWidth,CopyHeight:Integer;TransparentColor:TColor);var cColor:TColorRef; bmAndBack,bmAndObject,bmAndMem,bmSave,bmBackOld,bmObjectOld,bmMemOld,bmSaveOld:HBitmap; hdcMem,hdcBack,hdcObject,hdcTemp,hdcSave:HDC;Begin TransparentColor:=TransparentColor or $02000000; hdcTemp:=CreateCompatibleDC(DstHdc); hdcBack:=CreateCompatibleDC(DstHdc); hdcObject:=CreateCompatibleDC(DstHdc); hdcMem:=CreateCompatibleDC(DstHdc); hdcSave:=CreateCompatibleDC(DstHdc); SelectObject(hdcTemp,srcHld); bmAndBack:=CreateBitmap(CopyWidth,CopyHeight,1,1,nil); bmAndObject:=CreateBitmap(CopyWidth,COpyHeight,1,1,nil); bmAndMem:=CreateCompatibleBitmap(DstHdc,CopyWidth,CopyHeight); bmSave:=CreateCompatibleBitmap(DstHdc,CopyWidth,CopyHeight); bmBackOld:=SelectObject(hdcBack,bmAndBack); bmObjectOld:=SelectObject(hdcObject,bmAndObject); bmMemOld:=SelectObject(hdcMem,bmAndMem); bmSaveOld:=SelectObject(hdcSave,bmSave); SetMapMode(hdcTemp,GetMapMode(dstHdc)); Bitblt(hdcSave,0,0,CopyWidth,CopyHeight,hdcTemp,CopyX,CopyY,SRCCOPY); cColor:=SetBKColor(hdcTemp,TransparentColor); Bitblt(hdcObject,0,0,CopyWidth,CopyHeight,hdcTemp,CopyX,CopyY,SRCCOPY); SetBKColor(hdcTemp,cColor); BitBlt(hdcBack,0,0,CopyWidth,CopyHeight,hdcObject,0,0,NOTSRCCOPY); Bitblt(hdcMem,0,0,CopyWidth,CopyHeight,dstHdc,X,Y,SRCCOPY); BitBlt(hdcMem,0,0,Copywidth,CopyHeight,HdcObject,0,0,SRCAND); BitBlt(hdcTemp,CopyX,CopyY,CopyWidth,CopyHeight,hdcBack,0,0,SRCAND); BitBlt(hdcMem,0,0,CopyWidth,CopyHeight,HdcTemp,CopyX,CopyY,SRCPAINT); BitBlt(dstHdc,X,Y,CopyWidth,CopyHeight,hdcMem,0,0,SRCCOPY); BitBlt(hdcTemp,CopyX,CopyY,CopyWidth,CopyHeight,HdcSave,0,0,SRCCOPY); DeleteObject(SelectObject(hdcBack,bmBackOld)); DeleteObject(SelectObject(hdcObject,bmObjectOld)); DeleteObject(SelectObject(hdcMem,bmMemOld)); DeleteObject(SelectObject(hdcSave,bmSaveOld)); DeleteDC(hdcMem); DeleteDC(hdcBack); DeleteDC(hdcObject); DeleteDC(hdcSave); DeleteDC(hdcTemp);End;
■网友
我们当然都是类似轮子哥的思路去画的,但你的思路也未尝不可。你让我想起97年、98年用delphi去开发棋类游戏的时候。所以,顺着你的思路往下走吧,否则你会被吓跑了。
-----
首先呢,不要用tlabel啊,改成timage(有没有这个控件?能不能响应点击?没有就看看timagebutton)。
点一下就设置image为黑棋或者白棋图片,被吃掉了就设置成空白图片。
-----
但是随即你会发现两个问题。首先,手工把这一大堆361个timagebutton填到窗体里面、并且绑定点击事件太麻烦了,所以你得写循环,动态添加控件。


推荐阅读