目的:想要做到点击标签事件就能使标签后面的图片加载黑白棋子。
问题:在已知Top和Left的情况下不知道如何将标签和其对应的图片联系起来。
代码如下:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "棋盘界面.h"
#include "启动界面.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm4 *Form4;
TShape *Ml[19];//竖线
TShape *Nl[19];//横线
TLabel *Jl[20][20];//棋子Label
TImage *Pl[20][20];//棋子图片
int p=1;//执棋者的身份,黑1,白2
int i;
int j;
//int record=0;//对棋子Name的编号
//---------------------------------------------------------------------------
__fastcall TForm4::TForm4(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm4::Button1Click(TObject *Sender)
{
for(int i=0;i<19;i++)
{
delete Ml[i];
delete Nl[i];
}//收回棋盘划线
for(int i=0;i<20;i++)
{
for(int j=0;j<20;j++)
{
delete Jl[i][j];
delete Pl[20][20];
}
}//收回棋子
Form1->Show();
Form4->Hide();
}
//---------------------------------------------------------------------------
void __fastcall TForm4::FormCreate(TObject *Sender)
{
for(int i=0;i<19;i++)//竖线
{
Ml[i]=new TShape(this->Shape1);
Ml[i]->Left=32+32*(i+1); //竖线的横坐标
Ml[i]->Top=24; //竖线的纵坐标
Ml[i]->Width=1;
Ml[i]->Height=608;
Ml[i]->Parent=Panel1;
Ml[i]->Visible=true;
}
for(int i=0;i<19;i++)//横线
{
Nl[i]=new TShape(this->Shape3);
Nl[i]->Left=32;
Nl[i]->Top=24+32*(i+1);
Nl[i]->Width=608;
Nl[i]->Height=1;
Nl[i]->Parent=Panel1;
Nl[i]->Visible=true;
}
for(int i=0;i<20;i++)//管理棋子行的循环
{
for(int j=0;j<20;j++)//管理棋子列的循环
{
Pl[i][j]=new TImage(this);
Pl[i][j]->Parent=Panel1;
Pl[i][j]->AutoSize=false;
Pl[i][j]->Visible=true;
Pl[i][j]->Transparent=false;
Pl[i][j]->Height=22;
Pl[i][j]->Width=22;
Pl[i][j]->Left=21+32*j;//标签的左坐标
Pl[i][j]->Top=13+32*i;//标签的纵坐标
Pl[i][j]->Tag=21+32*j;//记录标签的左坐标
Pl[i][j]->Hint=IntToStr(13+32*i);//记录标签的纵坐标
//Pl[i][j]->Name="Image'+IntToStr(record+1)'";
}
}
for(int i=0;i<20;i++)//管理行标签的循环
{
for(int j=0;j<20;j++)//管理列标签的循环
{
Jl[i][j]=new TLabel(this->Label2);
Jl[i][j]->Parent=Panel1;
Jl[i][j]->AutoSize=false;
Jl[i][j]->Visible=true;
Jl[i][j]->Transparent=false;
Jl[i][j]->Height=22;
Jl[i][j]->Width=22;
Jl[i][j]->Caption="";
Jl[i][j]->Color=clMaroon;
Jl[i][j]->Cursor=crHandPoint;
Jl[i][j]->Left=21+32*j;//标签的左坐标
Jl[i][j]->Top=13+32*i;//标签的纵坐标
Jl[i][j]->Tag=21+32*j;//记录标签的左坐标
Jl[i][j]->Hint=IntToStr(13+32*i);//记录标签的纵坐标
Jl[i][j]->OnClick=MyEvent;//创建一个关于点击动态标签后的事件
}
}
}
void __fastcall TForm4::MyEvent(TObject *Sender)//解决点击标签然后出现棋子图片的事件
{
}
//---------------------------------------------------------------------------
void __fastcall TForm4::FormClose(TObject *Sender, TCloseAction &Action)
{
Form1->Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm4::FormResize(TObject *Sender)
{
}
//---------------------------------------------------------------------------
目前的效果图是这样的:
可以利用标签的Tag属性来记录该标签对应的图片的位置。在创建图片时,可以将其Tag属性设置为与标签相同,这样就可以通过标签的Tag属性来得到对应的图片控件。在点击标签时,可以根据标签的坐标(Top和Left)和其Tag属性来定位相应的图片控件,并将其加载上黑白棋子的图片即可。
具体实现代码可以参考下面的示例:
void __fastcall TForm4::MyEvent(TObject *Sender)//解决点击标签然后出现棋子图片的事件
{
TLabel *label = dynamic_cast<TLabel*>(Sender); // 获取被点击的标签控件
if (label != NULL)
{
int left = label->Tag; // 获取标签对应的图片控件的Left坐标
int top = StrToInt(label->Hint); // 获取标签对应的图片控件的Top坐标
TImage *image = dynamic_cast<TImage*>(Panel1->ControlAtPos(TPoint(left, top), true)); // 查找标签对应的图片控件
if (image != NULL)
{
// 根据棋手的不同,设置棋子图片并显示
if (p == 1)
image->Picture->LoadFromFile("black.bmp");
else
image->Picture->LoadFromFile("white.bmp");
image->Visible = true;
}
}
}