19,464
社区成员
发帖
与我相关
我的任务
分享
//绘图程序
void CMyDlg::OnDrawjpg(CString strPathname,int cx,int cy,float zoom)
{
//在矩形区域内显示jpg图像
CClientDC dc(this);
//创建Graphics对象
Graphics graphics(dc);
SafeDeleteImage();
m_pImage = Image::FromFile(strPathname.AllocSysString());
width = (int)(m_pImage->GetWidth()*zoom);
height = (int)(m_pImage->GetHeight()*zoom);
destPoints1[0] = Point(cx,cy);
destPoints1[1] = Point(cx+width,cy);
destPoints1[2] = Point(cx,cy+height);
if(graphics.DrawImage(m_pImage,destPoints1,3) != Ok)//如果绘图失败,就重新绘一次
{
OnDrawjpg(strPathname,cx,cy,zoom);
}
}
//调用
BOOL CMyDlg::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_ESCAPE) //按Esc时图片抖动
{
for (int i= 0;i<10 ;i++)
{
OnDrawjpg(strPicPathname[0],rand()*20.0/0x7fff,0-rand()*20.0/0x7fff,1);
Sleep(rand()*20.0/0x7fff);
OnDrawjpg(strPicPathname[0],0-rand()*20.0/0x7fff,0-rand()*20.0/0x7fff,1);
Sleep(rand()*20.0/0x7fff);
OnDrawjpg(strPicPathname[0],0-rand()*20.0/0x7fff,rand()*20.0/0x7fff,1);
Sleep(rand()*20.0/0x7fff);
OnDrawjpg(strPicPathname[0],rand()*20.0/0x7fff,rand()*20.0/0x7fff,1);
Sleep(rand()*20.0/0x7fff);
}
Sleep(10);
::SetForegroundWindow(m_hWnd);
//最后恢复原样。
OnDrawjpg(strPicPathname[0],0,0,1);
return TRUE;
}
}
public:
CString strPathname;//路径设成全局的,每次改动图片只需要重新赋值即可,
//去掉了Image *m_pImage;的声明,因为这个类实在是不好用,最好是用临时变量,我估计内存泄露就是出在这个东西上。 BOOL CIrregularDlg::OnInitDialog()
{
//........
strPathname = "E-Mail.png"; //路径初始图片
return TRUE;
}void CIrregularDlg::OnDrawjpg( CDC* pdc, int cx, int cy, float zoom)
{ // 函数这么改造,是为了引入内存DC句柄绘图。
Image m_pImage( strPathname.AllocSysString() ); //还是用临时变量吧,即便是你要改文件,改strPathname比较安全一点
Graphics graphics(pdc->m_hDC);
INT width = (int)(m_pImage.GetWidth()*zoom);
INT height = (int)(m_pImage.GetHeight()*zoom);
Point destPoints1[3];
destPoints1[0] = Point(cx,cy);
destPoints1[1] = Point(cx+width,cy);
destPoints1[2] = Point(cx,cy+height);
if(graphics.DrawImage(&m_pImage,destPoints1,3) != Ok)//如果绘图失败,就重新绘一次
{
OnDrawjpg( pdc,cx,cy,zoom);
}
}BOOL CIrregularDlg::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_ESCAPE) //按Esc时图片抖动
{
CDC *pdc=this->GetDC();
CDC MenDC;
CBitmap bm;
RECT rt;
GetClientRect(&rt); //得到窗口大小,这里根据自己需要更改
MenDC.CreateCompatibleDC(pdc); //创建内存DC
bm.CreateCompatibleBitmap(pdc,rt.right,rt.bottom);
MenDC.SelectObject(&bm);
//-------------------------------------------------------------------
for (int i= 0;i<10 ;i++)
{
MenDC.FillSolidRect(0,0,rt.right,rt.bottom,RGB(255,255,255)); //每次都先将窗口填充为白色,这里需要主要,如果是对话框 连
//上面的控件也会被覆盖了,如果不想覆盖只能想别的办法了。
OnDrawjpg(&MenDC,rand()*20.0/0x7fff,0-rand()*20.0/0x7fff,1);
Sleep(rand()*20.0/0x7fff);
pdc->BitBlt(0,0,rt.right,rt.bottom,&MenDC,0,0,SRCCOPY);
MenDC.FillSolidRect(0,0,rt.right,rt.bottom,RGB(255,255,255));
OnDrawjpg(&MenDC,0-rand()*20.0/0x7fff,0-rand()*20.0/0x7fff,1);
Sleep(rand()*20.0/0x7fff);
pdc->BitBlt(0,0,rt.right,rt.bottom,&MenDC,0,0,SRCCOPY);
MenDC.FillSolidRect(0,0,rt.right,rt.bottom,RGB(255,255,255));
OnDrawjpg(&MenDC,0-rand()*20.0/0x7fff,rand()*20.0/0x7fff,1);
Sleep(rand()*20.0/0x7fff);
pdc->BitBlt(0,0,rt.right,rt.bottom,&MenDC,0,0,SRCCOPY);
MenDC.FillSolidRect(0,0,rt.right,rt.bottom,RGB(255,255,255));
OnDrawjpg(&MenDC,rand()*20.0/0x7fff,rand()*20.0/0x7fff,1);
Sleep(rand()*20.0/0x7fff);
pdc->BitBlt(0,0,rt.right,rt.bottom,&MenDC,0,0,SRCCOPY);
}
Sleep(10);
//::SetForegroundWindow(m_hWnd); 这句有没有好像没有关系
MenDC.FillSolidRect(0,0,rt.right,rt.bottom,RGB(255,255,255));
OnDrawjpg(&MenDC,0,0,1);
//-------------------------------------------------------------------
pdc->BitBlt(0,0,rt.right,rt.bottom,&MenDC,0,0,SRCCOPY);
MenDC.DeleteDC();
bm.DeleteObject();
ReleaseDC(pdc);
return TRUE;
}
return CDialog::PreTranslateMessage(pMsg);
}void CMyDlg::SafeDeleteImage()
{
if(m_pImage != NULL)
{
delete m_pImage;
m_pImage = NULL;
}
}???????????????????????????????????????
#define UNICODE
#ifndef ULONG_PTR
#define ULONG_PTR unsigned long*
#endif
#include "gdiplus.h" //请修改为你的头文件路径
using namespace Gdiplus;
BOOL CMyApp::InitInstance()
{
……
……
//////////////////////////////////////////////////////////////////////////
//初始化gdiplus的环境
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
// Initialize GDI+.
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); //是这个初始化吗?
//////////////////////////////////////////////////////////////////////////
CMyDlg dlg;
m_pMainWnd = &dlg;
……
……
//////////////////////////////////////////////////////////////////////////
//关闭gdiplus的环境
GdiplusShutdown(gdiplusToken);
//////////////////////////////////////////////////////////////////////////
// Since the dialog has been closed, return FALSE so that we exit the
// application, rather than start the application's message pump.
return FALSE;
}
//////////////////////////////////////////////////////////////////////////
#define UNICODE
#ifndef ULONG_PTR
#define ULONG_PTR unsigned long*
#endif
#include "gdiplus.h"
using namespace Gdiplus;
#pragma comment(lib, "gdiplus.lib")
//////////////////////////////////////////////////////////////////////////
void CMyDlg::SafeDeleteImage()
{
if(m_pImage != NULL)
{
delete m_pImage;
m_pImage = NULL;
}
}
void CIrregularDlg::OnDrawjpg(CString strPathname, int cx, int cy, float zoom)
{
//在矩形区域内显示jpg图像
CClientDC dc(this);
//创建Graphics对象
Graphics graphics(dc);
// SafeDeleteImage(); //我声明的临时变量,不知道你这句是做什么用的。
Image *m_pImage;
m_pImage = Image::FromFile(strPathname.AllocSysString());
INT width = (int)(m_pImage->GetWidth()*zoom);
INT height = (int)(m_pImage->GetHeight()*zoom);
Point destPoints1[3];
destPoints1[0] = Point(cx,cy);
destPoints1[1] = Point(cx+width,cy);
destPoints1[2] = Point(cx,cy+height);
if(graphics.DrawImage(m_pImage,destPoints1,3) != Ok)//如果绘图失败,就重新绘一次
{
OnDrawjpg(strPathname,cx,cy,zoom);
}
delete m_pImage; //把临时变量指针删除
}
BOOL CIrregularDlg::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_ESCAPE) //按Esc时图片抖动
{
for (int i= 0;i<10 ;i++)
{
OnDrawjpg("E-Mail.png",rand()*20.0/0x7fff,0-rand()*20.0/0x7fff,1);
Sleep(rand()*20.0/0x7fff);
OnDrawjpg("E-Mail.png",0-rand()*20.0/0x7fff,0-rand()*20.0/0x7fff,1);
Sleep(rand()*20.0/0x7fff);
OnDrawjpg("E-Mail.png",0-rand()*20.0/0x7fff,rand()*20.0/0x7fff,1);
Sleep(rand()*20.0/0x7fff);
OnDrawjpg("E-Mail.png",rand()*20.0/0x7fff,rand()*20.0/0x7fff,1);
Sleep(rand()*20.0/0x7fff);
}
Sleep(10);
::SetForegroundWindow(m_hWnd);
//最后恢复原样。
OnDrawjpg("E-Mail.png",0,0,1);
return TRUE;
}
return CDialog::PreTranslateMessage(pMsg); //这句不能少,少了程序没法用
}