咋点击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填到窗体里面、并且绑定点击事件太麻烦了,所以你得写循环,动态添加控件。
推荐阅读
- 为啥大部分线上活动的奖励需要点击领取
- 电商网站支付流程的流失率是怎么样的从用户点击充值/支付按钮,到支付完成,其中每一步的流失比率都是咋样的
- 客栈通PMS咋操作和携程账号直连
- 百度统计是否有统计页面上某个按钮被点击次数的功能
- 想问下大家,关于前些日子莆田系和百度掐架的事,说有些词点击一次竟然达到999元,很好奇这是啥词
- 北京人人公益网咋样现在外面传的很火
- CPM 点击率(CTR)、损失率 和 LandingPage 的跳出率,这几个数值之间关系,一般网站这些数值取值区间是多少
- 旅游类App里,想知道穷游app的第三个tab社区的点击量是多少~穷游的日活现在有多少
- 怎样在chrome里双击关闭标签和左键点击书签在新标签页打开
- 为啥产品经理喜欢在Android上用iOS的控件
