Initial commit
This commit is contained in:
@@ -0,0 +1,784 @@
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
#include <vcl.h>
|
||||
|
||||
#pragma hdrstop
|
||||
|
||||
#include "LineEdit.h"
|
||||
#pragma package(smart_init)
|
||||
//---------------------------------------------------------------------------
|
||||
// ValidCtrCheck is used to assure that the components created do not have
|
||||
// any pure virtual functions.
|
||||
//
|
||||
|
||||
static inline void ValidCtrCheck(TLineEdit *)
|
||||
{
|
||||
new TLineEdit(NULL);
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
__fastcall TLineEdit::TLineEdit(TComponent* Owner)
|
||||
: TWinControl(Owner)
|
||||
{
|
||||
m_Canvas = new TControlCanvas();
|
||||
m_Canvas->Control = this;
|
||||
|
||||
m_HintLabel = new TLabel(this);
|
||||
m_HintLabel->Font->Color = TColor(0x594D43);
|
||||
m_HintLabel->OnMouseDown = DoHintLabelMouseDown;
|
||||
|
||||
Height = 24;
|
||||
Width = 124;
|
||||
FBorderColor = TColor(0x5F5954);
|
||||
FShadowColor = TColor(0x4C463F);
|
||||
Color = TColor(0xC4B4A8);
|
||||
FHintColor = TColor(0x594D43);
|
||||
FMaxLength = 500;
|
||||
FOnChange = NULL;
|
||||
TabStop = true;
|
||||
|
||||
FNumberMax = -1;
|
||||
FNumberMin = -1;
|
||||
|
||||
m_IsCreated = false;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
namespace Lineedit
|
||||
{
|
||||
void __fastcall PACKAGE Register()
|
||||
{
|
||||
TComponentClass classes[1] = {__classid(TLineEdit)};
|
||||
RegisterComponents(L"Samples", classes, 0);
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
__fastcall TLineEdit::~TLineEdit()
|
||||
{
|
||||
if(m_Canvas)
|
||||
{
|
||||
delete m_Canvas;
|
||||
m_Canvas = NULL;
|
||||
}
|
||||
|
||||
if(m_HintLabel)
|
||||
{
|
||||
delete m_HintLabel;
|
||||
m_HintLabel = NULL;
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void __fastcall TLineEdit::SetTextFont(String name, int size)
|
||||
{
|
||||
Font->Name = name;
|
||||
Font->Size = size;
|
||||
|
||||
m_HintLabel->Font->Name = Font->Name;
|
||||
m_HintLabel->Font->Size = Font->Size;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void __fastcall TLineEdit::AdjustThisSize()
|
||||
{
|
||||
// 设置创建圆角窗口
|
||||
HRGN var_Hrgn;
|
||||
var_Hrgn = CreateRoundRectRgn(0, 0, Width + 1, Height + 1, 3, 3);
|
||||
SetWindowRgn(Handle, var_Hrgn, true);
|
||||
DeleteObject(var_Hrgn);
|
||||
|
||||
// 获取字体高度
|
||||
m_FontHeight = CalcFontHeight();
|
||||
|
||||
int var_EditTop = (Height - m_FontHeight) / 2;
|
||||
|
||||
// 计算编辑区位置
|
||||
m_TextRect = GetClientRect();
|
||||
m_TextRect.Left += 4;
|
||||
m_TextRect.Right -= 4;
|
||||
m_TextRect.Top = var_EditTop;
|
||||
|
||||
// 设置HintText位置
|
||||
m_HintLabel->Top = m_TextRect.Top;
|
||||
m_HintLabel->Left = m_TextRect.Left;
|
||||
m_HintLabel->Width = m_TextRect.Width();
|
||||
|
||||
// 设置编辑区左右边距
|
||||
SendMessage(Handle, EM_SETMARGINS, EC_LEFTMARGIN | EC_RIGHTMARGIN, 0);
|
||||
|
||||
// 设置编辑区域(多行编辑有效)
|
||||
SendMessage(Handle, EM_SETRECT, 0, (LPARAM)(&m_TextRect));
|
||||
}
|
||||
|
||||
int __fastcall TLineEdit::CalcColorValue(TColor Bg, TColor Fr, int Level, int Alpha)
|
||||
{
|
||||
return ((Bg * (Level - Alpha) + Fr * Alpha) / Level);
|
||||
}
|
||||
|
||||
int __fastcall TLineEdit::CalcFontHeight()
|
||||
{
|
||||
// 计算字体高度
|
||||
TTextMetric var_Metric;
|
||||
HDC var_DC = GetDC(0);
|
||||
|
||||
SelectObject(var_DC, Font->Handle);
|
||||
GetTextMetricsW(var_DC, &var_Metric);
|
||||
|
||||
ReleaseDC(0, var_DC);
|
||||
|
||||
return var_Metric.tmHeight;
|
||||
}
|
||||
|
||||
void __fastcall TLineEdit::CreateShadowColor()
|
||||
{
|
||||
int var_R, var_G, var_B, var_Alpha;
|
||||
int Level = (int)(atan(3.14 / 2) * 500);
|
||||
|
||||
// 计算阴影颜色
|
||||
for(int var_Index = 0; var_Index < 4; var_Index++)
|
||||
{
|
||||
var_Alpha = (int)(atan(3.14 / (2 * 3) * var_Index) * 500);
|
||||
|
||||
var_R = CalcColorValue(GetRValue(FShadowColor), GetRValue(Color), Level, var_Alpha);
|
||||
var_G = CalcColorValue(GetGValue(FShadowColor), GetGValue(Color), Level, var_Alpha);
|
||||
var_B = CalcColorValue(GetBValue(FShadowColor), GetBValue(Color), Level, var_Alpha);
|
||||
|
||||
m_ShadowColorArray[var_Index] = RGB(var_R, var_G, var_B);
|
||||
}
|
||||
|
||||
m_ShadowColorArray[4] = Color;
|
||||
}
|
||||
|
||||
void __fastcall TLineEdit::CreateParams(TCreateParams &Params)
|
||||
{
|
||||
TWinControl::CreateParams(Params);
|
||||
CreateSubClass(Params, L"EDIT");
|
||||
|
||||
DWORD var_Alignments[] = {ES_LEFT, ES_RIGHT, ES_CENTER};
|
||||
DWORD var_CharCase[] = {0, ES_UPPERCASE, ES_LOWERCASE};
|
||||
DWORD var_HideSelection[] = {ES_NOHIDESEL, 0};
|
||||
DWORD var_NumbersOnly[] = {0, ES_NUMBER};
|
||||
DWORD var_OEMConvert[] = {0, ES_OEMCONVERT};
|
||||
DWORD var_PasswordChar[] = {0, ES_PASSWORD};
|
||||
DWORD var_ReadOnly[] = {0, ES_READONLY};
|
||||
|
||||
Params.Style |= var_Alignments[FAlignment];
|
||||
Params.Style |= var_CharCase[FCharCase];
|
||||
Params.Style |= var_HideSelection[FHideSelection];
|
||||
Params.Style |= var_NumbersOnly[FNumbersOnly];
|
||||
Params.Style |= var_OEMConvert[FOEMConvert];
|
||||
Params.Style |= var_PasswordChar[FPasswordChar != 0];
|
||||
Params.Style |= var_ReadOnly[FReadOnly];
|
||||
|
||||
Params.Style |= ES_AUTOHSCROLL;
|
||||
Params.Style |= ES_MULTILINE;
|
||||
|
||||
//Params.Style |= WS_TABSTOP;
|
||||
|
||||
//Params.ExStyle |= WS_EX_CONTROLPARENT;
|
||||
}
|
||||
|
||||
void __fastcall TLineEdit::CreateWindowHandle(const TCreateParams &Params)
|
||||
{
|
||||
TWinControl::CreateWindowHandle(Params);
|
||||
}
|
||||
|
||||
void __fastcall TLineEdit::CreateWnd()
|
||||
{
|
||||
TWinControl::CreateWnd();
|
||||
m_HintLabel->Parent = this;
|
||||
|
||||
if(FPasswordChar != 0)
|
||||
{
|
||||
if(FPasswordChar == '*')
|
||||
{
|
||||
SendMessageW(Handle, EM_SETPASSWORDCHAR, L'●', 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
SendMessageW(Handle, EM_SETPASSWORDCHAR, FPasswordChar, 0);
|
||||
}
|
||||
}
|
||||
|
||||
if(FReadOnly)
|
||||
{
|
||||
SendMessage(WindowHandle, EM_SETREADONLY, 1, 0);
|
||||
}
|
||||
|
||||
if(!m_IsCreated)
|
||||
{
|
||||
SetText(FText);
|
||||
m_IsCreated = true;
|
||||
}
|
||||
|
||||
SetMaxLength(FMaxLength);
|
||||
|
||||
AdjustThisSize();
|
||||
}
|
||||
|
||||
void __fastcall TLineEdit::CMColorChanged(TMessage &Message)
|
||||
{
|
||||
CreateShadowColor();
|
||||
Invalidate();
|
||||
}
|
||||
|
||||
void __fastcall TLineEdit::CMFontChanged(TWMFontChange &Message)
|
||||
{
|
||||
TColor var_FontColor = Font->Color;
|
||||
|
||||
if(var_FontColor != m_FontColor) {
|
||||
m_FontColor = var_FontColor; // 保存字体颜色
|
||||
Invalidate();
|
||||
}
|
||||
else {
|
||||
m_HintLabel->Font->Name = Font->Name;
|
||||
m_HintLabel->Font->Size = Font->Size;
|
||||
|
||||
RecreateWnd();
|
||||
}
|
||||
}
|
||||
|
||||
void __fastcall TLineEdit::SetBorderColor(TColor Color)
|
||||
{
|
||||
if(FBorderColor != Color)
|
||||
{
|
||||
FBorderColor = Color;
|
||||
SendMessage(Handle, CM_COLORCHANGED, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void __fastcall TLineEdit::SetCursorPos(int Pos)
|
||||
{
|
||||
//SendMessage(Handle, EM_SETSEL, Pos, Pos);
|
||||
|
||||
SendMessage(Handle, EM_SCROLL, SB_PAGEUP, 0);
|
||||
}
|
||||
|
||||
void __fastcall TLineEdit::SetFocus()
|
||||
{
|
||||
m_HintLabel->Visible = false;
|
||||
TWinControl::SetFocus();
|
||||
}
|
||||
|
||||
void __fastcall TLineEdit::SetOnChange(TNotifyEvent OnChange)
|
||||
{
|
||||
FOnChange = OnChange;
|
||||
}
|
||||
|
||||
void __fastcall TLineEdit::SetShadowColor(TColor Color)
|
||||
{
|
||||
if(FShadowColor != Color)
|
||||
{
|
||||
FShadowColor = Color;
|
||||
SendMessage(Handle, CM_COLORCHANGED, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void __fastcall TLineEdit::ShowHintText()
|
||||
{
|
||||
if(Text.IsEmpty() && !Focused())
|
||||
m_HintLabel->Visible = true;
|
||||
else
|
||||
m_HintLabel->Visible = false;
|
||||
//if(Text.Length() == 0) m_HintLabel->Visible = true;
|
||||
//else m_HintLabel->Visible = false;
|
||||
}
|
||||
|
||||
void __fastcall TLineEdit::WMChar(TWMChar &Message)
|
||||
{
|
||||
if(Message.CharCode < 32)
|
||||
{
|
||||
switch(Message.CharCode)
|
||||
{
|
||||
case 1: // Ctrl + A
|
||||
case 3: // 双击鼠标左键
|
||||
SelectAll();
|
||||
break;
|
||||
|
||||
default:
|
||||
TWinControl::Dispatch(&Message);
|
||||
}
|
||||
}
|
||||
else if(Message.CharCode == 32)
|
||||
{
|
||||
if(!FNumbersOnly)
|
||||
TWinControl::Dispatch(&Message);
|
||||
}
|
||||
else
|
||||
{
|
||||
// 限制长度
|
||||
String text = GetText();
|
||||
int selStart = GetSelStart();
|
||||
int selLen = GetSelLength();
|
||||
text.Delete(selStart + 1, selLen);
|
||||
|
||||
if(text.Length() < FMaxLength)
|
||||
{
|
||||
if(FNumbersOnly)
|
||||
{
|
||||
if(Message.CharCode >= 0x30 && Message.CharCode <= 0x39)
|
||||
{
|
||||
if(FNumberMax != -1) {
|
||||
wchar_t c = Message.CharCode;
|
||||
|
||||
if(!text.IsEmpty()) {
|
||||
if(selStart == 0 && Message.CharCode == '0')
|
||||
return;
|
||||
|
||||
if(StrToInt(text) == 0 && Message.CharCode == '0')
|
||||
return;
|
||||
}
|
||||
|
||||
text.Insert(String(c), selStart);
|
||||
int num = StrToInt(text);
|
||||
if(num <= FNumberMax) {
|
||||
TWinControl::Dispatch(&Message);
|
||||
}
|
||||
}
|
||||
else
|
||||
TWinControl::Dispatch(&Message);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
TWinControl::Dispatch(&Message);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//MessageBeep(MB_OK);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void __fastcall TLineEdit::WMCommand(TWMCommand &Message)
|
||||
{
|
||||
if(Message.NotifyCode == EN_CHANGE)
|
||||
{
|
||||
//ShowHintText();
|
||||
Invalidate();
|
||||
if(FOnChange) FOnChange(this);
|
||||
}
|
||||
}
|
||||
|
||||
void __fastcall TLineEdit::WMCtlColorEdit(TWMCtlColorEdit &Message)
|
||||
{
|
||||
if(GetTextColor(Message.ChildDC) != ColorToRGB(Font->Color))
|
||||
SetTextColor(Message.ChildDC, ColorToRGB(Font->Color)); // 设置编辑文字颜色
|
||||
|
||||
//if(GetBkColor(Message.ChildDC) != ColorToRGB(Color))
|
||||
//{
|
||||
// SetBkColor(Message.ChildDC, ColorToRGB(Color)); // 设置编辑背景颜色
|
||||
//}
|
||||
|
||||
if(GetBkMode(Message.ChildDC) != TRANSPARENT)
|
||||
SetBkMode(Message.ChildDC, TRANSPARENT);
|
||||
|
||||
//ExcludeUpdateRgn(Message.ChildDC, Message.ChildWnd); */
|
||||
}
|
||||
|
||||
void __fastcall TLineEdit::WMCtlColorStatic(TWMCtlColorStatic &Message)
|
||||
{
|
||||
SetTextColor(Message.ChildDC, ColorToRGB(Font->Color)); // 设置编辑文字颜色
|
||||
|
||||
if(GetBkMode(Message.ChildDC) != TRANSPARENT)
|
||||
SetBkMode(Message.ChildDC, TRANSPARENT);
|
||||
|
||||
//SetBkColor(Message.ChildDC, ColorToRGB(Color)); // 设置编辑背景颜色
|
||||
}
|
||||
|
||||
void __fastcall TLineEdit::WMEraseBkgnd(TWMEraseBkgnd &Message)
|
||||
{
|
||||
m_Canvas->Lock();
|
||||
m_Canvas->Handle = Message.DC;
|
||||
|
||||
TRect var_Rect = GetClientRect();
|
||||
|
||||
// 绘制背景
|
||||
m_Canvas->Brush->Color = Color;
|
||||
m_Canvas->FillRect(var_Rect);
|
||||
|
||||
// 绘制边框
|
||||
m_Canvas->Brush->Color = FBorderColor;
|
||||
m_Canvas->FrameRect(var_Rect);
|
||||
|
||||
var_Rect.Top++;
|
||||
var_Rect.Left++;
|
||||
var_Rect.Right--;
|
||||
var_Rect.Bottom--;
|
||||
|
||||
// 绘制阴影
|
||||
m_Canvas->Brush->Color = TColor(m_ShadowColorArray[0]);
|
||||
//m_Canvas->Brush->Color = FShadowColor;
|
||||
m_Canvas->FrameRect(var_Rect);
|
||||
|
||||
for(int var_Layer = 1; var_Layer < 4; var_Layer++)
|
||||
{
|
||||
// 设置画笔颜色
|
||||
m_Canvas->Pen->Color = TColor(m_ShadowColorArray[var_Layer]);
|
||||
|
||||
m_Canvas->MoveTo(var_Rect.Left + var_Layer, var_Rect.Bottom - 2);
|
||||
m_Canvas->LineTo(var_Rect.Left + var_Layer, var_Rect.Top + var_Layer);
|
||||
|
||||
m_Canvas->MoveTo(var_Rect.Left + var_Layer, var_Rect.Top + var_Layer);
|
||||
m_Canvas->LineTo(var_Rect.Right - 1, var_Rect.Top + var_Layer);
|
||||
}
|
||||
|
||||
m_Canvas->UpdateTextFlags();
|
||||
m_Canvas->Unlock();
|
||||
}
|
||||
|
||||
void __fastcall TLineEdit::WMKeyDown(TWMKeyDown &Message)
|
||||
{
|
||||
if(Message.CharCode == VK_RETURN && !FReadOnly && Enabled)
|
||||
{
|
||||
MessageBeep(MB_OK);
|
||||
}
|
||||
|
||||
TWinControl::Dispatch(&Message);
|
||||
}
|
||||
|
||||
void __fastcall TLineEdit::WMKillFocus(TWMKillFocus &Message)
|
||||
{
|
||||
ShowHintText();
|
||||
|
||||
TWinControl::Dispatch(&Message);
|
||||
|
||||
if(Text.Length() < FMaxLength && !Text.IsEmpty())
|
||||
{
|
||||
if(FNumbersOnly && FNumberMin != -1)
|
||||
{
|
||||
int Value = StrToInt(Text);
|
||||
if(Value < FNumberMin) {
|
||||
Text = IntToStr(FNumberMin);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Invalidate();
|
||||
}
|
||||
|
||||
void __fastcall TLineEdit::WMPaint(TWMPaint &Message)
|
||||
{
|
||||
PaintHandler(Message);
|
||||
}
|
||||
|
||||
void __fastcall TLineEdit::WMSetFocus(TWMSetFocus &Message)
|
||||
{
|
||||
//ShowHintText();
|
||||
m_HintLabel->Visible = false;
|
||||
TWinControl::Dispatch(&Message);
|
||||
}
|
||||
|
||||
void __fastcall TLineEdit::WMSize(TWMSize &Message)
|
||||
{
|
||||
// 获取当前字体高度
|
||||
m_FontHeight = CalcFontHeight();
|
||||
|
||||
// 计算编辑框的最小高度
|
||||
int var_MinHeight = m_FontHeight + 4;
|
||||
int var_MinWidth = 20;
|
||||
|
||||
// 检查宽高的合法性
|
||||
if(Height < var_MinHeight)
|
||||
{
|
||||
Height = var_MinHeight;
|
||||
return;
|
||||
}
|
||||
|
||||
if(Width < var_MinWidth)
|
||||
{
|
||||
Width = var_MinWidth;
|
||||
return;
|
||||
}
|
||||
|
||||
AdjustThisSize();
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
// 编辑框操作
|
||||
/******************************************************************************/
|
||||
void __fastcall TLineEdit::DoHintLabelMouseDown(TObject *Sender,
|
||||
TMouseButton Button,
|
||||
TShiftState Shift, int X, int Y)
|
||||
{
|
||||
SetFocus();
|
||||
}
|
||||
|
||||
void __fastcall TLineEdit::Clear()
|
||||
{
|
||||
FText = "";
|
||||
SetText(FText);
|
||||
}
|
||||
|
||||
void __fastcall TLineEdit::ClearSelection()
|
||||
{
|
||||
SendMessage(Handle, WM_CLEAR, 0, 0);
|
||||
}
|
||||
|
||||
void __fastcall TLineEdit::CopyToClipboard()
|
||||
{
|
||||
SendMessage(Handle, WM_COPY, 0, 0);
|
||||
}
|
||||
|
||||
void __fastcall TLineEdit::CutToClipboard()
|
||||
{
|
||||
SendMessage(Handle, WM_CUT, 0, 0);
|
||||
}
|
||||
|
||||
void __fastcall TLineEdit::PasteFromClipboard()
|
||||
{
|
||||
SendMessage(Handle, WM_PASTE, 0, 0);
|
||||
}
|
||||
|
||||
void __fastcall TLineEdit::Undo()
|
||||
{
|
||||
SendMessage(Handle, WM_UNDO, 0, 0);
|
||||
}
|
||||
|
||||
void __fastcall TLineEdit::ClearUndo()
|
||||
{
|
||||
SendMessage(Handle, EM_EMPTYUNDOBUFFER, 0, 0);
|
||||
}
|
||||
|
||||
void __fastcall TLineEdit::SelectAll()
|
||||
{
|
||||
SendMessage(Handle, EM_SETSEL, 0, -1);
|
||||
}
|
||||
|
||||
String __fastcall TLineEdit::GetText()
|
||||
{
|
||||
if(HandleAllocated())
|
||||
{
|
||||
SendMessageW(Handle, WM_GETTEXT, 1024, (LPARAM)m_TextBuf);
|
||||
}
|
||||
else
|
||||
{
|
||||
wcscpy( m_TextBuf, FText.c_str() );
|
||||
}
|
||||
|
||||
return String(m_TextBuf);
|
||||
}
|
||||
|
||||
bool __fastcall TLineEdit::GetCanUndo()
|
||||
{
|
||||
if(HandleAllocated())
|
||||
{
|
||||
return (SendMessage(Handle, EM_CANUNDO, 0, 0) != 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
int __fastcall TLineEdit::GetSelLength()
|
||||
{
|
||||
TSelection Selection;
|
||||
SendMessage(Handle, EM_GETSEL, (WPARAM)&Selection.StartPos, (LPARAM)&Selection.EndPos);
|
||||
|
||||
return Selection.EndPos - Selection.StartPos;
|
||||
}
|
||||
|
||||
int __fastcall TLineEdit::GetSelStart()
|
||||
{
|
||||
int var_Result;
|
||||
SendMessage(Handle, EM_GETSEL, (WPARAM)&var_Result, 0);
|
||||
|
||||
return var_Result;
|
||||
}
|
||||
|
||||
String __fastcall TLineEdit::GetSelText()
|
||||
{
|
||||
int var_Start, var_Length;
|
||||
|
||||
var_Start = GetSelStart();
|
||||
var_Length = GetSelLength();
|
||||
|
||||
return Text.SubString(var_Start + 1, var_Length);
|
||||
}
|
||||
|
||||
void __fastcall TLineEdit::SetMaxLength(int Value)
|
||||
{
|
||||
if(Value > 500 || Value <= 0)
|
||||
{
|
||||
Value = 500;
|
||||
}
|
||||
|
||||
if(FMaxLength != Value)
|
||||
{
|
||||
FMaxLength = Value;
|
||||
}
|
||||
}
|
||||
|
||||
void __fastcall TLineEdit::SetSelLength(int Value)
|
||||
{
|
||||
TSelection Selection;
|
||||
SendMessage(Handle, EM_GETSEL, (WPARAM)&Selection.StartPos, (LPARAM)&Selection.EndPos);
|
||||
|
||||
Selection.EndPos = Selection.StartPos + Value;
|
||||
SendMessage(Handle, EM_SETSEL, Selection.StartPos, Selection.EndPos);
|
||||
SendMessage(Handle, EM_SCROLLCARET, 0, 0);
|
||||
}
|
||||
|
||||
void __fastcall TLineEdit::SetSelStart(int Value)
|
||||
{
|
||||
SendMessage(Handle, EM_SETSEL, Value, Value);
|
||||
}
|
||||
|
||||
void __fastcall TLineEdit::SetAlignment(TAlignment Value)
|
||||
{
|
||||
if(FAlignment != Value)
|
||||
{
|
||||
FAlignment = Value;
|
||||
m_HintLabel->Alignment = Value;
|
||||
|
||||
if(HandleAllocated())
|
||||
{
|
||||
RecreateWnd();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void __fastcall TLineEdit::SetCharCase(TEditCharCase Value)
|
||||
{
|
||||
if(FCharCase != Value)
|
||||
{
|
||||
FCharCase = Value;
|
||||
|
||||
if(HandleAllocated())
|
||||
{
|
||||
RecreateWnd();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void __fastcall TLineEdit::SetHideSelection(bool Value)
|
||||
{
|
||||
if(FHideSelection != Value)
|
||||
{
|
||||
FHideSelection = Value;
|
||||
|
||||
if(HandleAllocated())
|
||||
{
|
||||
RecreateWnd();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void __fastcall TLineEdit::SetHintText(String Value)
|
||||
{
|
||||
if(FHintText != Value)
|
||||
{
|
||||
FHintText = Value;
|
||||
m_HintLabel->Caption = Value;
|
||||
}
|
||||
}
|
||||
|
||||
void __fastcall TLineEdit::SetHintColor(TColor Value)
|
||||
{
|
||||
if(FHintColor != Value)
|
||||
{
|
||||
FHintColor = Value;
|
||||
m_HintLabel->Font->Color = Value;
|
||||
}
|
||||
}
|
||||
|
||||
void __fastcall TLineEdit::SetNumbersOnly(bool Value)
|
||||
{
|
||||
if(FNumbersOnly != Value)
|
||||
{
|
||||
FNumbersOnly = Value;
|
||||
|
||||
if(HandleAllocated())
|
||||
{
|
||||
RecreateWnd();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void __fastcall TLineEdit::SetOEMConvert(bool Value)
|
||||
{
|
||||
if(FOEMConvert != Value)
|
||||
{
|
||||
FOEMConvert = Value;
|
||||
|
||||
if(HandleAllocated())
|
||||
{
|
||||
RecreateWnd();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void __fastcall TLineEdit::SetPasswordChar(WideChar Value)
|
||||
{
|
||||
if(FPasswordChar != Value)
|
||||
{
|
||||
FPasswordChar = Value;
|
||||
|
||||
if(HandleAllocated())
|
||||
{
|
||||
RecreateWnd();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void __fastcall TLineEdit::SetReadOnly(bool Value)
|
||||
{
|
||||
if(FReadOnly != Value)
|
||||
{
|
||||
FReadOnly = Value;
|
||||
|
||||
if(HandleAllocated())
|
||||
{
|
||||
RecreateWnd();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void __fastcall TLineEdit::SetText(String Value)
|
||||
{
|
||||
FText = Value;
|
||||
|
||||
if(HandleAllocated())
|
||||
{
|
||||
//SetWindowText(Handle, Value.c_str());
|
||||
|
||||
//SetWindowText(Handle, FText.c_str());
|
||||
if(Value.IsEmpty())
|
||||
{
|
||||
m_HintLabel->SetDesignVisible(true);
|
||||
m_HintLabel->Visible = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_HintLabel->SetDesignVisible(false);
|
||||
m_HintLabel->Visible = false;
|
||||
}
|
||||
|
||||
SendMessageW(Handle, WM_SETTEXT, 0, (LPARAM)Value.c_str());
|
||||
|
||||
if(FOnChange) FOnChange(this);
|
||||
}
|
||||
}
|
||||
|
||||
void __fastcall TLineEdit::SetNumberMax(int Value)
|
||||
{
|
||||
if(FNumberMax != Value) {
|
||||
|
||||
FNumberMax = Value;
|
||||
}
|
||||
}
|
||||
|
||||
void __fastcall TLineEdit::SetNumberMin(int Value)
|
||||
{
|
||||
if(FNumberMin != Value) {
|
||||
|
||||
if(Value > FNumberMax) {
|
||||
Value = FNumberMax;
|
||||
}
|
||||
|
||||
FNumberMin = Value;
|
||||
}
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
@@ -0,0 +1,186 @@
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
#ifndef LineEditH
|
||||
#define LineEditH
|
||||
//---------------------------------------------------------------------------
|
||||
#include <vcl.h>
|
||||
//---------------------------------------------------------------------------
|
||||
class PACKAGE TLineEdit : public TWinControl
|
||||
{
|
||||
private:
|
||||
TEditCharCase FCharCase;
|
||||
TColor FBorderColor, // 边框颜色
|
||||
FShadowColor; // 阴影颜色
|
||||
TAlignment FAlignment;
|
||||
WideChar FPasswordChar;
|
||||
String FText;
|
||||
String FHintText;
|
||||
TColor FHintColor;
|
||||
bool FHideSelection,
|
||||
FNumbersOnly,
|
||||
FOEMConvert,
|
||||
FReadOnly;
|
||||
int FMaxLength,
|
||||
FNumberMax,
|
||||
FNumberMin;
|
||||
TNotifyEvent FOnChange;
|
||||
|
||||
TControlCanvas *m_Canvas;
|
||||
int m_ShadowColorArray[4]; // 阴影颜色数组
|
||||
int m_FontHeight; // 备份字体高度
|
||||
bool m_IsCreated;
|
||||
TLabel *m_HintLabel;
|
||||
TColor m_FontColor; // 备份字体颜色
|
||||
TRect m_TextRect;
|
||||
WCHAR m_TextBuf[512];
|
||||
|
||||
void __fastcall AdjustThisSize();
|
||||
|
||||
int __fastcall CalcColorValue(TColor BgColor, TColor FrColor, int Level, int Alpha);
|
||||
int __fastcall CalcFontHeight();
|
||||
void __fastcall CreateShadowColor(); // 创建阴影颜色
|
||||
|
||||
void __fastcall SetBorderColor(TColor Color);
|
||||
void __fastcall SetOnChange(TNotifyEvent OnChange);
|
||||
void __fastcall SetShadowColor(TColor Color);
|
||||
|
||||
void __fastcall ShowHintText();
|
||||
|
||||
/******************************************************************************/
|
||||
// 编辑框操作
|
||||
/******************************************************************************/
|
||||
void __fastcall DoHintLabelMouseDown(TObject *Sender,
|
||||
TMouseButton Button,
|
||||
TShiftState Shift, int X, int Y);
|
||||
|
||||
UnicodeString __fastcall GetText();
|
||||
|
||||
bool __fastcall GetCanUndo();
|
||||
int __fastcall GetSelLength();
|
||||
int __fastcall GetSelStart();
|
||||
String __fastcall GetSelText();
|
||||
|
||||
void __fastcall SetAlignment(TAlignment Value);
|
||||
void __fastcall SetCharCase(TEditCharCase Value);
|
||||
void __fastcall SetHideSelection(bool Value);
|
||||
void __fastcall SetHintText(String Value);
|
||||
void __fastcall SetHintColor(TColor Value);
|
||||
void __fastcall SetNumbersOnly(bool Value);
|
||||
void __fastcall SetOEMConvert(bool Value);
|
||||
void __fastcall SetPasswordChar(WideChar Value);
|
||||
void __fastcall SetReadOnly(bool Value);
|
||||
void __fastcall SetText(UnicodeString Value);
|
||||
|
||||
void __fastcall SetMaxLength(int Value);
|
||||
void __fastcall SetSelLength(int Value);
|
||||
void __fastcall SetSelStart(int Value);
|
||||
|
||||
void __fastcall SetNumberMax(int Value);
|
||||
void __fastcall SetNumberMin(int Value);
|
||||
/******************************************************************************/
|
||||
|
||||
MESSAGE void __fastcall CMColorChanged(TMessage &Message);
|
||||
MESSAGE void __fastcall CMFontChanged(TWMFontChange &Message);
|
||||
MESSAGE void __fastcall WMChar(TWMChar &Message);
|
||||
MESSAGE void __fastcall WMCommand(TWMCommand &Message);
|
||||
MESSAGE void __fastcall WMCtlColorEdit(TWMCtlColorEdit &Message);
|
||||
MESSAGE void __fastcall WMCtlColorStatic(TWMCtlColorStatic &Message);
|
||||
MESSAGE void __fastcall WMEraseBkgnd(TWMEraseBkgnd &Message);
|
||||
MESSAGE void __fastcall WMKeyDown(TWMKeyDown &Message);
|
||||
MESSAGE void __fastcall WMKillFocus(TWMKillFocus &Message);
|
||||
MESSAGE void __fastcall WMPaint(TWMPaint &Message);
|
||||
MESSAGE void __fastcall WMSetFocus(TWMSetFocus &Message);
|
||||
MESSAGE void __fastcall WMSize(TWMSize &Message);
|
||||
|
||||
BEGIN_MESSAGE_MAP
|
||||
MESSAGE_HANDLER(CM_COLORCHANGED, TMessage, CMColorChanged)
|
||||
MESSAGE_HANDLER(CM_FONTCHANGED, TWMFontChange, CMFontChanged)
|
||||
MESSAGE_HANDLER(CN_COMMAND, TWMCommand, WMCommand)
|
||||
MESSAGE_HANDLER(CN_CTLCOLOREDIT, TWMCtlColorEdit, WMCtlColorEdit)
|
||||
MESSAGE_HANDLER(CN_CTLCOLORSTATIC, TWMCtlColorStatic, WMCtlColorStatic)
|
||||
MESSAGE_HANDLER(WM_CHAR, TWMChar, WMChar)
|
||||
MESSAGE_HANDLER(WM_ERASEBKGND, TWMEraseBkgnd, WMEraseBkgnd)
|
||||
MESSAGE_HANDLER(WM_KEYDOWN, TWMKeyDown, WMKeyDown)
|
||||
MESSAGE_HANDLER(WM_KILLFOCUS, TWMKillFocus, WMKillFocus)
|
||||
MESSAGE_HANDLER(WM_PAINT, TWMPaint, WMPaint)
|
||||
MESSAGE_HANDLER(WM_SETFOCUS, TWMSetFocus, WMSetFocus)
|
||||
MESSAGE_HANDLER(WM_SIZE, TWMSize, WMSize)
|
||||
END_MESSAGE_MAP(TWinControl)
|
||||
|
||||
__property Hint;
|
||||
|
||||
protected:
|
||||
virtual void __fastcall CreateParams(TCreateParams &Params);
|
||||
virtual void __fastcall CreateWindowHandle(const TCreateParams &Params);
|
||||
virtual void __fastcall CreateWnd();
|
||||
|
||||
public:
|
||||
__fastcall TLineEdit(TComponent* Owner);
|
||||
__fastcall ~TLineEdit();
|
||||
|
||||
void __fastcall SetFocus();
|
||||
void __fastcall SetCursorPos(int Pos);
|
||||
void __fastcall SetTextFont(String name, int size);
|
||||
|
||||
/******************************************************************************/
|
||||
// 编辑框操作
|
||||
/******************************************************************************/
|
||||
void __fastcall Clear();
|
||||
void __fastcall ClearSelection();
|
||||
void __fastcall CopyToClipboard();
|
||||
void __fastcall CutToClipboard();
|
||||
|
||||
void __fastcall PasteFromClipboard();
|
||||
void __fastcall Undo();
|
||||
void __fastcall ClearUndo();
|
||||
void __fastcall SelectAll();
|
||||
|
||||
__property bool CanUndo = {read = GetCanUndo, nodefault};
|
||||
__property int SelLength = {read = GetSelLength, write = SetSelLength, nodefault};
|
||||
__property int SelStart = {read = GetSelStart, write = SetSelStart, nodefault};
|
||||
__property String SelText = {read = GetSelText};
|
||||
|
||||
__property AlignWithMargins = {default = false};
|
||||
__property HelpContext;
|
||||
__property HelpKeyword;
|
||||
__property HelpType;
|
||||
__property Margins;
|
||||
__property Cursor;
|
||||
/******************************************************************************/
|
||||
|
||||
__published:
|
||||
__property TColor BorderColor = {read = FBorderColor, write = SetBorderColor, default = TColor(0x5F5954)};
|
||||
__property TColor ShadowColor = {read = FShadowColor, write = SetShadowColor, default = TColor(0x4C463F)};
|
||||
|
||||
__property TNotifyEvent OnChange = {read = FOnChange, write = SetOnChange};
|
||||
|
||||
|
||||
__property TAlignment Alignment = {read = FAlignment, write = SetAlignment};
|
||||
__property TEditCharCase CharCase = {read = FCharCase, write = SetCharCase};
|
||||
|
||||
__property bool HideSelection = {read = FHideSelection, write = SetHideSelection};
|
||||
__property String HintText = {read = FHintText, write = SetHintText};
|
||||
__property TColor HintColor = {read = FHintColor, write = SetHintColor, default = TColor(0x594D43)};
|
||||
__property int MaxLength = {read = FMaxLength, write = SetMaxLength, default = 500};
|
||||
__property bool NumbersOnly = {read = FNumbersOnly, write = SetNumbersOnly};
|
||||
__property bool OEMConvert = {read = FOEMConvert, write = SetOEMConvert};
|
||||
__property WideChar PasswordChar = {read = FPasswordChar, write = SetPasswordChar};
|
||||
__property bool ReadOnly = {read = FReadOnly, write = SetReadOnly};
|
||||
|
||||
__property int NumberMax = {read = FNumberMax, write = SetNumberMax};
|
||||
__property int NumberMin = {read = FNumberMin, write = SetNumberMin};
|
||||
|
||||
__property UnicodeString Text = {read = GetText, write = SetText};
|
||||
|
||||
__property Color = {default = TColor(0xC4B4A8)};
|
||||
__property Font;
|
||||
|
||||
__property TabOrder = {default = -1};
|
||||
__property TabStop = {default = true};
|
||||
|
||||
__property OnKeyDown;
|
||||
__property OnKeyPress;
|
||||
__property OnKeyUp;
|
||||
};
|
||||
//---------------------------------------------------------------------------
|
||||
#endif
|
||||
@@ -0,0 +1,17 @@
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
#include <System.hpp>
|
||||
#pragma hdrstop
|
||||
#pragma package(smart_init)
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// Package source.
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
#pragma argsused
|
||||
extern "C" int _libmain(unsigned long reason)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
Reference in New Issue
Block a user