#include #include "teht1.rh" #include //********************************************************************************************* class CImage { //********************************************************************************************* CBitmap *m_bmpImage; CBitmap *m_bmpMask; BITMAP infoImage; BITMAP infoMask; CSize m_Size; public: CImage(UINT nIDImage=0, UINT nIDMask=0); int SetImage(UINT nIDImage) { if(m_bmpImage) { m_bmpImage->DeleteObject(); delete m_bmpImage; m_bmpImage=NULL; }; if(nIDImage) { m_bmpImage = new CBitmap; if(!m_bmpImage->LoadBitmap(nIDImage)) return 0; m_bmpImage->GetBitmap(&infoImage); }; return 1; }; int SetMask(UINT nIDMask) { if(m_bmpMask) { m_bmpMask->DeleteObject(); delete m_bmpMask; m_bmpMask=NULL; }; if(nIDMask) { m_bmpMask = new CBitmap; if(!m_bmpMask->LoadBitmap(nIDMask)) return 0; m_bmpMask->GetBitmap(&infoMask); }; return 1; }; void SetWidth(int w) { m_Size.cx=w; }; void SetHeight(int h) { m_Size.cy=h; }; void SetSize(int w,int h) { m_Size.cx=w; m_Size.cy=h; }; virtual ~CImage() { SetImage(0); SetMask(0); }; BOOL DrawTo(POINT pt, CDC* pDC); }; //--------------------------------------------------------------- CImage::CImage(UINT nIDImage, UINT nIDMask) //--------------------------------------------------------------- { m_bmpImage = NULL; m_bmpMask = NULL; m_Size.cx = 0; m_Size.cy = 0; //Load pictures SetImage(nIDImage); SetMask(nIDMask); }; //--------------------------------------------------------------- BOOL CImage::DrawTo(POINT pt, CDC* pDC) //--------------------------------------------------------------- { CDC ImageDC,TempDC,MaskDC,TempImageDC; CBitmap *Old,*MaskOld, MaskBmp,ImageBmp; CWnd *Wnd; CRect R; //Get parent window area, maybe not needed Wnd = pDC->GetWindow(); Wnd->GetClientRect(R); ImageDC.CreateCompatibleDC(pDC); Old = ImageDC.SelectObject(m_bmpImage); //Piirretään kuvat if(m_bmpMask == NULL) { if(m_Size.cx==0 && m_Size.cy==0) pDC->BitBlt(pt.x,pt.y,infoImage.bmWidth,infoImage.bmHeight,&ImageDC,0,0,SRCCOPY); else pDC->StretchBlt(pt.x,pt.y,m_Size.cx,m_Size.cy,&ImageDC,0,0, infoImage.bmWidth,infoImage.bmHeight,SRCCOPY); } else { if(m_Size.cx==0 && m_Size.cy==0) pDC->MaskBlt( pt.x,pt.y,infoImage.bmWidth,infoImage.bmHeight,&ImageDC,0,0, *m_bmpMask,0,0,MAKEROP4(SRCCOPY,SRCAND)); else { //Tässä tulee hieman vaikeuksia TempDC.CreateCompatibleDC(pDC); //Stretch mask to MaskDC MaskOld = TempDC.SelectObject(m_bmpMask); MaskDC.CreateCompatibleDC(&TempDC); MaskDC.StretchBlt(0,0,m_Size.cx,m_Size.cy,&TempDC, 0,0,infoMask.bmWidth,infoMask.bmHeight, SRCCOPY); MaskBmp.CreateCompatibleBitmap(&MaskDC,m_Size.cx,m_Size.cy); pDC->BitBlt(pt.x,pt.y,m_Size.cx,m_Size.cy,&MaskDC,0,0,SRCCOPY); TempDC.SelectObject(MaskOld); //Strecth image to ImageDC /*TempImageDC.CreateCompatibleDC(pDC); TempImageDC.StretchBlt(0,0,m_Size.cx,m_Size.cy,&ImageDC,0,0, CBitmap infoImage.bmWidth,infoImage.bmHeight,SRCCOPY); //Then do masking pDC->MaskBlt( pt.x,pt.y,m_Size.cx,m_Size.cy,&TempImageDC,0,0, MaskBmp,0,0,MAKEROP4(SRCCOPY,SRCAND));*/ }; }; ImageDC.SelectObject(Old); return TRUE; }; //********************************************************************************************* class COmaWin : public CFrameWnd //********************************************************************************************* { CImage m_Kuva; public: COmaWin() { Create(NULL,"Bitmap Test"); m_Kuva.SetImage(IDB_FACE); m_Kuva.SetSize(200,140); m_Kuva.SetMask(IDB_FACEMASK); }; afx_msg BOOL OnEraseBkgnd( CDC* pDC ); DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(COmaWin,CFrameWnd) ON_WM_ERASEBKGND() END_MESSAGE_MAP() //--------------------------------------------------------------- afx_msg BOOL COmaWin::OnEraseBkgnd( CDC* pDC ) //--------------------------------------------------------------- { CPen *OldPen,*NewPen; CRect R; GetClientRect(R); NewPen = new CPen(PS_SOLID,2,RGB(10,10,10)); OldPen = pDC->SelectObject(NewPen); pDC->FillSolidRect(0,0,R.Width(),R.Height(),RGB(234,122,200)); m_Kuva.DrawTo(CPoint(10,10),pDC); /*pDC->MoveTo(0,0); pDC->LineTo(R.Width(),R.Height()); pDC->MoveTo(R.Width(),0); pDC->LineTo(0,R.Height());*/ pDC->SelectObject(OldPen); delete NewPen; return TRUE; }; //********************************************************************************************* class COmaApp : public CWinApp //********************************************************************************************* { virtual BOOL InitInstance() { COmaWin *p = new COmaWin; m_pMainWnd = p; p->ShowWindow(SW_SHOW); p->UpdateWindow(); return TRUE; }; }; COmaApp OmaApp;