http://blog.daum.net/aswip/6519855

http://snowfrolic.tistory.com/374

실행 시 'fail to create java virtual machine' 에러 메시지가 뜬다면

 

eclipse.ini 파일에 경로를 지정해 주어야 하는 것 같다.

 

아래와 같이 추가(경로는 본인에 맞게 변경해야 함)

 

-vm
C:/Program Files/Java/jdk1.7.0_05/bin/javaw.exe

CDC 클래스의 Get/SetPixel() 함수나 CImage 클래스의 Get/SetPixel() 함수는 속도가 매우 느리다.

그 이유는 두 함수가 내부적으로 비트맵 정보를 분석하여 DDB를 DIB로 변경한 후 비트맵 데이터를 추출하고 거기서 주어진 인덱스에 해당하는 픽셀 정보를 얻는다.

이 문제를 해결하려면 한 픽셀의 정보를 가져오고 저장할 때마다 비트맵을 분석하는 것이 아니라 한 번 분석을 끝낸 후에는 더 그럴 필요가 없게 하면 된다.

 

Get/SetPixel() 함수를 사용할 때마다 비트맵을 분석하지 말고 한 번만 분석하도록 하자.

 

Get/SetPixel() 성능 향상은 아래 참조

http://dal2iya.tistory.com/126

 

  1. 전형적인 이미지 출력
    1. 윈도우 프로그래밍에서 비트맵 이미지를 출력하는 전형적인 방법
      - 리소스로 등록된 비트맵 이미지를 메모리 DC에 로드하여 화면 DC로 출력(BitBlt())
      - 이미지의 크기를 변경(StretchBlt())
      - 일부 영역을 투명하게 처리(TransparentBlt())
      - 반투명하게 처리(AlphaBlend())
    2. 비트맵(Bitmap)에 대한 이론
      1. 장치 의존적인 비트맵(DDB, Device Dependent Bitmap) & 장치 독립적인 비트맵(DIB, Device Independent Bitmap)으로 나뉨
      2. 우리가 아는 비트맵 파일은 모두 DIB라고 보아도 무방...
      3. 비트맵을 우리 눈으로 보려면 DDB로 변환이 필요
        - 변환 작업은 운영체제가 한다
    3. 비트맵 리소스 출력
    4. void CBmpDisplayDemoView::OnPaint()

      {

      CPaintDC dc(this);

       

      CDC MemDC;

      BITMAP bmpInfo;

       

      //화면 DC와 호환되는 메모리 DC를 생성

      MemDC.CreateCompatibleDC(&dc);

       

      //비트맵 리소스를 로딩

      CBitmap bmp;

      CBitmap* pOldBmp = NULL;

      bmp.LoadBitmap(IDB_Test_Image);//IDB_Test_Image 비트맵 리소스를 미리 등록해야 함.

       

      //로딩된 비트맵의 정보를 알아본다.

      bmp.GetBitmap(&bmpInfo);

       

      //메모리 DC에 선택한다.

      pOldBmp = MemDC.SelectObject(&bmp);

       

      //메모리 DC에 들어 있는 비트맵을 화면 DC로 복사하여 출력

      dc.BitBlt(0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, &MemDC, 0, 0, SRCCOPY);

       

      //두 배 확대하여 출력

      //dc.StrectchBlt(200, 200, 250 * 2, 300 * 2, &MemDC, 350, 200, 250, 300, SRCCOPY);

       

      MemDC.SelectObject(pOldBmp);

      }

      • 화면 DC와 호환되는 메모리 DC
        • 가령 현재 모니터가 32비트 트루 컬러라면 메모리 DC도 같게 32비트 트루 컬러로 설정
      • BitBlt()
        • 메모리 DC에 로드된 비트맵 이미지를 화면 DC로 전송하면 내부적으로 DIB가 DDB로 변환되어 모니터 화면에 출력
        • 마지막 인자 : 래스터 연산(Raster Operation)을 어떻게 할지 명시
          • SRCCOPY - 원본 그대로 화면 DC에 복사
          • SRCAND - 원본과 대상을 AND 연산
          • NOTSRCCOPY - 원본 이미지의 색상을 반전
          • DSTINVERT - 원본 이미지와는 상관없이 대상 이미지를 반전
  2. 고급 이미지 출력 함수
    1. TransparentBlt()
    2. void CBmpDisplayDemoView::OnPaint()

      {

      CPaintDC dc(this);

       

      CDC MemDC;

      BITMAP bmpInfo;

      MemDC.CreateCompatibleDC(&dc);

       

      CBitmap bmp;

      CBitmap* pOldBmp = NULL;

      bmp.LoadBitmap(IDB_Test_Image);

       

      bmp.GetBitmap(&bmpInfo);

      pOldBmp = MemDC.SelectObject(&bmp);

       

      dc.StrectchBlt(20, 20, bmpInfo.bmWidth * 2, bmInfo.bmHeight * 2, &MemDC, 0, 0, bmpInfo.bmWidth, bmInfo.bmHeight, SRCCOPY);

       

      dc.TransparentBlt(20, 100,

      bmpInfo.bmWidth * 2, bmInfo.bmHeight * 2,

      &MemDC,

      0, 0,

      bmpInfo.bmWidth, bmInfo.bmHeight,

      RGB(0, 0, 0));    //투명 처리될 색상의 RGB 값

       

      MemDC.SelectObject(pOldBmp);

      }

      TransprentBlt의 마지막 인자 값이 RGB(0, 0, 0) 이므로 검정색이 투명하게 출력
    3. AlphaBlend()
    4. void CBmpDisplayDemoView::OnPaint()

      {

      CPaintDC dc(this);

       

      CDC MemDC;

      BITMAP bmpInfo;

      MemDC.CreateCompatibleDC(&dc);

       

      CBitmap bmp;

      CBitmap* pOldBmp = NULL;

      bmp.LoadBitmap(IDB_Test_Image);

       

      bmp.GetBitmap(&bmpInfo);

      pOldBmp = MemDC.SelectObject(&bmp);

       

      dc.StrectchBlt(20, 20, bmpInfo.bmWidth * 2, bmInfo.bmHeight * 2, &MemDC, 0, 0, bmpInfo.bmWidth, bmInfo.bmHeight, SRCCOPY);

       

      BLENDFUNCTION bf;

      bf.BlendOp = AC_SRC_OVER;

      bf.BlendFlags = 0;

      bf.SourceConstantAlpha = 50;

      bf.AlphaFormat = 0;

       

      dc.AlphaBlend(20, 100,

      bmpInfo.bmWidth * 2, bmInfo.bmHeight * 2,

      &MemDC,

      0, 0,

      bmpInfo.bmWidth, bmInfo.bmHeight,

      bf);

       

      MemDC.SelectObject(pOldBmp);

      }

      BLENDFUNCTION 구조체 

      BlendOp 멤버 : 원본/대상 이미지를 서로 섞음

      BlendFlags : 사용 안 함(반드시 0)

      SourceConstantAlpha : 투명도(0~255), 0에 가까울수록 투명

      AlphaFormat : 0 or AC_SRC_ALPHA, AC_SRC_ALPHA인 경우는 진정한 32비트 비트맵인 경우

  3. CImage 클래스의 활용
    1. Visual C++ 6.0에선 외부 이미지 파일을 로드하는게 번거로웠다. 비트맵 파일을 제외한 JPEG, PNG, GIF 와 같은 이미지 파일을 로드하려면 별도의 외부 라이브러리를 사용해야 했다.
    2. CImage는 다양한 형식의 파일을 지원한다.
    3. CImage 클래스를 사용하려면 반드시 atlimage.h 파일을 인클루드해야 한다.
    4. void CImgOutDemoView::OnPaint()

      {

      CPaintDC dc(this);

       

      //로드할 이미지 파일 경로

      CString strImagePath = _T("IMG_0076.jpg");

       

      //이미지 파일 로드

      CImage Image;

      HRESULT hResult = Image.Load(strImagePath);

       

      if(FAILED(hResult))

      {

      CString strtmp = _T("ERROR: Failed to load");

      strtmp += strImagePath + _T("\n");

      TRACE(strtmp);

      return;

      }

       

      //화면 DC에 출력

      Image.BitBlt(dc.m_hDC, 0, 0);

      }

      • CImage 클래스는 MFC가 제공하는 ATL(ActiveX Template Library) 클래스 중 하나이다. 그래서 내부적으로 COM(Component Object Model) 객체로 구현되어 있다.
      • C++의 클래스가 논리적인 코드를 객체화한 개념이라면 COM은 실행 바이너리 파일 단위(모듈 단위)로 객체화한 것이라 할 수 있다. 그래서 메서드가 반환하는 값은 HRESULT형이며, FAILED() 매크로나 SUCCEEDED() 매크로를 이용해 오류를 확인한다. 

      void CImgOutDemoView::OnPaint()

      {

      CPaintDC dc(this);

       

      CImage Image;

       

      //비트맵 리소스를 로드하여 DIB 생성

      Image.LoadFromResource(AfxGetInstanceHandle(), IDB_Image_Test);

       

      //비트맵 이미지에 대한 DC 생성

      CDC* pDC = CDC::FromHandle(Image.GetDC());

       

      //이 이미지 DC에 문자열 출력

      pDC->SetBkMode(TRANSPARENT);

      pDC->TextOut(200, 30, ,TEXT("CImage sample!"));

       

      Image.ReleaseDC();

       

      //이미지를 화면 DC에 출력

      Image.BitBlt(dc.m_hDC, 0, 0);

       

      //문자열을 화면 DC에 출력

      //dc.SetBkMode(TRANSPARENT);

      //dc.TextOut(200, 30, ,TEXT("CImage sample!"));

      }

      • LoadFromResource() 메서드는 비트맵 리소스를 로드하여 비트맵 이미지를 생성한다.
  4. 색상(Color)의 변환
    1. RGB 컬러를 흑백으로 변환
    2. #endif //_DEBUG

      inline void RGBtoGray(COLORREF& rgb)
      {
       BYTE byGray = (GetRValue(rgb) * 30
          + GetGValue(rgb) * 59
          + GetBValue(rgb) * 11) / 100
      ;

       rgb = RGB(byGray, byGray, byGray);
      }


      // CSaveGrayDemoView 메시지 처리기 

    3. 바탕화면의 일부를 변환하여 출력
    4. void CSaveGrayDemoView::OnLButtonDown(UINT nFlags, CPoint point)
      {

      // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.

      //바탕화면 윈도우 객체에 대한 포인터를 얻음
      CWnd* pWndDesktop = GetDesktopWindow();
      CWindowDC SrcDC(pWndDesktop);
      CClientDC dc(this);

       

      //바탕화면 크기 및 색상수와 동일한 비트맵 이미지를 만든다.
      CImage Image;
      Image.Create(300, 300, SrcDC.GetDeviceCaps(BITSPIXEL));

       

      //이미지 DC와 화면 DC에 바탕화면 윈도우 DC를 출력한다.
      CDC* pDC = CDC::FromHandle(Image.GetDC());
      pDC->BitBlt(0, 0, 300, 300, &SrcDC, 0, 0, SRCCOPY);
      Image.ReleaseDC();

       

      //일부(200 * 200)를 흑백 이미지로 변환
      COLORREF rgb;
      for(int x = 0; x < 200; x++)
      {
          for(int y = 0; y < 200; y++)
         {
             rgb = Image.GetPixel(x, y);
             //Gray RGB 값으로 변환
             RGBtoGray(rgb);
             Image.SetPixel(x, y, rgb);
         }
      }

       

      //흑백으로 변환된 이미지를 화면 DC에 출력

      Image.BitBlt(dc.m_hDC, 0, 0);

      CView::OnLButtonDown(nFlags, point);

      • GetDesktopWindow() 메서드는 바탕화면 윈도우 객체의 포인터 반환
      • CWindowDC 클래스는 비클라이언트 영역을 포함한 윈도우 전체에 대한 DC
      • CDC 클래스의 GetDeviceCaps() 메서드는 인자로 전달받은 인덱스(BITPIXEL, HORZSIZE, VERTSIZE 등)에 해당하는 DC 정보를 반환
    5. 바탕화면을 별도의 이미지 파일로 저장
    6. void CSaveGrayDemoView::OnRButtonDown(UINT nFlags, CPoint point)
      {

      // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.

      //바탕화면 윈도우 객체에 대한 포인터를 얻음
      CWnd* pWndDesktop = GetDesktopWindow();
      CWindowDC SrcDC(pWndDesktop);
      CClientDC dc(this);

       

      //바탕화면 윈도우의 크기를 알아낸다.
      CRect Rect;
      pWndDesktop->GetWindowRect(&Rect);

       

      //바탕화면 크기 및 색상수와 동일한 비트맵 이미지를 만든다.
      CImage Image;
      int cx = Rect.Width();
      int cy = Rect.Height();
      Image.Create(cx, cy, SrcDC.GetDeviceCaps(BITSPIXEL));

       

      //이미지 DC와 화면 DC에 바탕화면 윈도우 DC를 출력한다.
      CDC* pDC = CDC::FromHandle(Image.GetDC());
      pDC->BitBlt(0, 0, cx, cy, &SrcDC, 0, 0, SRCCOPY);
      dc.BitBlt(0, 0, cx, cy, pDC, 0, 0, SRCCOPY);
      Image.ReleaseDC();

       

      //JPEG 형식으로 바탕 화면 이미지를 저장한다.
      Image.Save(TEXT("desktop.jpg"), Gdiplus::ImageFormatJPEG);

       

      //저장된 이미지를 뷰어를 실행하여 보여준다.
      ::ShellExecute(NULL, TEXT("open"), TEXT("desktop.jpg"), NULL, NULL, SW_SHOW);
       
      CView::OnRButtonDown(nFlags, point);

      }   

      • GetWindowRect()로 바탕화면 윈도우 크기 얻어옴
      • CImage 클래스의 Save() 함수는 현재 선택한 비트맵 이미지를 주어진 파일 형식으로 변환하여 저장 
      • ::ShellExecute() API 함수를 이용하여 이미지 파일 실행


  1. GDI와 DC에 대해서
    1. GDI(Graphics Device Interface)는 윈도우 운영체제가 제공하는 그래픽 출력 서비스 구조(인터페이스)
    2. 개발자는 제조사별 VGA 사용법을 알 필요 없이 GDI만 알면 된다.
    3. DC(Device Context)는 GDI를 추상화한 객체
    4. 개발자는 DC를 이용해 각종 그래픽 정보를 모니터에 출력
  2. WM_PAINT 메시지와 DC
    1. WM_PAINT 메시지는 윈도우를 다시 그려야 할 때 발생
    2. WM_PAINT 메시지 핸들러 함수(OnPaint())에서 그림 출력 코드 수행
    3. CDC 클래스는 DC를 객체화한 클래스
    4. GetDC() <-> ReleaseDC()
    5. DC는 특정 윈도우와 연결 됨
    6. CDC 클래스
       파생 클래스

      의미 

       CClientDC

       윈도우의 클라이언트 영역으로 한정되는 DC
       CWindowDC

       윈도우의 모든 영역(비클라이언트 영역 포함)에 대한 DC. 이 DC를 이용하면 다른 윈도우에 대해서 그리기 가능.

       CPaintDC

       CClientDC 클래스와 유사하지만, 내부적으로 BefinPaint()/EndPaint() 함수를 호출하여 WM_ERASEBKGND 메시지 발생.

       CMetaFileDC

       WMF(Window Meta File)와 EMF(Enhanced Meta File) 파일에 대한 DC

  3. 펜(Pen)과 브러시(Brush)
    1. DC의 대표적인 속성인 펜과 브러시
    2. 펜과 브러시의 속성을 변경할 수 있다.
      -> dc.SelectObject()
      1. CPen  클래스는 세 가지로 다중 정의가 되어 있다.
      2. PS_SOLID 등의 기본 펜 스타일 존재
      3. PS_ENDCAP_ROUND 등의 끝 부분 처리 스타일 존재
    3. 브러시
      1. HS_BDIAGONAL 등의 스타일 존재
      2. 비트맵 브러시, 패턴 브러시
    4. 각종 도형 그리기
      1. 각각의 선이 모여 하나의 도형을 이루도록 하려면 코드상으로 명시를 해주어야 도형으로 인식한다.
      2. PS_JOIN_XXX 펜 스타일, dc.BeginPath(), dc.EndPath(), dc.StrokeAndFillPath()
      3. 같은 원리로 CDC 클래스의 Polygon() 메서드를 사용해도 된다.
      4. dc.Rectangle(), dc.Ellipse(), dc.Pie(), dc.RoundRect()
    5. 글꼴(Font)과 문자열 다루기
      1. dc.TexOut()
      2. CFont 클래스는 글꼴을 객체화한 클래스
      3. CFont 클래스의 CreateFontIndirect() 메서드는 LOGFONT 구조체의 정보를 기반으로 CFont 클래스 객체를 생성
      4. LOGFONT 구조체의 멤버를 통해 글꼴의 크기, 장평, 기울기, 굵기, 이탤릭 등의 속성을 줄 수 있다.
      5. 탭을 반영하기 위한 dc.TabbedTextOut()
    6. 직접 버튼 컨트롤 구현하기
      1. dc.FillSolidRect(), ::GetSysColor(), dc.Draw3dRect(), DrawText()

    DirectX 관련 라이브러리들 중 그들이 배포하는 basetsd.h 파일에
    POINTER_64 라는 키워드에 대한 define 이 빠져있기 때문에 발생

    (왜 빠져 있을까...)

    나의 경우

    C:\Program Files\DXSDK\Include\basetsd.h에 아래 코드 추가

     

    #if (_MSC_VER >= 1300) && !(defined(MIDL_PASS) || defined(RC_INVOKED))
    #define POINTER_64 __ptr64
    #else
    #define POINTER_64
    #endif

     

    http://hashs.tistory.com/91
    스크랩2 참조

    http://blog.naver.com/websmilemax/150022743084

    What is the SDK?

    SDK(Software Development Kits)는 특정 SW package, framework platform, console 또는 OS를 위한 어플리케이션을 만들도록 도와주는 도구들의 집합이다. frameworks, libraries, header files, compilers, debuggers 및 다른 다양한 도구들를 포함한다.

     

    What is the IDE?

    IDE(Integrated Development Environment)는 어플리케이션을 작성하고 설계하기 위한 환경이다. user-friendly한 환경을 제공한다. 일반적으로 소스코드 편집기, 컴파일러 및 디버거를 포함하며 이들이 한데 모여 동작함으로써 소프트웨어를 더욱 효과적으로 빌드할 수 있도록 돕는다.

     

    즉, SDK만 설치해도 개발은 할 수 있지만 IDE를 사용함으로써 편리하게 개발 할 수 있다.

     

    References:

    http://bytes.com/topic/software-development/answers/910050-what-difference-between-ide-sdk

     

     

    모달리스 대화상자 생성 시:

    if(m_pPParamDlg == NULL)
    {
        m_pPParamDlg = new CPParamDlg(this);
        m_pPParamDlg->Create(IDD_PPARAMDLG);
        m_pPParamDlg->ShowWindow(SW_SHOW);
    }

     

    모달리스 대화상자 종료 시:

    m_pPParamDlg->DestroyWindow();
    delete m_pPParamDlg;
    m_pPParamDlg = NULL;

     

    http://blog.naver.com/sangtakeg/120069429014

    + Recent posts