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

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[710] 진행바 ProgressBar 그냥 바닥에 표현... 글자색 XOR
박영목 [gsbsoft] 8417 읽음    2007-09-13 13:37
진행바 ProgressBar 그냥 바닥에 표현... 글자색 XOR

원하는 Cavas(HDC)에 바로 ProgressBar 표현해 보았습니다.... 하하하
이것을 어디에 사용하지...  쓸 데 있을 것입니다. 저도 요것이 필요했는데... 아무리해도 안되길래
그림으로 해결했습니다... ㅋㅋㅋ   안되는게 어딨어...


// 구상

//* Bitmap이 0, 1, 2가 있다.

//  1) BitBlt로  게이지 만큼 1에서 잘라 0에 XOR 한다.
//  2) BitBlt로  게이지 나머지만큼 2에서 잘라 0에 XOR 한다.
//  3) BitBlt로  0을 원하는 DC에 그린다.

void __fastcall TForm1::TrackBar1Change(TObject *Sender)
{

  int x, y, width, height, bkMode;
  COLORREF cfColor;
  char sss[100];

  x = 100; y = 150;  width = 100; height = 20;

  // 0
  HDC dcOrigin;
  HBITMAP hbmOrigin, hbmOldOrigin;              //흰색바탕에 녹색 게이지

  dcOrigin     = ::CreateCompatibleDC( this->Canvas->Handle );
  hbmOrigin    = ::CreateCompatibleBitmap( this->Canvas->Handle, width, height );
  hbmOldOrigin = ::SelectObject( dcOrigin, hbmOrigin );

  RECT r, rr;
  r.left   = 0;
  r.top    = 0;
  r.right  = width;
  r.bottom = height;

  rr = r;

  float percent = TrackBar1->Position;
  rr.right = rr.right * (percent/100);

  HBRUSH hbr = ::CreateSolidBrush( 0x00FFFFFF );
  ::FillRect( dcOrigin, &r, hbr  );
  DeleteObject( hbr );

  hbr = ::CreateSolidBrush( RGB(00,0xFF,00) );
  ::FillRect( dcOrigin, &rr, hbr  );
  DeleteObject( hbr );

                                            // FFFFFFFFFF1F73EA
  // 1
  HDC dcBlackBlue;
  HBITMAP hbmBlackBlue, hbmOldBlackBlue;         //검정바탕에 분홍색글자

  dcBlackBlue      = ::CreateCompatibleDC( this->Canvas->Handle );
  hbmBlackBlue     = ::CreateCompatibleBitmap( this->Canvas->Handle, width, height );
  hbmOldBlackBlue  = ::SelectObject( dcBlackBlue, hbmBlackBlue );

  hbr = ::CreateSolidBrush( 0x00000000 ); //RGB(255,255,255) );
  ::FillRect( dcBlackBlue, &r, hbr  );
  DeleteObject( hbr );

  itoa( TrackBar1->Position, sss, 10 );
  strcat( sss, "%" );
  sss[ strlen(sss) ] = 0x00;          //X  xor 0x00FF00   =  E08C15   0x00FF00   03D6FC                          //wsprintf( sss, "%d%%", TrackBar1->Position );

  cfColor = ::SetTextColor( dcBlackBlue, 0x00FF00FF );   ///329FC );  //E07315 ); //0xFF0000 ); //E08C15 ); //1F73EA ); //E08C15 ); //00FF00FF );
  bkMode = ::SetBkMode( dcBlackBlue, TRANSPARENT );
  ::DrawText( dcBlackBlue, sss, strlen(sss), &r, DT_CENTER|DT_VCENTER|DT_SINGLELINE );
  ::SetBkMode( dcBlackBlue, bkMode );

  // 2
  HDC dcBlackWhite;
  HBITMAP hbmBlackWhite, hbmOldBlackWhite;       //검정바탕에 흰색글자

  dcBlackWhite     = ::CreateCompatibleDC( this->Canvas->Handle );
  hbmBlackWhite    = ::CreateCompatibleBitmap( this->Canvas->Handle, width, height );
  hbmOldBlackWhite = ::SelectObject( dcBlackWhite, hbmBlackWhite );

  hbr = ::CreateSolidBrush( 0x00000000 );
  ::FillRect( dcBlackWhite, &r, hbr  );
  DeleteObject( hbr );

  wsprintf( sss, "%d%%", TrackBar1->Position );
  cfColor = ::SetTextColor( dcBlackWhite, 0x00FFFFFF );
  bkMode = ::SetBkMode( dcBlackWhite, TRANSPARENT );
  ::DrawText( dcBlackWhite, sss, strlen(sss), &r, DT_CENTER|DT_VCENTER|DT_SINGLELINE );
  ::SetBkMode( dcBlackWhite, bkMode );
  //--------------------------------------------------------------------------------


  ::BitBlt( this->Canvas->Handle, x, y-120, width, height, dcBlackBlue, 0, 0, SRCCOPY    );
  ::BitBlt( this->Canvas->Handle, x, y-60, width, height, dcBlackWhite, 0, 0, SRCCOPY    );

  ::BitBlt( dcOrigin, 0, 0, rr.right, height, dcBlackBlue, 0, 0, SRCINVERT    );
  ::BitBlt( dcOrigin, rr.right, 0, width-rr.right, height, dcBlackWhite, rr.right, 0, SRCINVERT    );

  ::BitBlt( this->Canvas->Handle, x, y, width, height, dcOrigin, 0, 0, SRCCOPY );

  ::SelectObject( dcOrigin, hbmOldOrigin );
  ::SelectObject( dcBlackBlue, hbmOldBlackBlue );
  ::SelectObject( dcBlackWhite, hbmOldBlackWhite );

  ::DeleteDC( dcOrigin );
  ::DeleteDC( dcBlackBlue );
  ::DeleteDC( dcBlackWhite );

}
//---------------------------------------------------------------------------


부산에서 박영목 올렸습니다.
박영목 [gsbsoft]   2007-09-15 12:41 X
        ::DeleteObject( hbmOrigin );
        ::DeleteObject( hbmBlackBlue);
        ::DeleteObject( hbmBlackWhite );

        이게 빠졌네요... 수정하세요!    어,,, 난가?  어매... 쪽팔려..
박영목 [gsbsoft]   2007-09-17 11:58 X
녹색바탕 흰글자, 회색바탕에 검정글자  2개만 만들어 DC에 바로 잘라 붙히기(COPY) 하는 것이 더 좋을 것 같네여... 왜? XOR로 했을까? 나는 바보인가봐?  옛날부터 투명에 미쳤어 이런 것은 늘 XOR로 해야 한다는 생각에 잠시 잡혀 있었나 봅니다.

+ -

관련 글 리스트
710 진행바 ProgressBar 그냥 바닥에 표현... 글자색 XOR 박영목 8417 2007/09/13
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.