128 lines
3.6 KiB
C++
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++;
|
|
}
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|