?? transparentwnd.cpp
字號:
*********************************************************************
/*
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 + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -