냅다 출력화면부터 보고!
#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.cpp에 추가하는 코드
//이 코드는 RGB를 흑백화 하는 코드이다.
/////////////////////////////////
//이 코드는 RGB를 흑백화 하는 코드이다.
void CSaveGrayDemoView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
CWnd* pWndDesktop = GetDesktopWindow();
CWindowDC ScrDC(pWndDesktop); //바탕화면 윈도우 DC
CClientDC dc(this); //뷰 윈도우 DC
CImage Image;
Image.Create(300,300,ScrDC.GetDeviceCaps(BITSPIXEL)); //바탕화면 크기 및 색상수와 동일한 비트맵 이미지를 만든다.
CDC* pDC = CDC::FromHandle(Image.GetDC());
pDC->BitBlt(0,0,300,300, &ScrDC, 0, 0, SRCCOPY);
Image.ReleaseDC(); //이미지 DC와 화면 DC에 바탕화면 윈도우 DC를 출력한다.
COLORREF rgb;
for(int x = 0; x<200; x++)//폭
{
for(int y = 0; y <200; ++y)//높이
{
rgb = Image.GetPixel(x,y);
//여기부터
RGBtoGray(rgb);
Image.SetPixel(x,y,rgb); //Gray RGB값으로 변환
}
}
Image.BitBlt(dc.m_hDC,0,0); //흑백으로 변환된 이미지를 화면 DC에 출력
CView::OnLButtonDown(nFlags, point);
}
해당 코드대로 입력한 경우 + 윈도우창을 바탕화면상의 왼쪽 위에 둔채로 마우스 클릭을 하게되면 위과 같은 출력화면이 나온다. 바탕화면 일부분 스캔 + 일부분 흑백화 [클릭으로 출력활성화되며 onpaint가 아니고 OnLButtonDown이므로 윋도우 크기변경이나 이동겹침등으로 지워질 수 있다.
CImage 클래스의 Create()메서드의 원형은 다음과 같다.
BOOL CImage::Create( int nWidth, int nHeight, int nBPP, DWORD dwFlags = 0) throw() ;
마지막 인자의 기본값이 0이며 이번 예제에서도 이 값을 사용하였다.
이 인자는 32비트 비트맵의 경우에 알파채널을 명시한다. 세번째 인자인 int nBPP 가 반드시 32 가 되어야 알파채널 을 명시할 수있다.
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
다음은 해당 프로젝트에서 우클릭 을 하면 바탕화면을 별도의 이미지 파일로 저장하여 보여주는 코드이다.
이 역시 핸들러를 통해 추가하고 코드를 넣는다.
void CSaveGrayDemoView::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
CWnd* pWndDesktop = GetDesktopWindow();
CWindowDC ScrDC(pWndDesktop); //바탕화면 윈도우 DC
CClientDC dc(this); //뷰 윈도우 DC
CRect Rect;
pWndDesktop->GetWindowRect(&Rect); //바탕화면 윈도우의 크기를 알아낸다.
CImage Image; //바탕화면 크기 및 색상수와 동일한 비트맵 이미지를 만든다.
int cx = Rect.Width(); //바탕화면의높이
int cy = Rect.Height(); //바탕화면의 넓이
Image.Create(cx,cy,ScrDC.GetDeviceCaps(BITSPIXEL));
CDC* pDC = CDC::FromHandle(Image.GetDC());
pDC->BitBlt(0,0,cx,cy, &ScrDC,0,0,SRCCOPY);
dc.BitBlt(0,0,cx,cy, pDC,0,0,SRCCOPY);
Image.ReleaseDC(); //이미지 DC와 화면 DC에 바탕화면 윈도우 화면을 출력한다.
Image.Save(TEXT("Desktop.jpg"),Gdipluse::ImageFormatJPEG);
//JPEG형식으로 바탕화면 이미지를 저장한다.
::ShellExecute(NULL, TEXT("open"), TEXT("Desktop.jpg"), NULL,NULL,SW_SHOW);
CView::OnRButtonDown(nFlags, point);
}
//////////////////////////////////////////////////
바탕화면 윈도우의 크기를 알아내기 위해 GetWindowRect()함수를 사용한 부분과
이미지 저장 및 뷰어 실행을 빼면 왼클릭 함수와 크게 다르지 않다.
예제에서 Save() 함수는 현재 선택한 비트맵 이미지를 주어진 파일 형식으로 변환하여 저장하는 역할을 한다.
저장 가능한 파일 형식으로는 ImageFormatGIF,ImageFormatBMP,ImageFormatPNG 등이 있다.
마지막에 있는 ::ShellExecute 라고 쓰인 API함수는 윈도우 탐색기에서 해당 파일을 더블클릭한 것과 같은 동작을 나타내는 함수이다.
원형과 인자에 관한 설명은 은 다음과 같다.
//////////////////////////////////////////
해당 코딩 후
좌클릭을 먼저하고 우클릭을 한 경우.
이러한 화면이 캡쳐되어 뜨게된다.
또한 프로그램이 있는 위치에 Desktop.jpg 라는 파일이 하나 생기고 여기에 저 화면이 입력되어있게 된다.
마지막으로 코드가 있는 파일을 업로드.
'공부 > MFC' 카테고리의 다른 글
Visual C++ 2008 MFC Chapter 12 버튼 컨트롤 (0) | 2011.12.07 |
---|---|
Visual C++ 2008 MFC Chapter 11 컨트롤 윈도우의 기본 (0) | 2011.12.07 |
Visual C++ 2008 MFC Chapter 8 비트맵 및 이미지 처리 - 3 (0) | 2011.12.06 |
Visual C++ 2008 MFC Chapter 8 비트맵 및 이미지 처리 - 2 (0) | 2011.12.06 |
Visual C++ 2008 MFC Chapter 8 비트맵 및 이미지 처리 (0) | 2011.12.05 |