⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 editform2.cpp

📁 《C++Builder程序设计范例--中国象棋》配书盘自述文件
💻 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 + -