C++ Builder XE4, 10.2 Tokyo > TImage > A에서 B로 2배로 그리기 내용 전송 > TCanvas.CopyRect | MouseDown 처리 | 그리기 복사 타이밍
14306 단어 embeddedTImagecppBuilder
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2018/01/05)
참고
TCanvas.CopyRect Method
하고 싶었던 일
[보그 집합체의 악마의 속삭임]
TImage의 드로잉을 확대 복사하면 쉽습니다.
code
Unit1.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::B_drawSomeClick(TObject *Sender)
{
IMG_src->Canvas->Brush->Color = clRed;
IMG_src->Canvas->FrameRect(Rect(0, 0, 50, 50));
TRect srcRect = Rect(0, 0, 50, 50);
TRect dstRect = Rect(0, 0, 100, 100);
IMG_disp->Stretch = true;
IMG_disp->Canvas->CopyRect(dstRect, IMG_src->Canvas, srcRect);
}
//---------------------------------------------------------------------------
실행 결과
그리기 부분의 래퍼 함수
FrameRect(), FillRect() 등의 프리미티브인 draw 함수를 사용하고 있는 함수내에서 확대 draw 하는 방법은 생각해 냈다.
실장했다고 하면, 장래의 소스 리딩시에 고생하는 생각이 들었으므로, 상기 방법을 생각해 냈다.
v0.2 MouseDown 처리 추가
확대 표시한 IMG_disp로 클릭한 좌표 데이터를 원 화상의 IMG_src로 사용한다.
이렇게 하면 IMG_src의 구현은 그대로, 확대 표시(와 클릭) 기능을 나중에 추가할 수 있을 것이다.
Unit1.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
static const int kRatio_image = 2; // 拡大率
static const int kCenter_image = 25;
static const int kMargin_image = 25;
//---------------------------------------------------------------------------
void __fastcall TForm1::FormShow(TObject *Sender)
{
IMG_src->Canvas->Brush->Color = clRed;
IMG_src->Canvas->FrameRect(Rect(0, 0, 50, 50));
TRect srcRect = Rect(0, 0, 50, 50);
TRect dstRect = Rect(0, 0, 100, 100);
//IMG_disp->Stretch = true;
IMG_disp->Canvas->CopyRect(dstRect, IMG_src->Canvas, srcRect);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::IMG_dispMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
int X, int Y)
{
int ax = X / kRatio_image;
int ay = Y / kRatio_image;
IMG_srcMouseDown(Sender, Button, Shift, ax, ay);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::IMG_srcMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
int X, int Y)
{
bool bfhit = true;
if (X < (kCenter_image - kMargin_image) ||
X > (kCenter_image + kMargin_image)) {
bfhit = false;
}
if (Y < (kCenter_image - kMargin_image) ||
Y > (kCenter_image + kMargin_image)) {
bfhit = false;
}
String msg;
if (bfhit) {
msg = L"You hit the nail on the head: " + IntToStr(X) + L"," + IntToStr(Y);
} else {
msg = L"You're closer than ever before.";
}
OutputDebugString(msg.c_str());
}
//---------------------------------------------------------------------------
그리기 복사 타이밍
프리미티브 드로잉 처리 (점을 치고, 선을 그리기, 텍스트를 쓰고, 색으로 채우기)의 타이밍마다 표시를 확대 복사하면 처리가 너무 많아진다.
타이머를 준비하고 타임 아웃마다 확대 복사를한다는 것이 하나의 방안.
LED의 점등 경험에서 대체로 300msec 정도의 갱신이면 위화감이 적을지도 모른다. 원래의 갱신 타이밍이 1초 정도이면, 타이머는 1초라도 좋을지도 모른다.
실제로 시도한 결과, 1초의 갱신에서는 「늦은」이 신경이 쓰였다. 300msec 정도가 위화감이 적다.
임베디드 애플리케이션
이번은 Windows 소프트에서의 구현이지만, 장래, 모니터 사이즈가 다른 액정을 사용해 갈 것 같은 임베디드로, 묘화 처리에 관해서도 응용할 수 있을지도 모른다. 기본 드로잉 기능은 읽기 쉬운 코드로 두고 확장 기능을 추가합니다.
Reference
이 문제에 관하여(C++ Builder XE4, 10.2 Tokyo > TImage > A에서 B로 2배로 그리기 내용 전송 > TCanvas.CopyRect | MouseDown 처리 | 그리기 복사 타이밍), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/7of9/items/4449ad77202892e753d1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)