?? 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("e:\\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 + -