|
유영인 [Chris] 님이 쓰신 글 :
: Bitmap의 구조는 8 Bit, 16 Bit, 24 Bit 등등 이런 종류가 있는데, 물론 아시겠지만, Bit수가 많을수록 나타낼 수 있는 색이 많아집니다.
:
: 지금 사용하고 계신 Bitmap 파일은 8 Bit 파일입니다. 그래서 다른 색을 나타낼 때, 색을 못나타내고 이상한 색으로 변경이 되는 것입니다. (24Bit용 그림파일을 낮은 Bit로 저장하실때 색깔이 깨짐을 보셨을지두요.. ^^)
:
: Image 컴포넌트는 Bitmap 파일을 로드시, 해당 그 파일의 정보로 자신의 Bitmap 정보를 갱신합니다. 그래서 24비트로 강제로 변환시켜 주시는 것이 필요합니다.
:
: 그리고, 첨부하신 소스파일에는, Pen의 Mode가 pmNonXor로 되어 있더군요. 이것을, pmCopy로 바꾸어 주시구요.. 아무튼.. Button1Click의 루틴을 보시면..
:
:
: Image1->Picture->Bitmap->PixelFormat = pf24bit; // 24Bit로 강제로 변환
: Image1->Canvas->Pen->Mode = pmCopy; // Copy 모드
:
: Image1->Canvas->Pen->Style = psSolid;
: Image1->Canvas->Pen->Color = clMaroon; //0x008080FF; // 색깔 테스트상으로 잠시 바꿨습니다
: Image1->Canvas->Pen->Width = 2;
:
: Image1->Canvas->MoveTo(Image2->Left + Image2->Width/2, Image2->Top + Image2->Height);
: Image1->Canvas->LineTo(Image3->Left + Image3->Width/2, Image3->Top );
:
:
: 이렇게 수정해주시면 됩니다.
:
:
:
: 정기원 님이 쓰신 글 :
: : 감사합니다. 유영인님. 제가 다른것땜에 이제야 글을 보았습니다.
: : 오전내내 이래저래 테스트 했는데 똑같네요.
: : 제가 테스트하는 소스는 다음과 같고, 내용은 폼위에 폼 전체를 덮는 지도 그림을 올려두고
: : 다시 지도 그림위에 조그마한 장비를 표현하는 사각형 그림을 올립니다. 그리고 조그마한
: : 사각형 장비들을 서로 선으로 연결하고 연결된 선에 문제가 발생하면 문제가 있는 선의 색상을
: : 특정색으로 변경하고자 하는 작업입니다. 그리고 초기에 화면 생성될때 기본적으로 서로 연결된
: : 상태로 나타나야 하며 어떤 이벤트때에 선의 색상을 변경합니다.
: : 아래 Image1은 bmp로 된 지도 그림으로 Picture속성에서 로드하였고
: : Align 속성을 Client로 했습니다. 또한 그림은 모두 칼라가 입혀져 있는 그림 지도입니다.
: : Image2와 Image3은 Image1위에 올려둔 사각형의 장비로 폼이 생성될때 초록색으로 칠했습니다.
: : Image1, Image2, Image3 Component의 모든 속성은 처음 세팅된 기본값으로 했습니다.
: : Button1을 누르면 선의 색상이 지정된 색으로 변경되어야 하는데 엉뚱한 색으로 되는군요 .
: : Pen의 Style과 Mode를 모두 변경하면서 테스트 했는데도 똑 같습니다.
: : 저의 테스트 프로그램을 첨부 화일로 첨부 했습니다.
: : 한번 읽어 보시고 조언을 부탁합니다.
: : 그럼 감사드리며 수고하십시요.
: :
: : //시험 소스
: : #include <vcl.h>
: : #pragma hdrstop
: :
: : #include "Image1.h"
: : //---------------------------------------------------------------------------
: : #pragma package(smart_init)
: : #pragma resource "*.dfm"
: : TForm1 *Form1;
: : //---------------------------------------------------------------------------
: : __fastcall TForm1::TForm1(TComponent* Owner)
: : : TForm(Owner)
: : {
: : }
: : //---------------------------------------------------------------------------
: :
: : void __fastcall TForm1::FormCreate(TObject *Sender)
: : {
: : TCanvas *pCanvas = Image2->Canvas;
: : TCanvas *pCanvas2 = Image3->Canvas;
: :
: : pCanvas->Brush->Color = clGreen;
: : pCanvas->Brush->Style = bsSolid;
: : pCanvas->Rectangle(0,0,Image2->Width, Image2->Height);
: :
: : pCanvas2->Brush->Color = clGreen;
: : pCanvas2->Brush->Style = bsSolid;
: : pCanvas2->Rectangle(0,0,Image3->Width, Image3->Height);
: :
: : Image1->Canvas->Pen->Mode = pmCopy;
: : Image1->Canvas->Pen->Style = psSolid;
: : Image1->Canvas->Pen->Color = clBlack;
: : Image1->Canvas->Pen->Width = 2;
: :
: : Image1->Canvas->MoveTo(Image2->Left + Image2->Width/2, Image2->Top + Image2->Height);
: : Image1->Canvas->LineTo(Image3->Left + Image3->Width/2, Image3->Top );
: :
: : }
: : //---------------------------------------------------------------------------
: : void __fastcall TForm1::Button1Click(TObject *Sender)
: : {
: : TCanvas *pCanvas = Image2->Canvas;
: : TCanvas *pCanvas2 = Image3->Canvas;
: :
: : pCanvas->Brush->Color = clRed;
: : pCanvas->Brush->Style = bsSolid;
: : pCanvas->Rectangle(0,0,Image2->Width, Image2->Height);
: :
: : Image1->Canvas->Pen->Mode = pmNotXor;
: : Image1->Canvas->Pen->Style = psSolid;
: : Image1->Canvas->Pen->Color = clRed;
: : Image1->Canvas->Pen->Width = 2;
: : Image1->Canvas->MoveTo(Image2->Left + Image2->Width/2, Image2->Top + Image2->Height);
: : Image1->Canvas->LineTo(Image3->Left + Image3->Width/2, Image3->Top );
: : }
: : //---------------------------------------------------------------------------
: :
: :
: :
: : 유영인 [Chris] 님이 쓰신 글 :
: : : 혹시 다른 속성값 정해주신건 없으신가요..? -_-a
: : :
: : : 그림이 있는 상태로 테스트 한건데...
: : :
: : : 루틴이 길지 않아 관련된 부분을 전부 올려주신다면..
: : :
: : : 금방 해결책을 찾으실 수 있으실껍니다.
: : :
: : :
: : : 정기원 님이 쓰신 글 :
: : : : 감사합니다. 유영인님
: : : : 폼위에 바로 이미지 콤포넌트를 올려서 아래 코드와 저의 코드를
: : : : 테스트하니 잘 됩니다. 그러나
: : : : 폼위에 TImage coponent올려서 속성을 Client로 하고
: : : : Picture로 bmp화일을 로드하여 둔 상태에서 다시 로드된 그림 위에
: : : : TImage를 추가하여 아래처럼 코딩하니까 선의 색이 기존에 로딩된
: : : : 그림의 색과 섞여 잘 나오지 않습니다. 저는 폼 바탕에 무조건 이미지를
: : : : 로딩하고 그 위에서 작업을 해야 하는데 어떻게 해야 할까요?
: : : : 정말 갑갑합니다.
: : : : 한번더 감사 드립니다. 수고하세요
: : : : 유영인 [Chris] 님이 쓰신 글 :
: : : : : : Image1->Canvas->Pen->Color = clBlack;
: : : : :
: : : : : 위의 코드 아래에 이 줄을 각각 붙여주세요. (2군데겠죠?)
: : : : :
: : : : : Image1->Canvas->Pen->Mode = pmCopy;
: : : : : Image1->Canvas->Pen->Style = psSolid;
: : : : :
: : : : : 그리고, 생각나는게, event 처리가 반복이 된다면, 각각의 라인은 Width가 틀리기 때문에 색깔이 섞여서 보이는 현상이 발생될 수 있습니다. (만약 처리가 빠르다면요..)
: : : : :
: : : : : 만약 위 코드를 집어넣어도 안되신다면, 다른 부분에서의 그리기나 기타 다른 부분에서의 충돌을 살펴보십시오.
: : : : :
: : : : : 아래 코드는 버튼을 누르면 흰줄을 노란줄로 바꾸는 코드로 기원님이 쓰신 코드와 같은 코드입니다. 아래 코드를 새 Application을 만드신뒤 테스트 하시고, 어느 부분에서 틀어졌는지 한번 짚어보시는것도 좋으실것 같네요.
: : : : :
: : : : :
: : : : : //---------------------------------------------------------------------------
: : : : :
: : : : : #include <vcl.h>
: : : : : #pragma hdrstop
: : : : :
: : : : : #include "Unit1.h"
: : : : : #define X 10
: : : : : #define Y 10
: : : : :
: : : : : //---------------------------------------------------------------------------
: : : : : #pragma package(smart_init)
: : : : : #pragma resource "*.dfm"
: : : : : TForm1 *Form1;
: : : : : //---------------------------------------------------------------------------
: : : : : __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
: : : : : {
: : : : : }
: : : : : //---------------------------------------------------------------------------
: : : : :
: : : : : void __fastcall TForm1::FormActivate(TObject *Sender)
: : : : : {
: : : : :
: : : : : Image1->Canvas->Pen->Mode = pmCopy;
: : : : : Image1->Canvas->Pen->Style = psSolid;
: : : : :
: : : : : Image1->Canvas->Pen->Color = clWhite;
: : : : : Image1->Canvas->Pen->Width = 1;
: : : : : Image1->Canvas->MoveTo(X, Y);
: : : : : Image1->Canvas->LineTo(X + 100, Y + 100);
: : : : :
: : : : : }
: : : : : //---------------------------------------------------------------------------
: : : : :
: : : : : void __fastcall TForm1::Button1Click(TObject *Sender)
: : : : : {
: : : : :
: : : : : Image1->Canvas->Pen->Mode = pmCopy;
: : : : : Image1->Canvas->Pen->Style = psSolid;
: : : : :
: : : : : Image1->Canvas->Pen->Color = clYellow;
: : : : : Image1->Canvas->Pen->Width = 2;
: : : : : Image1->Canvas->MoveTo(X, Y);
: : : : : Image1->Canvas->LineTo(X + 100, Y + 100);
: : : : :
: : : : : }
: : : : : //---------------------------------------------------------------------------
: : : : :
: : : : :
: : : : :
: : : : : 정기원 님이 쓰신 글 :
: : : : : : 이곳에 들러시는 모든분들 안녕하십니까?
: : : : : : 항상 많은 도움을 받아 갑니다. 늘 감사 드리구요.
: : : : : : 2일전에 Image1->Canvas->Pen->?에서 선의 색깔을 변경하는 방법에 대해
: : : : : : 질의를 드렸고 몇분이 답을 주셨습니다만 여전히 선의 색깔이 변하지 않아
: : : : : : 다시 문의 드립니다. 저는 Image Component를 가지고 작업하는것이 처음이라
: : : : : : 많이 막힙니다. 부디 도움 주시기를 부탁드립니다.
: : : : : :
: : : : : : 저번에 불사새님의 도움으로 무사히 TImage에서 도형과 선을 그렸습니다.
: : : : : : 그런데 또 막혔습니다. 막힌곳은 이벤트에 따라 기존에 그려진 선의 색깔을
: : : : : : 변경하고 싶어서 선의 색상을 달리 했는데 변경된 선의 색상으로 나타나지 않고
: : : : : : 기존 색과 겹쳐진 색으로 나옵니다. 이를 해결할 방법은 없나요?
: : : : : : 없다면 기존 선을 지우고 다시 그리면 될것 같은데 지울 수는 없나요?
: : : : : :
: : : : : : 일단 Form에 image component를 두고 이의 Align 특성을 Client로 했습니다.
: : : : : : 그리고 bmp로 된 그림을 로드하였고 로드된 이미지 그림 위에 다시 몇개의
: : : : : : Image component를 올려 놓고 이들 이미지를 서로 연결하는 선을 그렸습니다.
: : : : : : 각 연결된 선의 색깔을 어떤 이벤트에 따라 변경하고자 합니다.
: : : : : : 저의 코드 일부가 다음과 같이 했습니다.
: : : : : : ----------------------------------------
: : : : : : Image1->Canvas->Pen->Color = clBlack;
: : : : : : Image1->Canvas->Pen->Width = 1;
: : : : : : Image1->Canvas->MoveTo(X, Y);
: : : : : : Image1->Canvas->LineTo(X+100, Y+100);
: : : : : :
: : : : : : if(event) {
: : : : : : Image1->Canvas->Pen->Color = clRed;
: : : : : : Image1->Canvas->Pen->Width = 2;
: : : : : : Image1->Canvas->MoveTo(X, Y);
: : : : : : Image1->Canvas->LineTo(X+100, Y+100);
: : : : : : }
: : : : : : -----------------------------------------------
: : : : : : 위와 같이 했는데 선의 색깔이 붉은색으로 안 나옵니다.
: : : : : : 어떻게 하면 되는지요.
: : : : : : 많은 조언 부탁 드립니다.
: : : : : : 그럼 모든분들 오늘도 즐거운 하루가 되시길....
: : : : : :
|