카테고리
- typeid 를 사용하여, 기본 변수 type 정보 알아내기 2012.07.31
- 상영관 스크린 크기 비교 2012.07.23
- eclipse 4.2 구동 시 오류 2012.07.19
- GetPixel() 함수가 느린 이유 2012.07.19
- 8장 비트맵 및 이미지 처리 2012.07.04 1
- 7장 GID 기본 2012.06.28
- winnt.h C2146, C4430 "PVOID64" 컴파일에러 2012.06.27
- 작업표시줄 숨기기/나타내기 2012.06.26
- SDK & IDE 2012.06.25
- 모드형 대화상자와 비 모드형 대화상자 2012.06.21
typeid 를 사용하여, 기본 변수 type 정보 알아내기
상영관 스크린 크기 비교
eclipse 4.2 구동 시 오류
실행 시 'fail to create java virtual machine' 에러 메시지가 뜬다면
eclipse.ini 파일에 경로를 지정해 주어야 하는 것 같다.
아래와 같이 추가(경로는 본인에 맞게 변경해야 함)
-vm
C:/Program Files/Java/jdk1.7.0_05/bin/javaw.exe
GetPixel() 함수가 느린 이유
CDC 클래스의 Get/SetPixel() 함수나 CImage 클래스의 Get/SetPixel() 함수는 속도가 매우 느리다.
그 이유는 두 함수가 내부적으로 비트맵 정보를 분석하여 DDB를 DIB로 변경한 후 비트맵 데이터를 추출하고 거기서 주어진 인덱스에 해당하는 픽셀 정보를 얻는다.
이 문제를 해결하려면 한 픽셀의 정보를 가져오고 저장할 때마다 비트맵을 분석하는 것이 아니라 한 번 분석을 끝낸 후에는 더 그럴 필요가 없게 하면 된다.
Get/SetPixel() 함수를 사용할 때마다 비트맵을 분석하지 말고 한 번만 분석하도록 하자.
Get/SetPixel() 성능 향상은 아래 참조
http://dal2iya.tistory.com/126
8장 비트맵 및 이미지 처리
- 전형적인 이미지 출력
- 윈도우 프로그래밍에서 비트맵 이미지를 출력하는 전형적인 방법
- 리소스로 등록된 비트맵 이미지를 메모리 DC에 로드하여 화면 DC로 출력(BitBlt())
- 이미지의 크기를 변경(StretchBlt())
- 일부 영역을 투명하게 처리(TransparentBlt())
- 반투명하게 처리(AlphaBlend()) - 비트맵(Bitmap)에 대한 이론
- 장치 의존적인 비트맵(DDB, Device Dependent Bitmap) & 장치 독립적인 비트맵(DIB, Device Independent Bitmap)으로 나뉨
- 우리가 아는 비트맵 파일은 모두 DIB라고 보아도 무방...
- 비트맵을 우리 눈으로 보려면 DDB로 변환이 필요
- 변환 작업은 운영체제가 한다 - 비트맵 리소스 출력
- 화면 DC와 호환되는 메모리 DC
- 가령 현재 모니터가 32비트 트루 컬러라면 메모리 DC도 같게 32비트 트루 컬러로 설정
- BitBlt()
- 메모리 DC에 로드된 비트맵 이미지를 화면 DC로 전송하면 내부적으로 DIB가 DDB로 변환되어 모니터 화면에 출력
- 마지막 인자 : 래스터 연산(Raster Operation)을 어떻게 할지 명시
- SRCCOPY - 원본 그대로 화면 DC에 복사
- SRCAND - 원본과 대상을 AND 연산
- NOTSRCCOPY - 원본 이미지의 색상을 반전
- DSTINVERT - 원본 이미지와는 상관없이 대상 이미지를 반전
- 고급 이미지 출력 함수
- TransparentBlt()
- AlphaBlend()
- CImage 클래스의 활용
- Visual C++ 6.0에선 외부 이미지 파일을 로드하는게 번거로웠다. 비트맵 파일을 제외한 JPEG, PNG, GIF 와 같은 이미지 파일을 로드하려면 별도의 외부 라이브러리를 사용해야 했다.
- CImage는 다양한 형식의 파일을 지원한다.
- CImage 클래스를 사용하려면 반드시 atlimage.h 파일을 인클루드해야 한다.
- CImage 클래스는 MFC가 제공하는 ATL(ActiveX Template Library) 클래스 중 하나이다. 그래서 내부적으로 COM(Component Object Model) 객체로 구현되어 있다.
- C++의 클래스가 논리적인 코드를 객체화한 개념이라면 COM은 실행 바이너리 파일 단위(모듈 단위)로 객체화한 것이라 할 수 있다. 그래서 메서드가 반환하는 값은 HRESULT형이며, FAILED() 매크로나 SUCCEEDED() 매크로를 이용해 오류를 확인한다.
- LoadFromResource() 메서드는 비트맵 리소스를 로드하여 비트맵 이미지를 생성한다.
- 색상(Color)의 변환
- RGB 컬러를 흑백으로 변환
- 바탕화면의 일부를 변환하여 출력
- GetDesktopWindow() 메서드는 바탕화면 윈도우 객체의 포인터 반환
- CWindowDC 클래스는 비클라이언트 영역을 포함한 윈도우 전체에 대한 DC
- CDC 클래스의 GetDeviceCaps() 메서드는 인자로 전달받은 인덱스(BITPIXEL, HORZSIZE, VERTSIZE 등)에 해당하는 DC 정보를 반환
- 바탕화면을 별도의 이미지 파일로 저장
- GetWindowRect()로 바탕화면 윈도우 크기 얻어옴
- CImage 클래스의 Save() 함수는 현재 선택한 비트맵 이미지를 주어진 파일 형식으로 변환하여 저장
- ::ShellExecute() API 함수를 이용하여 이미지 파일 실행
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);
}
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);
}
{
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비트 비트맵인 경우
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);
}
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!"));
}
inline void RGBtoGray(COLORREF& rgb)
{
BYTE byGray = (GetRValue(rgb) * 30
+ GetGValue(rgb) * 59
+ GetBValue(rgb) * 11) / 100;
rgb = RGB(byGray, byGray, byGray);
}
// CSaveGrayDemoView 메시지 처리기
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);
}
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);
}
7장 GID 기본
- GDI와 DC에 대해서
- GDI(Graphics Device Interface)는 윈도우 운영체제가 제공하는 그래픽 출력 서비스 구조(인터페이스)
- 개발자는 제조사별 VGA 사용법을 알 필요 없이 GDI만 알면 된다.
- DC(Device Context)는 GDI를 추상화한 객체
- 개발자는 DC를 이용해 각종 그래픽 정보를 모니터에 출력
- WM_PAINT 메시지와 DC
- WM_PAINT 메시지는 윈도우를 다시 그려야 할 때 발생
- WM_PAINT 메시지 핸들러 함수(OnPaint())에서 그림 출력 코드 수행
- CDC 클래스는 DC를 객체화한 클래스
- GetDC() <-> ReleaseDC()
- DC는 특정 윈도우와 연결 됨
- CDC 클래스
파생 클래스 의미
CClientDC
윈도우의 클라이언트 영역으로 한정되는 DC CWindowDC 윈도우의 모든 영역(비클라이언트 영역 포함)에 대한 DC. 이 DC를 이용하면 다른 윈도우에 대해서 그리기 가능.
CPaintDC CClientDC 클래스와 유사하지만, 내부적으로 BefinPaint()/EndPaint() 함수를 호출하여 WM_ERASEBKGND 메시지 발생.
CMetaFileDC WMF(Window Meta File)와 EMF(Enhanced Meta File) 파일에 대한 DC
- 펜(Pen)과 브러시(Brush)
- DC의 대표적인 속성인 펜과 브러시
- 펜과 브러시의 속성을 변경할 수 있다.
-> dc.SelectObject() - 펜
- CPen 클래스는 세 가지로 다중 정의가 되어 있다.
- PS_SOLID 등의 기본 펜 스타일 존재
- PS_ENDCAP_ROUND 등의 끝 부분 처리 스타일 존재
- 브러시
- HS_BDIAGONAL 등의 스타일 존재
- 비트맵 브러시, 패턴 브러시
- 각종 도형 그리기
- 각각의 선이 모여 하나의 도형을 이루도록 하려면 코드상으로 명시를 해주어야 도형으로 인식한다.
- PS_JOIN_XXX 펜 스타일, dc.BeginPath(), dc.EndPath(), dc.StrokeAndFillPath()
- 같은 원리로 CDC 클래스의 Polygon() 메서드를 사용해도 된다.
- dc.Rectangle(), dc.Ellipse(), dc.Pie(), dc.RoundRect()
- 글꼴(Font)과 문자열 다루기
- dc.TexOut()
- CFont 클래스는 글꼴을 객체화한 클래스
- CFont 클래스의 CreateFontIndirect() 메서드는 LOGFONT 구조체의 정보를 기반으로 CFont 클래스 객체를 생성
- LOGFONT 구조체의 멤버를 통해 글꼴의 크기, 장평, 기울기, 굵기, 이탤릭 등의 속성을 줄 수 있다.
- 탭을 반영하기 위한 dc.TabbedTextOut()
- 직접 버튼 컨트롤 구현하기
- dc.FillSolidRect(), ::GetSysColor(), dc.Draw3dRect(), DrawText()
winnt.h C2146, C4430 "PVOID64" 컴파일에러
DirectX 관련 라이브러리들 중 그들이 배포하는 basetsd.h 파일에
POINTER_64 라는 키워드에 대한 define 이 빠져있기 때문에 발생
(왜 빠져 있을까...)
나의 경우
C:\Program Files\DXSDK\Include\basetsd.h에 아래 코드 추가
#define POINTER_64 __ptr64
#else
#define POINTER_64
#endif
http://hashs.tistory.com/91
스크랩2 참조
작업표시줄 숨기기/나타내기
SDK & IDE
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
모드형 대화상자와 비 모드형 대화상자
모달리스 대화상자 생성 시:
{
m_pPParamDlg = new CPParamDlg(this);
m_pPParamDlg->Create(IDD_PPARAMDLG);
m_pPParamDlg->ShowWindow(SW_SHOW);
}
모달리스 대화상자 종료 시:
delete m_pPParamDlg;
m_pPParamDlg = NULL;