首页 分享 C++桌面宠物

C++桌面宠物

来源:萌宠菠菠乐园 时间:2024-11-15 20:40

// MGoldFishWnd.cpp : 实现文件 // #include "stdafx.h" #include "lrPrint.h" #include "GoldFish.h" // GoldFish IMPLEMENT_DYNAMIC(GoldFish, CWnd) GoldFish::GoldFish() { } GoldFish::~GoldFish() { } BEGIN_MESSAGE_MAP(GoldFish, CWnd)ON_WM_CREATE()ON_WM_TIMER()ON_WM_DESTROY()ON_WM_LBUTTONDOWN()ON_WM_LBUTTONUP()ON_WM_MOUSEMOVE()ON_WM_RBUTTONDBLCLK()ON_WM_SIZE() END_MESSAGE_MAP() // GoldFish 消息处理程序 int GoldFish::OnCreate(LPCREATESTRUCT lpCreateStruct) {if (CWnd::OnCreate(lpCreateStruct) == -1)return -1;SetWindowText(L"MGoldFish");m_nIDEvent = TIME_ID;SetTimer(m_nIDEvent, 50, NULL);hFuncInst = LoadLibrary(L"User32.DLL");BOOL bRet=FALSE;if(hFuncInst)UpdateLayeredWindow = (MYFUNC)GetProcAddress(hFuncInst, "UpdateLayeredWindow");else{//AfxMessageBox("User32.dll ERROR!");exit(0);}ImageFromIDResource(IDB_PNG_LEFT, L"PNG",m_pImageLeft);ImageFromIDResource(IDB_PNG_RIGHT, L"PNG",m_pImageRight);m_BakWidth = m_pImageLeft->GetWidth()/20;m_BakHeight = m_pImageLeft->GetHeight();frame = 0;mouseDown = false;haveHandle = false;MaxCount = 50;stepX = 2;stepY = 0;count = 0;speedMode = false;left = 0;top = 0;toRight = true;frameCount = 20;frame = 0;frameWidth = 100;frameHeight = 100;oldPoint.x = 0;oldPoint.y = 0;m_Blend.BlendOp=0;m_Blend.BlendFlags=0;m_Blend.AlphaFormat=1;m_Blend.SourceConstantAlpha=255;sizeWindow.cx = m_BakWidth,sizeWindow.cy = m_BakHeight;ptSrc.x = 0;ptSrc.y = 0;//ModifyStyle(WS_CAPTION,0,SWP_FRAMECHANGED);//去除标题栏ModifyStyleEx (WS_EX_APPWINDOW, WS_EX_TOOLWINDOW );//去除任务栏窗口对应按钮::SetWindowPos(m_hWnd, HWND_TOPMOST,300,300, m_pImageLeft->GetWidth()/20, m_pImageLeft->GetHeight(),SWP_NOSIZE|SWP_NOMOVE);DWORD dwExStyle=::GetWindowLong(m_hWnd,GWL_EXSTYLE);if((dwExStyle&0x80000)!=0x80000)::SetWindowLong(m_hWnd,GWL_EXSTYLE,dwExStyle^0x80000);return 0; } void GoldFish::OnTimer(UINT_PTR nIDEvent) {if ( m_nIDEvent != nIDEvent )CWnd::OnTimer(nIDEvent);else{if (!mouseDown){count++;if (count > MaxCount){MaxCount = rand()*(70-0)/RAND_MAX+70 + 30;//if (speedMode) timerSpeed.Interval = 50;count = 0;float r = (float)rand()/(float)RAND_MAX;stepX = r * 3 + 0.5f;stepY = ( r - 0.5f) * 0.5f;}left = (int)(left + (toRight ? 1 : -1) * stepX);top = (int)(top + stepY);FixLeftTop();::SetWindowPos(m_hWnd, HWND_TOPMOST, left, top, m_pImageLeft->GetWidth()/20 , m_pImageLeft->GetHeight(),SWP_SHOWWINDOW);TRACE2("left=%d, top=%dn", left, top);//this.Left = (int)left;//this.Top = (int)top;}frame++;if (frame >= frameCount) frame = 0;UpdateFishDisplay();} } void GoldFish::OnDestroy() {KillTimer(m_nIDEvent);CleanBitmap();delete m_pImageLeft;delete m_pImageRight;FreeLibrary(hFuncInst);CWnd::OnDestroy(); } void GoldFish::OnLButtonDown(UINT nFlags, CPoint point) {//禁止显示移动矩形窗体框::SystemParametersInfo(SPI_SETDRAGFULLWINDOWS,TRUE,NULL,0);//非标题栏移动整个窗口////SendMessage(WM_SYSCOMMAND,0xF012,0);//PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x,point.y));//CDialog::OnLButtonDown(nFlags, point);oldPoint = point;mouseDown = true;CWnd::OnLButtonDown(nFlags, point); } void GoldFish::OnLButtonUp(UINT nFlags, CPoint point) {count = 0;MaxCount = rand()*(70-0)/RAND_MAX+70 + 40;//timerSpeed.Interval = new Random().Next(20) + 2;speedMode = true;mouseDown = false;CWnd::OnLButtonUp(nFlags, point); } void GoldFish::OnMouseMove(UINT nFlags, CPoint point) {if (mouseDown){left += (point.x - oldPoint.x);//就这里top += (point.y - oldPoint.y);::SetWindowPos(m_hWnd, HWND_TOPMOST, left,top, m_pImageLeft->GetWidth()/20 , m_pImageLeft->GetHeight(),SWP_SHOWWINDOW);FixLeftTop();}CWnd::OnMouseMove(nFlags, point); } void GoldFish::OnRButtonDblClk(UINT nFlags, CPoint point) {PostQuitMessage(0);SendMessage(WM_CLOSE, 1, 0);CWnd::OnRButtonDblClk(nFlags, point); } void GoldFish::OnSize(UINT nType, int cx, int cy) {CWnd::OnSize(nType, cx, cy);rcSize.cx = cx;rcSize.cy = cy;CreateBitmap(); } BOOL GoldFish::ImageFromIDResource(UINT nID, LPCTSTR sTR,Image * &pImg) {HINSTANCE hInst = AfxGetResourceHandle();HRSRC hRsrc = ::FindResource (hInst, MAKEINTRESOURCE(nID), sTR); // typeif (!hRsrc)return FALSE;// load resource into memoryDWORD len = SizeofResource(hInst, hRsrc);BYTE* lpRsrc = (BYTE*)LoadResource(hInst, hRsrc);if (!lpRsrc)return FALSE;// Allocate global memory on which to create streamHGLOBAL m_hMem = GlobalAlloc(GMEM_FIXED, len);BYTE* pmem = (BYTE*)GlobalLock(m_hMem);memcpy(pmem,lpRsrc,len);IStream* pstm;CreateStreamOnHGlobal(m_hMem,FALSE,&pstm);// load from streampImg=Gdiplus::Image::FromStream(pstm);// free/release stuffGlobalUnlock(m_hMem);pstm->Release();FreeResource(lpRsrc);return TRUE; } void GoldFish::UpdateFishDisplay() {CreateBitmap();RECT rct;GetWindowRect(&rct);POINT ptWinPos={rct.left,rct.top};Graphics graph(m_hMemDC);if (toRight)graph.DrawImage(m_pImageRight,0,0, m_BakWidth*frame,0,m_BakWidth,m_BakHeight,UnitPixel);elsegraph.DrawImage(m_pImageLeft,0,0, m_BakWidth*frame,0,m_BakWidth,m_BakHeight,UnitPixel);BOOL bRet=FALSE;bRet= UpdateLayeredWindow( m_hWnd,m_hWinDC,&ptWinPos,&sizeWindow, m_hMemDC,&ptSrc,0,&m_Blend,ULW_ALPHA);graph.ReleaseHDC(m_hMemDC);CleanBitmap();// } void GoldFish::FixLeftTop() {int scr_with= GetSystemMetrics(SM_CXFULLSCREEN);int scr_heigh= GetSystemMetrics(SM_CYFULLSCREEN);if (toRight && left > scr_with){toRight = false;frame = 0;count = 0;}else if (!toRight && left < -frameWidth){toRight = true;frame = 0;count = 0;}if (top < -frameHeight){stepY = 1;count = 0;}else if (top > scr_heigh){stepY = -1;count = 0;} } void GoldFish::CreateBitmap() {if(rcSize.cx <= 0 || rcSize.cy <= 0){// no place to do a bitmap, then get outreturn;}ATLTRACE(_T("GoldFish::CreateBitmap()n"));if (m_hMemDC != NULL){::SelectObject(m_hMemDC, m_hBitmap);DeleteDC(m_hMemDC);m_hMemDC = NULL;m_pOldBitmap = NULL;}if (m_hWinDC != NULL){//::SelectObject(m_hWinDC,m_hPalette);DeleteDC(m_hWinDC);m_hWinDC = NULL;//m_pOldPalette = NULL;}if (m_hBitmap != NULL)DeleteObject(m_hBitmap);// rcSize is the cached size of the window that was// set during the call to IOleInPlaceObject_SetObjectRects_ASSERTE(rcSize.cx != 0);_ASSERTE(rcSize.cy != 0);m_hWinDC = *(GetDC());_ASSERTE(m_hWinDC);HBITMAP hBitmap = CreateCompatibleBitmap(m_hWinDC,m_BakWidth,m_BakHeight);_ASSERTE(hBitmap);m_hBitmap = hBitmap;m_hMemDC = CreateCompatibleDC(m_hWinDC);_ASSERTE(m_hMemDC);m_pOldBitmap = (HBITMAP)::SelectObject(m_hMemDC, m_hBitmap ); } void GoldFish::CleanBitmap() {if (m_hMemDC != NULL){::SelectObject(m_hMemDC, m_hBitmap);DeleteDC(m_hMemDC);m_hMemDC = NULL;m_pOldBitmap = NULL;}if (m_hWinDC != NULL){//::SelectObject(m_hWinDC,m_hPalette);DeleteDC(m_hWinDC);m_hWinDC = NULL;}if (m_hBitmap != NULL)DeleteObject(m_hBitmap); }

相关知识

【C语言/C++】桌面宠物开发(纳西妲)!程序员教你如何把喜欢的角色做成随便把玩的桌面宠物,源码可分享!
【C/C++技术教学】Qt自制桌面宠物!思路分析+代码演示丨程序员教你如何把喜欢的角色做成随便把玩的桌面宠物!
【QT项目实战】自制桌面宠物!当我学了qt窗口开发之后,就把原神的纳西妲做成了桌面宠物!
QQ宠物桌面是怎么开发的
a=b++,c++和a=(b++,c++)的区别
C++中+= 是什么意思
桌面电子蟑螂:互动模拟宠物游戏介绍
基于python的桌面宠物需要配置什么环境
C++程序设计(上)练习
C++第二天

网址: C++桌面宠物 https://www.mcbbbk.com/newsview564640.html

所属分类:萌宠日常
上一篇: 金鱼算不算宠物???
下一篇: 金鱼的种类有哪些

推荐分享