FadeIn/FadeOut Class
フェードイン効果をクラス化してみました。
ちょっとできが悪いです。
diff -uNr orig/CTipWnd.cpp new/CTipWnd.cpp --- orig/CTipWnd.cpp Sun Dec 02 06:54:23 2007 +++ new/CTipWnd.cpp Sun Apr 20 21:06:21 2008 @@ -18,7 +18,7 @@ #include "stdafx.h" #include "CTipWnd.h" #include "CShareData.h" - +#include "CTransparent.h"
/* CTipWndクラス デストラクタ */ CTipWnd::CTipWnd() @@ -85,6 +85,9 @@ }
m_hFont = ::CreateFontIndirect( &(CShareData::getInstance()->GetShareData()->m_Common.m_lf_kh) ); + + m_cTransparent.SetHwnd( m_hWnd ); + return; }
@@ -127,7 +130,13 @@ ::ReleaseDC( m_hWnd, hdc );
::MoveWindow( m_hWnd, nX, nY, rc.right + 8, rc.bottom + 8/*nHeight*/, TRUE ); - ::ShowWindow( m_hWnd, SW_SHOWNA ); + + if( m_cTransparent.CanUse() ){ + m_cTransparent.FadeIn( FALSE, SW_SHOWNA ); + }else{ + ::ShowWindow( m_hWnd, SW_SHOWNA ); + } + return;
} @@ -283,8 +292,15 @@ /* Tipを消す */ void CTipWnd::Hide( void ) { - ::ShowWindow( m_hWnd, SW_HIDE ); + if( ::IsWindowVisible( m_hWnd ) ){ + if( m_cTransparent.CanUse() ){ + m_cTransparent.FadeOut( FALSE ); + }else{ + ::ShowWindow( m_hWnd, SW_HIDE ); + } + } // ::DestroyWindow( m_hWnd ); + return; }
@@ -329,5 +345,9 @@
// 2001/06/19 End
+LRESULT CTipWnd::OnTimer( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + return m_cTransparent.OnTimer( hWnd, uMsg, wParam, lParam ); +}
/*[EOF]*/ diff -uNr orig/CTipWnd.h new/CTipWnd.h --- orig/CTipWnd.h Sun Dec 02 06:54:23 2007 +++ new/CTipWnd.h Sun Apr 20 20:43:19 2008 @@ -21,6 +21,8 @@
#include "CWnd.h" #include "CMemory.h" +#include "CTransparent.h" + /*----------------------------------------------------------------------- クラスの宣言 -----------------------------------------------------------------------*/ @@ -52,6 +54,8 @@ char* m_pszClassName; /* Mutex作成用・ウィンドウクラス名 */ HFONT m_hFont;
+ CTransparent m_cTransparent; + public: CMemory m_cKey; /* キーの内容データ */ BOOL m_KeyWasHit; /* キーがヒットしたか */ @@ -73,6 +77,7 @@
/* 仮想関数 メッセージ処理 詳しくは実装を参照 */ LRESULT OnPaint( HWND, UINT, WPARAM, LPARAM );/* 描画処理 */ + LRESULT OnTimer( HWND, UINT, WPARAM, LPARAM ); };
diff -uNr orig/CTransparent.cpp new/CTransparent.cpp --- orig/CTransparent.cpp Thu Jan 01 09:00:00 1970 +++ new/CTransparent.cpp Sun Apr 20 21:02:46 2008 @@ -0,0 +1,180 @@ +/*! @file + @brief 透過 + + @author wakura + @date 2008.04.20 +*/ +/* + Copyright (C) 2008, wakura + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; + you must not claim that you wrote the original software. + If you use this software in a product, an acknowledgment + in the product documentation would be appreciated but is + not required. + + 2. Altered source versions must be plainly marked as such, + and must not be misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source + distribution. +*/ + +#include "stdafx.h" +#include "CTransparent.h" + +CTransparent::CTransparent() +{ + m_cOpacity = 0; + m_bFadeType = FALSE; + m_nIDEvent = ID_EVENT; + m_nTimerHandle = 0; + + m_hWnd = NULL; + m_uElapse = FADE_ELAPSE; + m_cFadeInInterval = FADE_IN_INTERVAL; + m_cFadeOutInterval = FADE_OUT_INTERVAL; + + m_hUser32 = NULL; + m_lpfncSetLayeredWindowAttributes = NULL; + m_hUser32 = ::LoadLibrary( _T("USER32.DLL") ); + if( NULL != m_hUser32 ){ + m_lpfncSetLayeredWindowAttributes = (FncSetLayeredWindowAttributes)::GetProcAddress( m_hUser32, "SetLayeredWindowAttributes" ); + } +} + +CTransparent::~CTransparent() +{ + if( NULL != m_nTimerHandle ){ + ::KillTimer( m_hWnd, m_nTimerHandle ); + m_nTimerHandle = 0; + } + if( NULL != m_hUser32 ){ + m_lpfncSetLayeredWindowAttributes = NULL; + ::FreeLibrary( m_hUser32 ); + m_hUser32 = NULL; + } +} + +void CTransparent::SetHwnd( HWND hWnd ) +{ + m_hWnd = hWnd; + ::SetWindowLong( m_hWnd, GWL_EXSTYLE, ::GetWindowLong( m_hWnd, GWL_EXSTYLE ) | WS_EX_LAYERED ); +} + +BOOL CTransparent::SetTransparent( BYTE cOpacity ) +{ + m_cOpacity = cOpacity; + + if( ! CanUse() ) return FALSE; + + if( NULL != m_lpfncSetLayeredWindowAttributes ){ + m_lpfncSetLayeredWindowAttributes( m_hWnd, NULL, m_cOpacity, LWA_ALPHA ); + } + + return TRUE; +} + +/*! + フェードイン + + @param[in] bOption フェード効果オプション + + @note + bOption + FALSE フェード効果は前回の続き + TRUE フェード効果はリセットして最初から実行 +*/ +BOOL CTransparent::FadeIn( BOOL bOption, int nCmdShow ) +{ + if( ! CanUse() ) return FALSE; + + m_bFadeType = TRUE; + FadeStop( bOption ); + m_nTimerHandle = ::SetTimer( m_hWnd, m_nIDEvent, m_uElapse, NULL ); + OnTimer( m_hWnd, WM_TIMER, m_nIDEvent, 0 ); + + ::ShowWindow( m_hWnd, nCmdShow ); + + return TRUE; +} + +/*! + フェードアウト + + @param[in] bOption フェード効果オプション + + @note + bOption + FALSE フェード効果は前回の続き + TRUE フェード効果はリセットして最初から実行 +*/ +BOOL CTransparent::FadeOut( BOOL bOption, int nCmdShow ) +{ + if( ! CanUse() ) return FALSE; + + m_bFadeType = FALSE; + FadeStop( bOption ); + m_nTimerHandle = ::SetTimer( m_hWnd, m_nIDEvent, m_uElapse, NULL ); + OnTimer( m_hWnd, WM_TIMER, m_nIDEvent, 0 ); + + return TRUE; +} + +void CTransparent::FadeStop( BOOL bOption ) +{ + if( ! CanUse() ) return; + if( ! IsRunning() ) return; + + ::KillTimer( NULL, m_nIDEvent ); + m_nTimerHandle = 0; + + if( bOption ){ + if( IsFadeOut() ){ + SetTransparent( 0 ); + }else{ + SetTransparent( 255 ); + } + } +} + +LRESULT CTransparent::OnTimer( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + if( hWnd != m_hWnd + || uMsg != WM_TIMER + || wParam != m_nIDEvent ) return 0L; + if( ! IsRunning() ) return 0L; + + if( IsFadeOut() ){ + if( (int)m_cOpacity - m_cFadeOutInterval <= 0 ){ + m_cOpacity = 0; + ::KillTimer( NULL, m_nIDEvent ); + m_nTimerHandle = 0; + SetTransparent( m_cOpacity ); + ::ShowWindow( m_hWnd, SW_HIDE ); + }else{ + m_cOpacity -= m_cFadeOutInterval; + SetTransparent( m_cOpacity ); + } + }else{ + if( (int)m_cOpacity + m_cFadeInInterval >= 255 ){ + m_cOpacity = 255; + ::KillTimer( NULL, m_nIDEvent ); + m_nTimerHandle = 0; + SetTransparent( m_cOpacity ); + }else{ + m_cOpacity += m_cFadeInInterval; + SetTransparent( m_cOpacity ); + } + } + + return 0L; +} diff -uNr orig/CTransparent.h new/CTransparent.h --- orig/CTransparent.h Thu Jan 01 09:00:00 1970 +++ new/CTransparent.h Sun Apr 20 20:59:53 2008 @@ -0,0 +1,90 @@ +/*! @file + @brief 透過 + + @author wakura + @date 2008.04.20 +*/ +/* + Copyright (C) 2008, wakura + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; + you must not claim that you wrote the original software. + If you use this software in a product, an acknowledgment + in the product documentation would be appreciated but is + not required. + + 2. Altered source versions must be plainly marked as such, + and must not be misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source + distribution. +*/ +#pragma once + +#include "stdafx.h" +#include "debug.h" + +//#if(_WIN32_WINNT >= 0x0500) +#ifndef WS_EX_LAYERED +#define WS_EX_LAYERED 0x00080000 +#define LWA_COLORKEY 0x00000001 +#define LWA_ALPHA 0x00000002 +//WINUSERAPI BOOL WINAPI SetLayeredWindowAttributes( HWND hwnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags ); +#endif //WS_EX_LAYERED +//#endif //_WIN32_WINNT >= 0x0500 + +/*! + 透過クラス +*/ +class CTransparent { +public: + static const UINT ID_EVENT = 255; + static const BYTE FADE_IN_INTERVAL = 256 / 2; + static const BYTE FADE_OUT_INTERVAL = 256 / 16; + static const UINT FADE_ELAPSE = 20; + +private: + BYTE m_cOpacity; + BOOL m_bFadeType; + UINT m_nIDEvent; + UINT_PTR m_nTimerHandle; + HMODULE m_hUser32; + typedef BOOL (WINAPI *FncSetLayeredWindowAttributes)( HWND hWnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags ); + FncSetLayeredWindowAttributes m_lpfncSetLayeredWindowAttributes; + + HWND m_hWnd; + UINT m_uElapse; + BYTE m_cFadeInInterval; + BYTE m_cFadeOutInterval; + +public: + CTransparent(); + virtual ~CTransparent(); + + void SetHwnd( HWND hWnd ); + void SetElapse( UINT uElapse ){ m_uElapse = uElapse; } + void SetFadeInInterval( BYTE cFadeInInterval ){ m_cFadeInInterval = cFadeInInterval; } + void SetFadeOutInterval( BYTE cFadeOutInterval ){ m_cFadeOutInterval = cFadeOutInterval; } + BOOL SetTransparent( BYTE cOpacity ); + BOOL FadeIn( BOOL bOption = FALSE, int nCmdShow = SW_SHOW ); + BOOL FadeOut( BOOL bOption = FALSE, int nCmdShow = SW_HIDE ); + void FadeStop( BOOL bOption = FALSE ); + + UINT GetElapse( void ){ return m_uElapse; } + BYTE GetFadeInInterval( void ){ return m_cFadeInInterval; } + BYTE GetFadeOutInterval( void ){ return m_cFadeOutInterval; } + BYTE GetOpacity( void ){ return m_cOpacity; } + BOOL IsFadeIn( void ){ return m_bFadeType; } + BOOL IsFadeOut( void ){ return ! m_bFadeType; } + BOOL IsRunning( void ){ return m_nTimerHandle != 0; } + BOOL CanUse( void ){ return m_lpfncSetLayeredWindowAttributes != NULL; } + LRESULT OnTimer( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); +};