transparentwnd.cpp
来自「一个功能挺多的」· C++ 代码 · 共 880 行 · 第 1/2 页
CPP
880 行
*********************************************************************
/*
Modified by 徐景周 2000.9
功能:动态透明位图显示及WAV资源文件播放
*/
#include "stdafx.h"
#include "TransparentWnd.h"
#include <assert.h>
#include "ScrGenius.h"
#include "ScrGeniusDlg.h"
#include "BCMenu.h" //添加位图菜单
#include <afxpriv.h> //添加对话框控件的更新响应
#include "GetIP.h"
#include "BMP2TXT.H"
#include "About.h"
#include "CustomWavFile.h"
#include "Big2GB.h"
#include "HideInBMP.h"
#include "FileSplit.h"
#include "RegOCX.h"
#include "EDStar.h"
#include "SetTimeShutdown.h"
#include "AnimEffect.h" //对话框动画效果显示
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
BCMenu popmenu; //定义位图菜单变量
#define WM_TRAYNOTIFY WM_USER + 100 //自定义系统托盘消息函数
CWnd * pFrame ;//得到当前窗体指针
CCustomWavFile *pCustomWavFile; //播放定制情话类指针
bool bWavPlay ; //声音播放标志位
bool bDragDrop; //拖动标志位
CPoint CurPoint; //记录当前鼠标位置
bool bShow=false; //窗体显示还是隐藏标志位,用于判断是否进行窗体动画
bool bMute=false; //情话静音标志位
bool bEject=true; //弹出还是关闭光驱标志位
CString strWavFileName=""; //从lovepet.dat数据文件中得到自定制情话文件名变量
CString strTextDescription="";//和文字描述变量.
//CString strTextPlay="送有情人"; //宠物上面显示的文字信息
//********************************************************************************
//* Constructor
//********************************************************************************
CTransparentWnd::CTransparentWnd()
{
bMute=false;
m_iAniSeq=0;
// m_fontLogo.CreateFont(13, 0, 90, 0, FW_NORMAL, 0, 0,0,0,0,0,0,0, "宋体");
}
//********************************************************************************
//* Destructor
//********************************************************************************
CTransparentWnd::~CTransparentWnd()
{
}
BEGIN_MESSAGE_MAP(CTransparentWnd, CWnd)
//{{AFX_MSG_MAP(CTransparentWnd)
ON_MESSAGE(WM_TRAYNOTIFY, OnTrayNotification) //自定义系统托盘消息涵数
ON_WM_PAINT()
ON_WM_ERASEBKGND()
ON_WM_LBUTTONDOWN()
ON_WM_CREATE()
ON_WM_TIMER()
ON_WM_DESTROY()
ON_WM_RBUTTONDOWN()
ON_WM_MOVING()
ON_WM_LBUTTONUP()
ON_COMMAND(IDR_SHOW, OnShow)
ON_COMMAND(IDR_REGISTER, OnRegister)
ON_COMMAND(IDR_SHUTDOWN, OnShutdown)
ON_COMMAND(IDR_EJECT, OnEject)
ON_COMMAND(IDR_EXIT, OnExit)
ON_COMMAND(ID_FILE_SEND_MAIL, OnFileSendMail)
ON_COMMAND(IDR_MUTE, OnMute)
ON_UPDATE_COMMAND_UI(IDR_MUTE, OnUpdateMute)
ON_MESSAGE(WM_KICKIDLE, OnKickIdle)
ON_COMMAND(IDR_GETIP, OnGetip)
ON_COMMAND(IDR_BMP2TXT, OnBmp2txt)
ON_COMMAND(IDR_HELP, OnHelp)
ON_COMMAND(IDR_CUSTOMWAVFILE, OnCustomwavfile)
ON_COMMAND(IDR_BIG2GB, OnBig2gb)
ON_COMMAND(IDR_HIDEINBMP, OnHideinbmp)
ON_WM_MOUSEMOVE()
ON_WM_SHOWWINDOW()
ON_COMMAND(IDR_EDSTAR, OnEdstar)
ON_COMMAND(IDR_REGOCX, OnRegocx)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
LRESULT CTransparentWnd::OnKickIdle(WPARAM wparam, LPARAM lparam)
{
UpdateDialogControls(this, false);
return 0;
}
//********************************************************************************
//* CreateTransparent()
//*
//* Creates the main application window transparent
//********************************************************************************
void CTransparentWnd::CreateTransparent(LPCTSTR pTitle, RECT &rect)
{
// 创建一个隐藏窗口
CreateEx( 0,
AfxRegisterWndClass(0,AfxGetApp()->LoadStandardCursor(IDC_ARROW)),
pTitle,
WS_POPUP ,
rect,
NULL,
NULL,
NULL);
StartBitmap(); //显示初始玫瑰图像
}
//********************************************************************************
//* SetupRegion()
//*
//* Set the Window Region for transparancy outside the mask region
//********************************************************************************
void CTransparentWnd::SetupRegion(CDC *pDC)
{
CDC memDC;
CBitmap &cBitmap=m_bmpDraw;
CBitmap* pOldMemBmp = NULL;
COLORREF col,colMask;
CRect cRect;
int x, y;
CRgn wndRgn, rgnTemp;
GetWindowRect(&cRect);
CPoint ptOrg=cRect.TopLeft();
BITMAP bmInfo;
cBitmap.GetObject(sizeof(bmInfo),&bmInfo);
CRect rcNewWnd=CRect(ptOrg,CSize(bmInfo.bmWidth,bmInfo.bmHeight));
memDC.CreateCompatibleDC(pDC);
pOldMemBmp = memDC.SelectObject(&cBitmap);
colMask=memDC.GetPixel(0,0);
wndRgn.CreateRectRgn(0, 0, rcNewWnd.Width(), rcNewWnd.Height());
for(x=0; x<=rcNewWnd.Width(); x++)
{
for(y=0; y<=rcNewWnd.Height(); y++)
{
col = memDC.GetPixel(x, y);
if(col == colMask)
{
rgnTemp.CreateRectRgn(x, y, x+1, y+1);
wndRgn.CombineRgn(&wndRgn, &rgnTemp, RGN_XOR);
rgnTemp.DeleteObject();
}
}
}
if (pOldMemBmp) memDC.SelectObject(pOldMemBmp);
SetWindowRgn((HRGN)wndRgn, TRUE);
MoveWindow(rcNewWnd);
}
//WAV音频文件播放
void CTransparentWnd::SoundPlay(void)
{
CString strTemp;
if(bMute) //当选择了情话静音时,不放声音
{
}
else if(pCustomWavFile->GetOriginPlayFlag() ) //如选中恢复按钮,则播放原始情话
{
//初始化时,判断是否有用户自定制的情话数据文件(放在此,是为了反复测情话文件是否存在)
CStdioFile TxtFile;
//打开情话数据文件
if (TxtFile.Open("lovepet.dat", CFile::modeRead|CFile::typeText))
{
//读入用户自定制的情话文件名(不含路径,及在当前路径寻找并播放它)
//和文字描述信息.
TxtFile.ReadString (strTemp);
//字符从0记起,故不加1 ,分离出相应字符串信息
strWavFileName=strTemp.Left(strTemp.Find("$$$"));
if(strTemp.Find( "$$$")>=0)
strTextDescription=strTemp.Right(strTemp.GetLength()-(strTemp.Find("$$$")+3));
TxtFile.Close();
//判断用户自定制的情话语音文件是否在当前路径
if(!TxtFile.Open(strWavFileName,CFile::modeRead))
{
// CString strErrorMessage;
// strErrorMessage = "自定制情话文件:" + strWavFileName +"不存在或不和主程序(lovepet.exe)在一起!";
// AfxMessageBox(strErrorMessage);
strWavFileName="" ; //情话语音文件不存在,付于其空值
}
else
TxtFile.Close (); //文件存在,则关闭它,否则会播不出声音
}
else
strWavFileName="" ; //情话数据文件不存在,付于其空值
if(strWavFileName!="") //情话数据不为空并且自定制情话文件存在则播放它
{
SetTimer(2,5000,NULL); //设置自定制情话播放的时间为5秒
//用下API函数播放
sndPlaySound(strWavFileName,SND_ASYNC|SND_NODEFAULT );
}
else if(bWavPlay) //否则,播放原始情圣情话一
{ //先关闭原声音播放
PlaySound("IDR_WAVE1",AfxGetResourceHandle(),SND_RESOURCE|SND_PURGE|SND_NODEFAULT );
SetTimer(2,10700,NULL); //设置第一次播放声音时宠物休息的时间10.7秒
//资源WAV文件的ID须加双引号,用下API函数播放
PlaySound("IDR_WAVE1",AfxGetResourceHandle(),SND_RESOURCE|SND_ASYNC|SND_NODEFAULT );
}
else //否则,播放原始情圣情话二
{
//先关闭原声音播放
PlaySound("IDR_WAVE2",AfxGetResourceHandle(),SND_RESOURCE|SND_PURGE|SND_NODEFAULT );
SetTimer(2,12000,NULL); //设置第二次播放声音时宠物休息的时间12秒钟
//资源WAV文件的ID须加双引号,用下API函数播放
PlaySound("IDR_WAVE2",AfxGetResourceHandle(),SND_RESOURCE|SND_ASYNC |SND_NODEFAULT );
}
}
else //播放定制情话
{
//定制情话文件一如为空,则播放原始情话文件一
if(pCustomWavFile->GetWaveFile ().IsEmpty ())
{ //先关闭原声音播放
PlaySound("IDR_WAVE1",AfxGetResourceHandle(),SND_RESOURCE|SND_PURGE|SND_NODEFAULT );
SetTimer(2,10700,NULL); //设置第一次播放声音时宠物休息的时间10.7秒
//资源WAV文件的ID须加双引号,用下API函数播放
PlaySound("IDR_WAVE1",AfxGetResourceHandle(),SND_RESOURCE|SND_ASYNC|SND_NODEFAULT );
}
else //不为空,则播放自定制情话文件
{
SetTimer(2,5000,NULL); //设置自定制情话播放的时间为5秒
//用下API函数播放
sndPlaySound(pCustomWavFile->GetWaveFile(),SND_ASYNC|SND_NODEFAULT );
}
}
}
//初始显示玫瑰图像
void CTransparentWnd::StartBitmap(void)
{
char szBmp[20];
CString strTemp;
sprintf(szBmp,"ROSE");
m_bmpDraw.DeleteObject();
m_bmpDraw.LoadBitmap(szBmp);
CWindowDC dc(this);
SetupRegion(&dc);
Invalidate();
SoundPlay(); //播放相应的WAV文件
}
void CTransparentWnd::Reset(void)
{
Idle();
SoundPlay(); //播放相应的WAV文件
}
//播放WAV文件时显示的动态图像
void CTransparentWnd::Idle(void)
{
char szBmp[20];
sprintf(szBmp,"WEST1");
m_bmpDraw.DeleteObject();
m_bmpDraw.LoadBitmap(szBmp);
CWindowDC dc(this);
SetupRegion(&dc);
Invalidate();
}
void CTransparentWnd::DoSet(void)
{
int iSW=GetSystemMetrics(SM_CXFULLSCREEN);
int iSH=GetSystemMetrics(SM_CYFULLSCREEN);
KillTimer(1);
SetTimer(2,600,NULL); //设置图像改变间隔时间
}
//获取用户自定制文字描述字符串
CString CTransparentWnd::GetTextDescription()
{
return strTextDescription;
}
void CTransparentWnd::DoWalk(void)
{
int iSW=GetSystemMetrics(SM_CXFULLSCREEN);
int iSH=GetSystemMetrics(SM_CYFULLSCREEN);
CRect rcW;
GetWindowRect(rcW);
SetTimer(2,600,NULL); //恢复原图像改变时的间隔时间
if(rcW.left<50) xcounter=10;
if(rcW.top<50) ycounter=10;
if( rcW.left <50) m_iLastDirection=1; //向右移动
if(rcW.left>iSW-50) xcounter=-10;
if(rcW.top>iSH-50) ycounter=-10;
if(rcW.left >iSW-50) m_iLastDirection=0; //向左移动
CPoint ptOffset(xcounter,ycounter);
rcW+=ptOffset;
// MoveWindow(rcW); //移动窗体
char szBmp[20];
if(bDragDrop) //宠物实时拖动时显示的图像
sprintf(szBmp,"GRIL");
else if(m_iLastDirection==1) //宠物向右移动时显示的图像
{
if((m_iAniSeq%24)>16) //图像动态四动一静
sprintf(szBmp,"WALK%d",m_iAniSeq%8+5); //不动时图像(后八个)
else
{
sprintf(szBmp,"WALK%d",m_iAniSeq%4+1); //动时图像
MoveWindow(rcW);//为运动图像时方移动窗体(前四个)
}
}
else//宠物向左移动时显示的图像
{
if((m_iAniSeq%24)>16)
sprintf(szBmp,"WALK%d",m_iAniSeq%8+17); //不动时图像(后八个)
else
{
sprintf(szBmp,"WALK%d",m_iAniSeq%4+13); //动时图像
MoveWindow(rcW);//为运动图像时方移动窗体(前四个)
}
}
m_bmpDraw.DeleteObject();
m_bmpDraw.LoadBitmap(szBmp);
CWindowDC dc(this);
SetupRegion(&dc);
Invalidate();
}
//********************************************************************************
//* CTransparentWnd message handlers
//********************************************************************************
void CTransparentWnd::OnLButtonDown(UINT nFlags, CPoint point)
{
CWnd::OnLButtonDown(nFlags, point);
SetTimer(3,60,NULL); //拖动时同时显示窗体的计数器3
//鼠标移动到窗体时改变鼠标指针
::SetCursor(AfxGetApp()->LoadCursor(IDC_DROP));
SetCapture(); //设置鼠标全屏捕捉
CurPoint=point; //记下按下时的鼠标坐标
//实现无标题拖动
// PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x,point.y));
}
int CTransparentWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;
//系统区动态显示的图标文件
m_hIcon[0]=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
//创建系统区图标
if (!m_TrayIcon.Create(this,
IDR_POPUP,
_T("爱圣V3.0"),
m_hIcon,
1, //一幅图像
1000, //延时1秒变化
WM_TRAYNOTIFY))
{
AfxMessageBox(_T("错误:创建系统图标失败!"), MB_OK | MB_ICONSTOP);
return -1;
}
xcounter=10,ycounter=10;
m_iLastDirection=1; //宠物跑动的方向标志位,开始为向右
SetTimer(1,3000,NULL); //初始时的玫瑰图像显示时间3秒
bWavPlay=true; //声音开始播放标志位初始为真
bDragDrop=false; //宠物拖动标志初始为假
bShow=true; //窗体显示动画标志位初始为真,及滑向系统区
SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE); //窗体总在总前面
return 0;
}
BOOL CTransparentWnd::OnEraseBkgnd(CDC* pDC)
{
CRect rect;
GetWindowRect(&rect);
CDC memDC;
CBitmap &cBitmap=m_bmpDraw;;
CBitmap* pOldMemBmp = NULL;
CFont* pOldMemFont=NULL;
memDC.CreateCompatibleDC(pDC);
pOldMemBmp = memDC.SelectObject(&cBitmap);
/* //宠物上方显示文字信息
pOldMemFont = memDC.SelectObject(&m_fontLogo);
CString szT=strTextPlay;
int iLen=szT.GetLength ();
CString strTemp=szT.Left (2);
szT=szT.Right (iLen-2)+strTemp;
CRect rcD(3,2,16,33);
memDC.SetBkMode(TRANSPARENT);
memDC.DrawText(szT,rcD,DT_LEFT|DT_WORDBREAK);
*/
pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);
if (pOldMemBmp) memDC.SelectObject( pOldMemBmp );
// if (pOldMemFont) memDC.SelectObject( pOldMemFont );
return TRUE;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?