C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[18670] Re:Re:Re:감사합니다. 제가 테스트하고 있는 부분 소스 올립니다.
유영인 [Chris] [cuperido] 901 읽음    2002-05-20 17:00
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);
: : : : :      }
: : : : : -----------------------------------------------
: : : : : 위와 같이 했는데 선의 색깔이 붉은색으로 안 나옵니다.
: : : : : 어떻게 하면 되는지요.
: : : : : 많은 조언 부탁 드립니다.
: : : : : 그럼 모든분들 오늘도 즐거운 하루가 되시길....
: : : : :

+ -

관련 글 리스트
18631 불사새님,임페리얼님,경호님, 타 고수님들 좀 도와 주십시요? 정기원 846 2002/05/17
18632     Re:불사새님,임페리얼님,경호님, 타 고수님들 좀 도와 주십시요? 유영인 [Chris] 871 2002/05/17
18639         감사합니다. 그러나 바탕에 로드된 이미지 그림때문에 안되는것 같습니다. 정기원 866 2002/05/17
18643             Re:감사합니다. 그러나 바탕에 로드된 이미지 그림때문에 안되는것 같습니다. 유영인 [Chris] 870 2002/05/18
18669                 Re:Re:감사합니다. 제가 테스트하고 있는 부분 소스 올립니다. 정기원 790 2002/05/20
18670                     Re:Re:Re:감사합니다. 제가 테스트하고 있는 부분 소스 올립니다. 유영인 [Chris] 901 2002/05/20
18679                         정망 감사 합니다 유영인님. 해결 되었습니다. 낮은 비트 문제였군요. 너무너무 감사합니다(내용 무) 정기원 1061 2002/05/20
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.