📄 editform2.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "EditForm2.h"
#include "MainForm1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TEditForm *EditForm;
//---------------------------------------------------------------------------
__fastcall TEditForm::TEditForm(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
/*
在EditForm还没有显示之前进行一些操作,就需要重载Loaded()函数。
具体做法是:
首先,调用基类的Loaded()函数,以保证基类的动作被继承。然后,
设置Form的一些属性,SetBounds()设置窗体的边框大小。
*/
void __fastcall TEditForm::Loaded()
{
TForm::Loaded();
Visible = false;
Position = poDefault;
BorderIcons = TBorderIcons();
BorderStyle = bsNone;
Ctl3D =false;
Color=clMenu;
HandleNeeded();
int X = MainForm->Width/2;
int Y = 0;
int H = MainForm->Height;
int W = MainForm->Width/2;
SetBounds(X,Y,W,H);
}
//---------------------------------------------------------------------------
/*
当VCL要构造元件的窗口类时,就会调用CreateParams()函数。
CreateParams()函数声明如下:
virtual void __fastcall CreateParams(TCreateParams& Params);
唯一的参数是一个 TCreateParams结构。TCreateParams声明如下:
struct TCreateParams
{
char *Caption;
int Style;
int ExStyle;
int X;
int Y;
int Width;
int Height;
HWND WndParent;
void *Param;
tagWNDCLASSA WindowClass();
char WinClassName[64];
};
大多数情况下需要重载CreateParams()函数,以便改变元件的窗口风格。
具体做法是:
首先,调用基类的CreateParams()函数,以便继承默认的行为。然后,
在原有的窗口风格基础上加上WS_CHILD | WS_CLIPSIBLINGS。
*/
void __fastcall TEditForm::CreateParams(TCreateParams& Params)
{
TForm::CreateParams(Params);
TForm* owner = dynamic_cast<TForm*>(Owner);
Params.WndParent = owner->Handle;
Params.Style = WS_CHILD | WS_CLIPSIBLINGS;
Params.X = 0;
Params.Y = 0;
EditBarRect.right = (SQUARE_SIZE*2) + 6;
EditBarRect.bottom = (SQUARE_SIZE * 7) + 6;
EditBarRect.left = EditBarRect.top = 0;
EditRect.right = MainForm->ClientWidth/2;
EditRect.bottom = MainForm->ClientHeight;
EditRect.left = EditRect.top = 0;
SelectedItem = 0;
}
//---------------------------------------------------------------------------
/*
设置编辑窗体背景
采用文件方式载入位图。
对于位图没有保存在资源文件(.res)内,C++ Builder不能把从文件装入的位图
连接入最后的可执行文件。因此,必须确保在c:\BcbChess下有必需的位图文件。
很明显,使用VCL函数比原始的API函数要方便得多。
使用后,应将Canvas->Brush->Bitmap这个特性设为NULL,以释放位图。
如果不删除位图,将导致程序内存不足。
*/
void TEditForm::SetEditWindowBk()
{
Graphics::TBitmap *BLKBrushBmp = new Graphics::TBitmap();
BLKBrushBmp->LoadFromFile("BKBrush.bmp");
//BLKBrushBmp->LoadFromFile("c:\\BcbChess\\BKBrush.bmp");
EditForm->Canvas->Brush->Bitmap=BLKBrushBmp;
EditForm->Canvas->FillRect(EditForm->GetClientRect());
EditForm->Canvas->Brush->Bitmap=NULL;
delete BLKBrushBmp;
}
//---------------------------------------------------------------------------
/*
编辑窗体重画函数
包括对位图进行正常或反相显示,编辑窗体背景用位图填充。
注意,由于位图采用文件方式载入,不能链接入可执行文件中,
请确保c:\BcbChess下有需要的位图文件。
*/
void __fastcall TEditForm::FormPaint(TObject *Sender)
{
int i;
BITMAP Bitmap;
HBITMAP hBitmap, hOldBmp, hMaskBmp;
SetEditWindowBk();
HDC hDC= GetDC(EditForm->Handle);
DrawFrame(hDC, EditBarRect, true);
ReleaseDC(EditForm->Handle, hDC);
hDC = GetDC(EditForm->Handle);
DrawFrame(hDC, EditRect);
ReleaseDC(EditForm->Handle, hDC);
hDC= GetDC(EditForm->Handle);
HDC hMemoryDC = CreateCompatibleDC(hDC);
GetObject(PieceBmpArray[0][red], sizeof(BITMAP), (LPSTR)&Bitmap);
for (i = 0; i < 7; i++)
{
hBitmap = PieceBmpArray[i][red];
hMaskBmp = MaskArray[i];
hOldBmp = (HBITMAP)SelectObject(hMemoryDC, hMaskBmp);
BitBlt(hDC, 3, 3 + (SQUARE_SIZE * i), Bitmap.bmWidth, Bitmap.bmHeight,
hMemoryDC, 0, 0, SRCAND);
SelectObject(hMemoryDC, hBitmap);
BitBlt(hDC, 3, 3 + (SQUARE_SIZE * i), Bitmap.bmWidth, Bitmap.bmHeight,
hMemoryDC, 0, 0, (SelectedItem == i)
? NOTSRCERASE : SRCINVERT);
SelectObject(hMemoryDC, hOldBmp);
}
for (i = 0; i < 7; i++)
{
hBitmap = PieceBmpArray[i][black];
hMaskBmp = MaskArray[i];
hOldBmp = (HBITMAP)SelectObject(hMemoryDC, hMaskBmp);
BitBlt(hDC, 3 + SQUARE_SIZE, 3 + (SQUARE_SIZE * i), Bitmap.bmWidth, Bitmap.bmHeight,
hMemoryDC, 0, 0, SRCAND);
SelectObject(hMemoryDC, hBitmap);
BitBlt(hDC, 3+SQUARE_SIZE, 3 + (SQUARE_SIZE * i), Bitmap.bmWidth, Bitmap.bmHeight,
hMemoryDC, 0, 0, (SelectedItem == (i + 7))
? NOTSRCERASE : SRCINVERT);
SelectObject(hMemoryDC, hOldBmp);
}
DeleteDC(hMemoryDC);
ReleaseDC(EditForm->Handle, hDC);
}
//---------------------------------------------------------------------------
/*
编辑窗体中的左鼠标按下事件处理函数
按下时位图将反相显示
*/
void __fastcall TEditForm::FormMouseUp(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
POINT point;
int i, j, temp;
RECT Rect;
BITMAP Bitmap;
HBITMAP hBitmap, hOldBmp, hMaskBmp;
if (Button != mbLeft)
return;
HDC hDC = GetDC(EditForm->Handle);
HDC hMemoryDC = CreateCompatibleDC(hDC);
int PreviousItem = SelectedItem;
point = Point(X,Y);
EditForm->ScreenToClient(point);
for (i = 0; i < 7; i++)
for (j = 0; j < 2; j++)
{
Rect.left = (j * SQUARE_SIZE) + 3;
Rect.right = Rect.left + SQUARE_SIZE;
Rect.top = (i * SQUARE_SIZE) + 3;
Rect.bottom = Rect.top + SQUARE_SIZE;
if (PtInRect(&Rect,point))
SelectedItem = (i + ((j) ? 7 : 0));
}
if (SelectedItem == PreviousItem)
return;
GetObject(PieceBmpArray[0][red], sizeof(BITMAP), (LPSTR)&Bitmap);
temp = PreviousItem % 7;
hBitmap = PieceBmpArray[temp][(PreviousItem < 7) ? red : black];
hMaskBmp = MaskArray[temp];
hOldBmp = (HBITMAP)SelectObject(hMemoryDC, hMaskBmp);
BitBlt(hDC, (PreviousItem < 7) ? 3 : 3 + SQUARE_SIZE,
3 + (SQUARE_SIZE * temp), Bitmap.bmWidth, Bitmap.bmHeight,
hMemoryDC, 0, 0, SRCERASE);
SelectObject(hMemoryDC, hBitmap);
BitBlt(hDC, (PreviousItem < 7) ? 3 : 3 + SQUARE_SIZE,
3 + (SQUARE_SIZE * temp), Bitmap.bmWidth, Bitmap.bmHeight,
hMemoryDC, 0, 0, SRCINVERT);
SelectObject(hMemoryDC, hOldBmp);
temp = SelectedItem % 7;
hBitmap = PieceBmpArray[temp][(SelectedItem < 7) ? red : black];
hMaskBmp = MaskArray[temp];
hOldBmp = (HBITMAP)SelectObject(hMemoryDC, hMaskBmp);
BitBlt(hDC, (SelectedItem < 7) ? 3 : 3 + SQUARE_SIZE,
3 + (SQUARE_SIZE * temp), Bitmap.bmWidth, Bitmap.bmHeight,
hMemoryDC, 0, 0, SRCAND);
SelectObject(hMemoryDC, hBitmap);
BitBlt(hDC, (SelectedItem < 7) ? 3 : 3 + SQUARE_SIZE,
3 + (SQUARE_SIZE * temp), Bitmap.bmWidth, Bitmap.bmHeight,
hMemoryDC, 0, 0, NOTSRCERASE);
SelectObject(hMemoryDC, hOldBmp);
DeleteDC(hMemoryDC);
ReleaseDC(EditForm->Handle, hDC);
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -