#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 메시지 처리기
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);
}