Files
2026-06-13 00:10:11 +08:00

128 lines
3.6 KiB
C++

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "QRcodePanel.h"
#define LEN_BKG_EXTERNAL_ROUND 1
#define LEN_BKG_EXTERNAL_FRMAE 1
const COLORREF CLR_BKG_EXTERNAL_ROUND = RGB(107, 115, 126),
CLR_BKG_EXTERNAL_FRMAE = RGB(145, 156, 170),
CLR_BKG_INTERNAL = RGB(255, 255, 255 );
//---------------------------------------------------------------------------
#pragma package(smart_init)
__fastcall TQRcodePanel::TQRcodePanel(TComponent* AOwner)
: TPanel(AOwner)
{
m_nQRwidth = 0;
m_pQRdata = NULL;
}
//---------------------------------------------------------------------------
__fastcall TQRcodePanel::~TQRcodePanel()
{
}
//---------------------------------------------------------------------------
void __fastcall TQRcodePanel::CreateWnd(void)
{
Vcl::Extctrls::TPanel::CreateWnd();
}
//---------------------------------------------------------------------------
void __fastcall TQRcodePanel::WMEraseBkgnd(Winapi::Messages::TWMEraseBkgnd &Message)
{
TRect rect = GetClientRect();
TCanvas* tempCanvas = new TCanvas;
tempCanvas->Handle = Message.DC;
TRect rectFill = rect;
rectFill.Top = rectFill.Top + LEN_BKG_EXTERNAL_ROUND;
rectFill.Left = rectFill.Left + LEN_BKG_EXTERNAL_ROUND;
rectFill.Right = rectFill.Right - LEN_BKG_EXTERNAL_ROUND;
rectFill.Bottom = rectFill.Bottom - LEN_BKG_EXTERNAL_ROUND;
tempCanvas->Brush->Color = CLR_BKG_INTERNAL;
tempCanvas->FillRect( rectFill );
//==========画圆角
int X,Y;
//上面的
Y = 0;
X = 0;
tempCanvas->Pixels[X][Y] = CLR_BKG_EXTERNAL_ROUND;
X = Width - LEN_BKG_EXTERNAL_ROUND;
tempCanvas->Pixels[X][Y] = CLR_BKG_EXTERNAL_ROUND;
//下面的
Y = Height - LEN_BKG_EXTERNAL_ROUND;
X = 0;
tempCanvas->Pixels[X][Y] = CLR_BKG_EXTERNAL_ROUND;
X = Width - LEN_BKG_EXTERNAL_ROUND;
tempCanvas->Pixels[X][Y] = CLR_BKG_EXTERNAL_ROUND;
//===========画边框
tempCanvas->Pen->Color = CLR_BKG_EXTERNAL_FRMAE;
tempCanvas->MoveTo( LEN_BKG_EXTERNAL_FRMAE, 0 );
tempCanvas->LineTo( Width-LEN_BKG_EXTERNAL_FRMAE, 0 );
tempCanvas->MoveTo( LEN_BKG_EXTERNAL_FRMAE, Height-LEN_BKG_EXTERNAL_FRMAE );
tempCanvas->LineTo( Width-LEN_BKG_EXTERNAL_FRMAE, Height-LEN_BKG_EXTERNAL_FRMAE );
tempCanvas->MoveTo( 0, LEN_BKG_EXTERNAL_FRMAE );
tempCanvas->LineTo( 0, Height-LEN_BKG_EXTERNAL_FRMAE );
tempCanvas->MoveTo( Width-LEN_BKG_EXTERNAL_FRMAE, LEN_BKG_EXTERNAL_FRMAE );
tempCanvas->LineTo( Width-LEN_BKG_EXTERNAL_FRMAE, Height-LEN_BKG_EXTERNAL_FRMAE );
//绘制标题
/* tempCanvas->Font->Size = 8;
tempCanvas->Font->Color = clBlack;
String strTitle = "歌曲二维码";
TSize size = tempCanvas->TextExtent( strTitle );
int x = (Width - size.Width) / 2,
y = Height - 8 - size.Height;
tempCanvas->TextOut( x, y, strTitle );
*/
delete tempCanvas;
Message.Result = true;
}
//---------------------------------------------------------------------------
void __fastcall TQRcodePanel::Paint()
{
int scale = (Width - 16) / m_nQRwidth;
int left = ( Width - m_nQRwidth * scale ) / 2,
top = ( Height - m_nQRwidth * scale ) / 2;
unsigned char *pSrcData = m_pQRdata;
for( int i=0; i<m_nQRwidth; i++ ){
for( int j=0; j<m_nQRwidth; j++ ){
int y = top + i * scale;
int x = left + j * scale;
if( *pSrcData & 1 ){
for( int m=0; m<scale; m++ ){
for( int n=0; n<scale; n++ ){
Canvas->Pixels[x+n][y+m] = clBlack;
}
}
}
pSrcData++;
}
}
}
//---------------------------------------------------------------------------