자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
C++ Builder png Image Button에서 Flickering문제
2021.05.12 19:52
본 게시판은 개발자들이 자유롭게 질문과 답변을 공유하는 게시판입니다.
* 따라서 최대한 정중하게 질문을 올려 주세요.
* 질문을 상세히 작성해 주실 수록 좋은 답변이 올라 옵니다.
* 다른 분들도 참고할 수 있도록 결과 댓글 필수(또는 감사 댓글)
(결과 댓글을 달지 않는 경우 다음 질문에 대한 답변이 달리지 않는 불이익이 있을 수 있습니다.)
-----------------------------------------------------------------------------------------------
안녕하세요?
시드니 10.4 C++ Builder를 사용해서 프로그램을 개발하고 있는데 제 어플에서 Png 이미지 버튼을 사용합니다.
일테면 마우스가 버튼위에 위치 했을 때의 이미지와, 버튼이 눌러졌을 때의 이미지, 마우스가 버튼에서 사라졌을 때의 이미지
각각을 Resource에 등록해 놓고 마우스 엑션에 따라서 해당되는 이미지로 다음과 같이 변경하면서 사용합니다.
TPngImage *pngImage = new TPngImage();
pngImage->LoadFromResourceName((int)HInstance, "PngImage_126");
Image2->Picture->Graphic =pngImage;
delete pngImage;
마우스의 위치나 액션에 따른 이미지로 변환은 되는데 문제는 이때 버튼 주위로 하얀 Flickering이 일어 납니다.
미우스를 버튼에서 빠르게 왔다 갔다 하면 버튼이 하얗게 보일 정도입니다.
인터넷을 뒤져봐도 잘 모르겠고 심플하게 해결 할 수 있는 방법을 문의 드림니다.
어떻게 고칠 수 있을까요?
댓글 5
-
WhiteC
2021.05.17 14:54
-
오늘도좋은하루
2021.05.18 16:56
깊은 배려에 감사 드림니다.
Png이미지 화일이 3개가 준비됩니다.
즉 마우스가 눌렸을 때 Png 이미지 1개(편의상 리소스상에 등록된 이름이 PngImage_63)
마우스가 이미지 버튼위에 위치했을 때 1개(편의상 리소스상에 등록된 이름이 PngImage_62)
마우스가 이미지 버튼위에서 사자졌을 때 1개(편의상 리소스상에 등록된 이름이 PngImage_61)로 구분하여 마우스 위치나 액션에 따라서 버튼의 이미지를 다르게 표출하고자 하는 작업입니다.
void __fastcall TSearchCustomerForm::DeleteImageMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
TPngImage *pngImage = new TPngImage();
pngImage->LoadFromResourceName((int)HInstance, "PngImage_63");
DeleteImage->Picture->Graphic =pngImage;
delete pngImage;
}
//---------------------------------------------------------------------------
void __fastcall TSearchCustomerForm::DeleteImageMouseEnter(TObject *Sender)
{
TPngImage *pngImage = new TPngImage();
pngImage->LoadFromResourceName((int)HInstance, "PngImage_62");
DeleteImage->Picture->Graphic =pngImage;
delete pngImage;
}
//---------------------------------------------------------------------------
void __fastcall TSearchCustomerForm::DeleteImageMouseLeave(TObject *Sender)
{
TPngImage *pngImage = new TPngImage();
pngImage->LoadFromResourceName((int)HInstance, "PngImage_61");
DeleteImage->Picture->Graphic =pngImage;
delete pngImage;
}
//---------------------------------------------------------------------------
와 같이 코딩되어 있습니다.
제가 제가 헤메면서 생각해 보니 위 액션이 일어나면 말이 pngImage->LoadFromResourceName이지 실제로는 이미지 화일을 배경색으로(Default 흰색)으로 먼저 지우고 다음에 새로운 이지미로 로드하므로서 발생하는 문제인것 같은데 스므스 하게 잘 안됩니다.
-
WhiteC
2021.05.19 13:48
VCL에서 발생되는 현상인가요?
10.4.2 버전 VCL에서 재현이 잘 되지 않습니다. (혹시 버전도 10.4.2 버전인가요?)
재현이 되지 않지만, 아래 2가지 시도를 해보시는 건 어떠실까요?
Option 1. 해당 화면을 가지는 TForm의 DoubleBuffered 속성을 True로 한번 바꿔보세요.
Option 2. 버튼용 이미지이므로 이미지 파일의 크기가 크지 않을 것으로 예상됩니다. 그렇다면 3개의 TPngImage를 TForm의 OnCreate 이벤트에서 한번에 모두 생성하고, 삭제는 TForm의 OnDestroy 이벤트에서 모두 해보세요.
그리고 마우스 이벤트에서는 이미지 변경만 하구요. (즉 마우스 이벤트에서는 TPngImage 생성 삭제를 반복 하지 않는 거죠.)
예를 들면,
void __fastcall TForm18::DeleteImageMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
/* 이전 코드: 마우스 이벤트는 자주 발생되는데, 그 때마다 생성과 소멸을 계속 반복하는 것은 좋지 않을 수 있음
TPngImage *pngImage = new TPngImage();
pngImage->LoadFromResourceName((int)HInstance, "PngImage_63");
DeleteImage->Picture->Graphic =pngImage;
delete pngImage;
*/
DeleteImage->Picture->Graphic = pImage63; //OnCreate에서 생성된 pImage61˜63 중 원하는 것
}
(시도 후 결과가 어떻게 되었는지도 댓글로 남겨주시기 바랍니다. 궁금해서요)
-
오늘도좋은하루
2021.05.20 12:26
감사합니다.
제시하신 2가지 방법중에서 생성과 지움을 반복을 회피하는 방법은 Form위에 뛰워지는 그림들이 많아서 일단 보류해 놓고 말씀하신 첫번째 방안이 가장 손쉬운 방법이라서 DoubleBuffered 속성을 True로 해 보니 갈끔하게 해결 되었습니다.
고맙습니다.
-
WhiteC
2021.05.21 11:38
결과를 알려주셔서 감사합니다. 잘 해결되었다니 기쁩니다.
이미 아시겠지만, DisableControls와 EnableControls도 도움이 될 수도 있어서 공유합니다.
델파이 코드 Sample이지만, C++빌더에서도 사용할 수 있습니다.
http://docwiki.embarcadero.com/CodeExamples/en/DisableControls_(Delphi)
C++ Builder png Image Button에서 Flickering문제
2021.05.12 19:52
본 게시판은 개발자들이 자유롭게 질문과 답변을 공유하는 게시판입니다.
* 따라서 최대한 정중하게 질문을 올려 주세요.
* 질문을 상세히 작성해 주실 수록 좋은 답변이 올라 옵니다.
* 다른 분들도 참고할 수 있도록 결과 댓글 필수(또는 감사 댓글)
(결과 댓글을 달지 않는 경우 다음 질문에 대한 답변이 달리지 않는 불이익이 있을 수 있습니다.)
-----------------------------------------------------------------------------------------------
안녕하세요?
시드니 10.4 C++ Builder를 사용해서 프로그램을 개발하고 있는데 제 어플에서 Png 이미지 버튼을 사용합니다.
일테면 마우스가 버튼위에 위치 했을 때의 이미지와, 버튼이 눌러졌을 때의 이미지, 마우스가 버튼에서 사라졌을 때의 이미지
각각을 Resource에 등록해 놓고 마우스 엑션에 따라서 해당되는 이미지로 다음과 같이 변경하면서 사용합니다.
TPngImage *pngImage = new TPngImage();
pngImage->LoadFromResourceName((int)HInstance, "PngImage_126");
Image2->Picture->Graphic =pngImage;
delete pngImage;
마우스의 위치나 액션에 따른 이미지로 변환은 되는데 문제는 이때 버튼 주위로 하얀 Flickering이 일어 납니다.
미우스를 버튼에서 빠르게 왔다 갔다 하면 버튼이 하얗게 보일 정도입니다.
인터넷을 뒤져봐도 잘 모르겠고 심플하게 해결 할 수 있는 방법을 문의 드림니다.
어떻게 고칠 수 있을까요?
댓글 5
-
WhiteC
2021.05.17 14:54
-
오늘도좋은하루
2021.05.18 16:56
깊은 배려에 감사 드림니다.
Png이미지 화일이 3개가 준비됩니다.
즉 마우스가 눌렸을 때 Png 이미지 1개(편의상 리소스상에 등록된 이름이 PngImage_63)
마우스가 이미지 버튼위에 위치했을 때 1개(편의상 리소스상에 등록된 이름이 PngImage_62)
마우스가 이미지 버튼위에서 사자졌을 때 1개(편의상 리소스상에 등록된 이름이 PngImage_61)로 구분하여 마우스 위치나 액션에 따라서 버튼의 이미지를 다르게 표출하고자 하는 작업입니다.
void __fastcall TSearchCustomerForm::DeleteImageMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
TPngImage *pngImage = new TPngImage();
pngImage->LoadFromResourceName((int)HInstance, "PngImage_63");
DeleteImage->Picture->Graphic =pngImage;
delete pngImage;
}
//---------------------------------------------------------------------------
void __fastcall TSearchCustomerForm::DeleteImageMouseEnter(TObject *Sender)
{
TPngImage *pngImage = new TPngImage();
pngImage->LoadFromResourceName((int)HInstance, "PngImage_62");
DeleteImage->Picture->Graphic =pngImage;
delete pngImage;
}
//---------------------------------------------------------------------------
void __fastcall TSearchCustomerForm::DeleteImageMouseLeave(TObject *Sender)
{
TPngImage *pngImage = new TPngImage();
pngImage->LoadFromResourceName((int)HInstance, "PngImage_61");
DeleteImage->Picture->Graphic =pngImage;
delete pngImage;
}
//---------------------------------------------------------------------------
와 같이 코딩되어 있습니다.제가 제가 헤메면서 생각해 보니 위 액션이 일어나면 말이 pngImage->LoadFromResourceName이지 실제로는 이미지 화일을 배경색으로(Default 흰색)으로 먼저 지우고 다음에 새로운 이지미로 로드하므로서 발생하는 문제인것 같은데 스므스 하게 잘 안됩니다. -
WhiteC
2021.05.19 13:48
VCL에서 발생되는 현상인가요?
10.4.2 버전 VCL에서 재현이 잘 되지 않습니다. (혹시 버전도 10.4.2 버전인가요?)
재현이 되지 않지만, 아래 2가지 시도를 해보시는 건 어떠실까요?
Option 1. 해당 화면을 가지는 TForm의 DoubleBuffered 속성을 True로 한번 바꿔보세요.
Option 2. 버튼용 이미지이므로 이미지 파일의 크기가 크지 않을 것으로 예상됩니다. 그렇다면 3개의 TPngImage를 TForm의 OnCreate 이벤트에서 한번에 모두 생성하고, 삭제는 TForm의 OnDestroy 이벤트에서 모두 해보세요.
그리고 마우스 이벤트에서는 이미지 변경만 하구요. (즉 마우스 이벤트에서는 TPngImage 생성 삭제를 반복 하지 않는 거죠.)
예를 들면,
void __fastcall TForm18::DeleteImageMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
/* 이전 코드: 마우스 이벤트는 자주 발생되는데, 그 때마다 생성과 소멸을 계속 반복하는 것은 좋지 않을 수 있음
TPngImage *pngImage = new TPngImage();
pngImage->LoadFromResourceName((int)HInstance, "PngImage_63");
DeleteImage->Picture->Graphic =pngImage;
delete pngImage;
*/
DeleteImage->Picture->Graphic = pImage63; //OnCreate에서 생성된 pImage61˜63 중 원하는 것
}
(시도 후 결과가 어떻게 되었는지도 댓글로 남겨주시기 바랍니다. 궁금해서요)
-
오늘도좋은하루
2021.05.20 12:26
감사합니다.
제시하신 2가지 방법중에서 생성과 지움을 반복을 회피하는 방법은 Form위에 뛰워지는 그림들이 많아서 일단 보류해 놓고 말씀하신 첫번째 방안이 가장 손쉬운 방법이라서 DoubleBuffered 속성을 True로 해 보니 갈끔하게 해결 되었습니다.
고맙습니다.
-
WhiteC
2021.05.21 11:38
결과를 알려주셔서 감사합니다. 잘 해결되었다니 기쁩니다.
이미 아시겠지만, DisableControls와 EnableControls도 도움이 될 수도 있어서 공유합니다.
델파이 코드 Sample이지만, C++빌더에서도 사용할 수 있습니다.
http://docwiki.embarcadero.com/CodeExamples/en/DisableControls_(Delphi)
TPngImage이므로 아마 VCL이라고 생각되지만, VCL인가요? FMX인가요?
그리고, 재현할 수 있도록 조금 더 코드를 제시해주면 다른 분들이 조언을 주는데 도움이 될 것 같습니다.
(예를 들어 그럴리는 없지만, 혹시나 마우스 위치가 픽셀 하나 변할 때에도 이미지를 로딩하도록 코딩되어있을 수도 있어서요)
혹시나 TButton을 사용할 수 있다면, https://youtu.be/oLDqH3XGGZg 도 참고해보세요.