16,472
社区成员
发帖
与我相关
我的任务
分享
void CmyStatic::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CStatic::OnPaint()
GetClientRect(&rect);
m_h = rect.Height();
m_w = rect.Width()/5;
img.Load(L"D:\\1.jpg"); // filename 是要加载的文件名(包含路径) 7056k
hbitmap = img.Detach();
BITMAP m_bm;
CDC memDC;//
CBitmap memBitmap;
CDC *pDC = GetDC();
memDC.CreateCompatibleDC(NULL);//创建与目标DC相兼容的内存DC,
memBitmap.CreateCompatibleBitmap(pDC,rect.Width(), rect.Height());//根据目标DC创建位图,为什么?看后面
memDC.SelectObject(&memBitmap);//把位图选入内存DC
memDC.SetBkMode(TRANSPARENT);
if(flag == 0)
{
memDC.FillSolidRect(rect,RGB(0, 255, 0));
memDC.SetTextColor(RGB(0,0,0));
memDC.TextOut(m_w*1,m_h/3,L"2012 3/12");
}
if(flag == 1)
{
memDC.FillSolidRect(rect,RGB(0, 0, 255));
memDC.SetTextColor(RGB(255,255,255));
memDC.TextOut(m_w*1,m_h/3,L"2012 3/12");
}
GetObject(hbitmap, sizeof BITMAP, &m_bm);
CPen *pen=new CPen(PS_SOLID, 1,RGB(128, 128, 128));
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
dcMem.SelectObject(hbitmap);
//DeleteObject(hbitmap);
memDC.SelectObject(pen);
pen->DeleteObject();
delete pen;
memDC.MoveTo(0,0);
memDC.LineTo(m_w*5,0);
memDC.MoveTo(0,m_h-1);
memDC.LineTo(m_w*5,m_h-1);
memDC.StretchBlt(m_w*4, 3, m_w, m_h-6, &dcMem, 0, 0, m_bm.bmWidth, m_bm.bmHeight, SRCCOPY);
//dcMem.Detach();
dcMem.DeleteDC();
pDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(),&memDC, 0, 0,SRCCOPY);
img.Destroy();
ReleaseDC(pDC);
//memDC.Detach();
memDC.DeleteDC();
}
CPictureCtrl m_Picture;
...
m_Picture.LoadImage(_T("C:\\...\\武林外传.jpg"));
class CPictureCtrl : public CStatic
{
DECLARE_DYNAMIC(CPictureCtrl)
public:
CPictureCtrl();
virtual ~CPictureCtrl();
protected:
DECLARE_MESSAGE_MAP()
afx_msg void OnSize(UINT nType, int cx, int cy);
void ReSize(int cx, int cy);
public:
bool LoadImage(LPCTSTR pszImageFile = NULL);
afx_msg void OnPaint();
protected:
CString m_ImageFile;
CString m_Title;
CTime m_Time;
CSize m_Size;
CImage m_Thumbnail;
CRect m_ImageRect;
};
// CPictureCtrl
IMPLEMENT_DYNAMIC(CPictureCtrl, CStatic)
CPictureCtrl::CPictureCtrl()
: m_ImageFile(_T(""))
{
}
CPictureCtrl::~CPictureCtrl()
{
}
BEGIN_MESSAGE_MAP(CPictureCtrl, CStatic)
ON_WM_PAINT()
ON_WM_SIZE()
END_MESSAGE_MAP()
// CPictureCtrl 消息处理程序
bool CPictureCtrl::LoadImage(LPCTSTR pszImageFile)
{
ASSERT(GetSafeHwnd());
if (pszImageFile == NULL)
{
if (m_ImageFile.IsEmpty())
{
return false;
}
}
else
{
m_ImageFile = pszImageFile;
}
if (!PathFileExists(m_ImageFile))
{
return false;
}
m_Title = PathFindFileName(m_ImageFile);
WIN32_FILE_ATTRIBUTE_DATA fa = {0};
if (GetFileAttributesEx(m_ImageFile, GetFileExInfoStandard, &fa))
{
m_Time = fa.ftLastWriteTime;
}
RECT rc;
GetClientRect(&rc);
ReSize(rc.right - rc.left, rc.bottom - rc.top);
return true;
}
void CPictureCtrl::ReSize(int cx, int cy)
{
CImage img;
if (FAILED(img.Load(m_ImageFile))){
return;
}
m_Size.cx = img.GetWidth();
m_Size.cy = img.GetHeight();
m_ImageRect.SetRect(0, 0, cx, cy);
m_ImageRect.DeflateRect(5, 5);
m_ImageRect.right = m_ImageRect.left + (int)(((float)m_Size.cx / (float)m_Size.cy) * (float)m_ImageRect.Height());
m_Thumbnail.Destroy();
m_Thumbnail.Create(m_ImageRect.Width(), m_ImageRect.Height(), img.GetBPP());
RECT rc = { 0, 0, m_ImageRect.Width(), m_ImageRect.Height()};
img.Draw(m_Thumbnail.GetDC(), rc, Gdiplus::InterpolationModeDefault);
m_Thumbnail.ReleaseDC();
img.Destroy();
}
void CPictureCtrl::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CStatic::OnPaint()
CRect rc;
GetClientRect(&rc);
dc.Rectangle(rc);
rc = m_ImageRect;
rc.InflateRect(1, 1);
dc.Rectangle(rc);
m_Thumbnail.BitBlt(dc, m_ImageRect, CPoint(0, 0));
CFont* pOldFont = (CFont*)dc.SelectStockObject(DEFAULT_GUI_FONT);
dc.TextOut(m_ImageRect.right + 5, m_ImageRect.top, m_Title);
CString temp;
temp = m_Time.Format(_T("%Y年%m月%d日"));
dc.SelectStockObject(DEFAULT_GUI_FONT);
dc.TextOut(m_ImageRect.right + 5, m_ImageRect.top + 20, temp);
temp.Format(_T("宽:%d,高:%d"), m_Size.cx, m_Size.cy);
dc.TextOut(m_ImageRect.right + 5, m_ImageRect.top + 35, temp);
dc.SelectObject(pOldFont);
}
void CPictureCtrl::OnSize(UINT nType, int cx, int cy)
{
CStatic::OnSize(nType, cx, cy);
// TODO: 在此处添加消息处理程序代码
ReSize(cx, cy);
}