ツールチップのフェードイン・フェードアウト機能
最新版はFadeIn/FadeOut Classです。
CTipWndの差分ファイルです。
SetLayeredWindowAttributesが必要ですのでW2K以降となります。
diff -uNr orig/CTipWnd.cpp new/CTipWnd.cpp --- orig/CTipWnd.cpp Sun Dec 02 06:54:23 2007 +++ new/CTipWnd.cpp Sat Apr 19 12:22:22 2008 @@ -19,6 +19,15 @@ #include "CTipWnd.h" #include "CShareData.h"
+#define CTIPWND_EVENT_ID 1 +#define CTIPWND_FADE_TIMER 50 +#define CTIPWND_FADE_IN_INTERVAL 64 +#define CTIPWND_FADE_OUT_INTERVAL 16 +#ifndef WS_EX_LAYERED +#define WS_EX_LAYERED 0x00080000 +#define LWA_COLORKEY 0x00000001 +#define LWA_ALPHA 0x00000002 +#endif //WS_EX_LAYERED
/* CTipWndクラス デストラクタ */ CTipWnd::CTipWnd() @@ -26,6 +35,15 @@ strcat( m_szClassInheritances, "::CTipWnd" ); m_pszClassName = "CTipWnd"; m_KeyWasHit = FALSE; /* キーがヒットしたか */ + m_uFadeTimerId = 0; + m_nOpacity = 0; + m_bNowFadeType = FALSE; + + m_lpfncSetLayeredWindowAttributes = NULL; + HMODULE m_hUser32 = ::GetModuleHandle( _T("USER32.DLL") ); + m_lpfncSetLayeredWindowAttributes = (FncSetLayeredWindowAttributes)::GetProcAddress( m_hUser32, + "SetLayeredWindowAttributes"); + return; }
@@ -38,6 +56,12 @@ ::DeleteObject( m_hFont ); m_hFont = NULL; } + + if( 0 != m_uFadeTimerId ){ + ::KillTimer( m_hWnd, m_uFadeTimerId ); + m_uFadeTimerId = 0; + } + return; }
@@ -85,6 +109,7 @@ }
m_hFont = ::CreateFontIndirect( &(CShareData::getInstance()->GetShareData()->m_Common.m_lf_kh) ); + return; }
@@ -127,7 +152,14 @@ ::ReleaseDC( m_hWnd, hdc );
::MoveWindow( m_hWnd, nX, nY, rc.right + 8, rc.bottom + 8/*nHeight*/, TRUE ); + + ::SetWindowLong( m_hWnd, GWL_EXSTYLE, ::GetWindowLong( m_hWnd, GWL_EXSTYLE ) | WS_EX_LAYERED ); + m_bNowFadeType = TRUE; + m_uFadeTimerId = ::SetTimer( m_hWnd, CTIPWND_EVENT_ID, CTIPWND_FADE_TIMER, NULL ); + OnTimer( m_hWnd, WM_TIMER, CTIPWND_EVENT_ID, 0 ); + ::ShowWindow( m_hWnd, SW_SHOWNA ); + return;
} @@ -283,8 +315,14 @@ /* Tipを消す */ void CTipWnd::Hide( void ) { - ::ShowWindow( m_hWnd, SW_HIDE ); +// ::ShowWindow( m_hWnd, SW_HIDE ); // ::DestroyWindow( m_hWnd ); + + ::SetWindowLong( m_hWnd, GWL_EXSTYLE, ::GetWindowLong( m_hWnd, GWL_EXSTYLE ) | WS_EX_LAYERED ); + m_bNowFadeType = FALSE; + m_uFadeTimerId = ::SetTimer( m_hWnd, CTIPWND_EVENT_ID, CTIPWND_FADE_TIMER, NULL ); + OnTimer( m_hWnd, WM_TIMER, CTIPWND_EVENT_ID, 0 ); + return; }
@@ -329,5 +367,35 @@
// 2001/06/19 End
+LRESULT CTipWnd::OnTimer( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + switch( wParam ){ + case CTIPWND_EVENT_ID: + if( m_bNowFadeType ){ + if( (int)m_nOpacity + CTIPWND_FADE_IN_INTERVAL >= 255 ){ + m_nOpacity = 255; + ::KillTimer( m_hWnd, m_uFadeTimerId ); + m_uFadeTimerId = 0; + }else{ + m_nOpacity += CTIPWND_FADE_IN_INTERVAL; + } + }else{ + if( (int)m_nOpacity - CTIPWND_FADE_OUT_INTERVAL <= 0 ){ + m_nOpacity = 0; + ::KillTimer( m_hWnd, m_uFadeTimerId ); + m_uFadeTimerId = 0; + ::ShowWindow( m_hWnd, SW_HIDE ); + }else{ + m_nOpacity -= CTIPWND_FADE_OUT_INTERVAL; + } + } + + if( NULL != m_lpfncSetLayeredWindowAttributes ){ + m_lpfncSetLayeredWindowAttributes( m_hWnd, NULL, m_nOpacity, LWA_ALPHA ); + } + break; + } + return 0L; +}
/*[EOF]*/ diff -uNr orig/CTipWnd.h new/CTipWnd.h --- orig/CTipWnd.h Sun Dec 02 06:54:23 2007 +++ new/CTipWnd.h Sat Apr 19 12:18:28 2008 @@ -52,6 +52,13 @@ char* m_pszClassName; /* Mutex作成用・ウィンドウクラス名 */ HFONT m_hFont;
+ HMODULE m_hUser32; + typedef BOOL (WINAPI *FncSetLayeredWindowAttributes)( HWND hWnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags ); + FncSetLayeredWindowAttributes m_lpfncSetLayeredWindowAttributes; + UINT_PTR m_uFadeTimerId; + BYTE m_nOpacity; + BOOL m_bNowFadeType; + public: CMemory m_cKey; /* キーの内容データ */ BOOL m_KeyWasHit; /* キーがヒットしたか */ @@ -73,6 +80,7 @@
/* 仮想関数 メッセージ処理 詳しくは実装を参照 */ LRESULT OnPaint( HWND, UINT, WPARAM, LPARAM );/* 描画処理 */ + LRESULT OnTimer( HWND, UINT, WPARAM, LPARAM ); };