|
|
/******************************Module*Header*******************************\
* Module Name: ledwnd.c * * Implementation of the LED window. * * * Created: 18-11-93 * Author: Stephen Estrop [StephenE] * * Copyright (c) 1993 Microsoft Corporation \**************************************************************************/ #pragma warning( once : 4201 4214 )
#define NOOLE
#include <windows.h> /* required for all Windows applications */
#include <windowsx.h>
#include <string.h>
#include <tchar.h> /* contains portable ascii/unicode macros */
#include <commctrl.h>
#include "playres.h"
#include "cdplayer.h"
#include "cdapi.h"
#include "literals.h"
#include "trklst.h"
#define DECLARE_DATA
#include "ledwnd.h"
#include "dib.h"
#include "..\cdopt\cdopt.h"
#define WM_LED_INFO_PAINT (WM_USER+2000) //wparam = draw, lparam = volchanged state
#define WM_LED_MUTE (WM_USER+2001) //wparam = unused, lparam = mute flag
#define WM_LED_DOWNLOAD (WM_USER+2002) //wparam = unused, lparam = download flag
#define WM_NET_CHANGEPROVIDER (WM_USER+1002) //wparam = unused, lparam = LPCDPROVIDER
#define VOLUME_STEPS 40
#define VOLUME_SPACING 3
#define VOLUME_DELTA 0x2FF
#define VOLUME_LINE_HEIGHT 28
#define VOLUME_WIDTH 290
#define TOOLID_STATUS 0
#define TOOLID_MODE 1
#define TOOLID_LOGO 2
#define TOOLID_TIME 3
#define TOOLID_TRACKORMUTE 4
#define TOOLID_TITLE 5
#define TOOLID_TRACK 6
#define TOOLID_ARTIST 7
#define LARGE_MODE_INDICATOR 400
#define LOGO_X_OFFSET 4
#define LOGO_Y_OFFSET 4
#define INFO_AREA_OFFSET 55
#define ANI_NOCD_FRAME 0
#define ANI_STOP_FRAME 1
#define ANI_LAST_PLAY_FRAME 4
#define ANI_PAUSE_FRAME 5
#define MODE_NORMAL_FRAME 0
#define MODE_REPEAT1_FRAME 1
#define MODE_REPEATALL_FRAME 2
#define MODE_INTRO_FRAME 3
#define MODE_RANDOM_FRAME 4
int g_nLastXOrigin = 0; BITMAP g_bmLogo; BOOL g_fAllowDraw = TRUE; DWORD g_dwLevel = 0; TCHAR* g_szMixerName = NULL; HWND g_hwndPlay = NULL; HWND g_hwndMode = NULL; HWND g_hwndDownload = NULL; DWORD g_dwLastState = CD_NO_CD; DWORD g_dwLastModeFrame = MODE_NORMAL_FRAME; COLORREF CurrentColorRef = RGB(0x00,0xFF,0xFF); BOOL g_fMute = TRUE; BOOL g_fDownloading = FALSE; LPCDPROVIDER g_pCurrentProvider = NULL; RECT g_timerect; HWND g_hwndToolTips = NULL; extern HINSTANCE g_hInst;
/* -------------------------------------------------------------------------
** Private functions for the LED class ** ------------------------------------------------------------------------- */
BOOL LED_OnCreate( HWND hwnd, LPCREATESTRUCT lpCreateStruct );
BOOL LED_LargeMode(HWND hwnd);
void LED_OnPaint( HWND hwnd );
void LED_OnLButtonUp( HWND hwnd, int x, int y, UINT keyFlags );
void LED_OnSetText( HWND hwnd, LPCTSTR lpszText );
void LED_DrawText( HWND hwnd, HDC hdcLed, LPCTSTR s, int sLen );
void LED_Animation(HDC hdc);
void LED_DrawLogo( HWND hwnd, HDC hdcLed, RECT* pPaintRect);
void LED_DrawInfo( HWND hwnd, HDC hdcLed, LPCTSTR s, int sLen, RECT* pPaintRect );
void LED_DrawTrackMute( HWND hwnd, HDC hdcLed, RECT* pPaintRect);
void LED_CreateLEDFonts( HDC hdc );
void LED_DrawVolume( HWND ledWnd, HDC hdc );
HANDLE hbmpLogo = NULL; HANDLE hbmpVendorLogo = NULL;
/******************************Public*Routine******************************\
* InitLEDClass * * Called to register the LED window class and create a font for the LED * window to use. This function must be called before the CD Player dialog * box is created. * * History: * 18-11-93 - StephenE - Created * \**************************************************************************/ BOOL InitLEDClass( HINSTANCE hInst ) { WNDCLASS LEDwndclass; HDC hdc;
ZeroMemory( &LEDwndclass, sizeof(LEDwndclass) );
/*
** Register the LED window. */ LEDwndclass.lpfnWndProc = LEDWndProc; LEDwndclass.hInstance = hInst; LEDwndclass.hCursor = LoadCursor( NULL, IDC_ARROW ); LEDwndclass.hbrBackground = (HBRUSH)GetStockObject( BLACK_BRUSH ); LEDwndclass.lpszClassName = g_szLEDClassName; LEDwndclass.style = CS_OWNDC;
hdc = GetDC( GetDesktopWindow() ); LED_CreateLEDFonts( hdc ); ReleaseDC( GetDesktopWindow(), hdc );
return RegisterClass( &LEDwndclass ); }
void LED_OnDestroy(HWND hwnd) { if (hbmpLogo) { GlobalFree(hbmpLogo); hbmpLogo = NULL; }
if ( hLEDFontL != NULL ) { DeleteObject( hLEDFontL ); }
if ( hLEDFontS != NULL ) { DeleteObject( hLEDFontS ); }
if ( hLEDFontB != NULL ) { DeleteObject( hLEDFontB ); } }
////////////////////////////////////////////////////////////////////////////////////////////
// * LED_OnToolTipNotify
// Called from tool tips to get the text they need to display
////////////////////////////////////////////////////////////////////////////////////////////
VOID LED_OnToolTipNotify(HWND hwnd, LPARAM lParam) { LPTOOLTIPTEXT lpttt; UINT nID;
if ((((LPNMHDR) lParam)->code) == TTN_NEEDTEXT) { nID = (UINT)((LPNMHDR)lParam)->idFrom; lpttt = (LPTOOLTIPTEXT)lParam;
switch (nID) { case TOOLID_STATUS : { TCHAR szFormat[30]; TCHAR szStatus[30]; LoadString(g_hInst,STR_FORMAT_STATUS,szFormat,sizeof(szFormat)/sizeof(TCHAR));
if (g_fDownloading) { LoadString(g_hInst,STR_STATUS_DOWNLOADING,szStatus,sizeof(szStatus)/sizeof(TCHAR)); } else { if (g_State & CD_PLAYING) { LoadString(g_hInst,STR_STATUS_PLAY,szStatus,sizeof(szStatus)/sizeof(TCHAR)); }
if (g_State & CD_STOPPED) { LoadString(g_hInst,STR_STATUS_STOP,szStatus,sizeof(szStatus)/sizeof(TCHAR)); }
if (g_State & CD_PAUSED) { LoadString(g_hInst,STR_STATUS_PAUSED,szStatus,sizeof(szStatus)/sizeof(TCHAR)); }
if ((g_State & CD_NO_CD) || (g_State & CD_DATA_CD_LOADED)) { LoadString(g_hInst,STR_STATUS_NODISC,szStatus,sizeof(szStatus)/sizeof(TCHAR)); } } //end else
wsprintf(lpttt->szText,szFormat,szStatus); } break;
case TOOLID_MODE : { TCHAR szFormat[30]; TCHAR szStatus[30]; LoadString(g_hInst,STR_FORMAT_MODE,szFormat,sizeof(szFormat)/sizeof(TCHAR)); LoadString(g_hInst,STR_MODE_NORMAL,szStatus,sizeof(szStatus)/sizeof(TCHAR));
if (g_fContinuous) { LoadString(g_hInst,STR_MODE_REPEATALL,szStatus,sizeof(szStatus)/sizeof(TCHAR)); }
if (g_fIntroPlay) { LoadString(g_hInst,STR_MODE_INTROPLAY,szStatus,sizeof(szStatus)/sizeof(TCHAR)); }
if (!g_fSelectedOrder) { LoadString(g_hInst,STR_MODE_RANDOM,szStatus,sizeof(szStatus)/sizeof(TCHAR)); }
if (g_fRepeatSingle) { LoadString(g_hInst,STR_MODE_REPEATONE,szStatus,sizeof(szStatus)/sizeof(TCHAR)); }
wsprintf(lpttt->szText,szFormat,szStatus); } break;
case TOOLID_LOGO : { if (g_fDownloading) { _tcscpy(lpttt->szText,g_pCurrentProvider->szProviderName); } else { LoadString(g_hInst,STR_LOGO,lpttt->szText,sizeof(lpttt->szText)/sizeof(TCHAR)); } } break;
case TOOLID_TIME : { if (g_fDisplayT) { LoadString(g_hInst,STR_TRACK_TIME,lpttt->szText,sizeof(lpttt->szText)/sizeof(TCHAR)); }
if (g_fDisplayTr) { LoadString(g_hInst,STR_TRACK_REMAINING,lpttt->szText,sizeof(lpttt->szText)/sizeof(TCHAR)); }
if (g_fDisplayD) { LoadString(g_hInst,STR_DISC_TIME,lpttt->szText,sizeof(lpttt->szText)/sizeof(TCHAR)); }
if (g_fDisplayDr) { LoadString(g_hInst,STR_DISC_REMAINING,lpttt->szText,sizeof(lpttt->szText)/sizeof(TCHAR)); } } break;
case TOOLID_TRACKORMUTE : { BOOL fLargeMode = FALSE; if (LED_LargeMode(hwnd)) { fLargeMode = TRUE; }
if ((g_fMute) && (fLargeMode)) { LoadString(g_hInst,STR_STATUS_MUTE,lpttt->szText,sizeof(lpttt->szText)/sizeof(TCHAR)); } else { LoadString(g_hInst,STR_TRACK_NUMBER,lpttt->szText,sizeof(lpttt->szText)/sizeof(TCHAR)); } } break;
case TOOLID_TITLE : { if (g_fAllowDraw) { LoadString(g_hInst,STR_TITLE,lpttt->szText,sizeof(lpttt->szText)/sizeof(TCHAR)); } else { LoadString(g_hInst,STR_VOLUME,lpttt->szText,sizeof(lpttt->szText)/sizeof(TCHAR)); } } break;
case TOOLID_TRACK : { if (g_fAllowDraw) { LoadString(g_hInst,STR_TRACK,lpttt->szText,sizeof(lpttt->szText)/sizeof(TCHAR)); } else { LoadString(g_hInst,STR_VOLUME,lpttt->szText,sizeof(lpttt->szText)/sizeof(TCHAR)); } } break;
case TOOLID_ARTIST : { if (g_fAllowDraw) { LoadString(g_hInst,STR_ARTIST,lpttt->szText,sizeof(lpttt->szText)/sizeof(TCHAR)); } else { LoadString(g_hInst,STR_VOLUME,lpttt->szText,sizeof(lpttt->szText)/sizeof(TCHAR)); } } break; } //end switch
} return; }
void DoDrawing(HWND hwnd, HDC hdc, RECT* pPaintRect) { int sLen; TCHAR s[MAX_PATH];
sLen = GetWindowText( hwnd, s, sizeof(s)/sizeof(TCHAR));
RECT wndRect; GetClientRect(hwnd,&wndRect);
HPALETTE hPalOld = SelectPalette(hdc,g_pSink->GetPalette(),FALSE); RealizePalette(hdc);
HDC memDC = CreateCompatibleDC(hdc); HPALETTE hPalOldMem = SelectPalette(hdc,g_pSink->GetPalette(),FALSE); RealizePalette(hdc);
SetBkColor( memDC, RGB(0x00,0x00,0x00) ); SetTextColor( memDC, CurrentColorRef );
HBITMAP hbmp = CreateCompatibleBitmap(hdc,wndRect.right-wndRect.left,wndRect.bottom-wndRect.top); HBITMAP holdBmp = (HBITMAP)SelectObject(memDC,hbmp); if (LED_LargeMode(hwnd)) { LED_Animation(hdc); //use hdc to ensure the clip rect is not affecting these windows
LED_DrawLogo(hwnd,memDC,pPaintRect); LED_DrawTrackMute(hwnd,memDC,pPaintRect); if (g_fAllowDraw) { LED_DrawInfo(hwnd,memDC, s, sLen,pPaintRect); } else { LED_DrawVolume(hwnd,memDC); } } else { //hide all animations
ShowWindow(g_hwndPlay,SW_HIDE); ShowWindow(g_hwndMode,SW_HIDE); if (g_hwndDownload) { ShowWindow(g_hwndDownload,SW_HIDE); } } /*
** Draw the LED display text */ LED_DrawText( hwnd, memDC, s, sLen );
//blit from memory onto display and clean up
BitBlt(hdc,wndRect.left,wndRect.top,wndRect.right-wndRect.left,wndRect.bottom-wndRect.top, memDC,0,0,SRCCOPY);
SelectObject(memDC,holdBmp); DeleteObject(hbmp); SelectPalette(hdc,hPalOld,FALSE); RealizePalette(hdc); SelectPalette(memDC,hPalOldMem,FALSE); RealizePalette(memDC); DeleteDC(memDC);
GetClientRect( hwnd, &wndRect ); HRGN region = CreateRectRgn(wndRect.left,wndRect.top,wndRect.right,wndRect.bottom);
SelectClipRgn(hdc, region); DeleteObject(region); }
BOOL LED_OnEraseBackground(HWND hwnd, HDC hdc) { //DoDrawing(hwnd,hdc);
return TRUE; }
/******************************Public*Routine******************************\
* LEDWndProc * * This routine handles the WM_PAINT and WM_SETTEXT messages * for the "LED" display window. * * History: * 18-11-93 - StephenE - Created * \**************************************************************************/ LRESULT CALLBACK LEDWndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { switch( message ) { HANDLE_MSG( hwnd, WM_CREATE, LED_OnCreate ); HANDLE_MSG( hwnd, WM_DESTROY, LED_OnDestroy); HANDLE_MSG( hwnd, WM_PAINT, LED_OnPaint ); HANDLE_MSG( hwnd, WM_LBUTTONUP, LED_OnLButtonUp ); HANDLE_MSG( hwnd, WM_SETTEXT, LED_OnSetText ); HANDLE_MSG( hwnd, WM_ERASEBKGND, LED_OnEraseBackground);
case WM_NOTIFY : { if ((((LPNMHDR)lParam)->code) == TTN_NEEDTEXT) { LED_OnToolTipNotify(hwnd,lParam); } } break;
case WM_LBUTTONDOWN : case WM_MBUTTONDOWN : case WM_RBUTTONDOWN : case WM_MOUSEMOVE : { MSG msg; msg.lParam = lParam; msg.wParam = wParam; msg.message = message; msg.hwnd = hwnd; SendMessage(g_hwndToolTips, TTM_RELAYEVENT, 0, (LPARAM)&msg); } break; case WM_LED_INFO_PAINT : { g_fAllowDraw = (BOOL)wParam; if (!g_fAllowDraw) { MMONVOLCHANGED* pVolChange = (MMONVOLCHANGED*)lParam; g_szMixerName = pVolChange->szLineName; g_dwLevel = pVolChange->dwNewVolume; InvalidateRect(hwnd,NULL,FALSE); UpdateWindow(hwnd); } } break;
case WM_LED_MUTE : { g_fMute = (BOOL)lParam; InvalidateRect(hwnd,NULL,FALSE); UpdateWindow(hwnd); } break;
case WM_NET_CHANGEPROVIDER : { if (g_fDownloading) { if (hbmpVendorLogo) { GlobalFree(hbmpVendorLogo); hbmpVendorLogo = NULL; }
LPCDPROVIDER pProv = (LPCDPROVIDER)lParam; if (pProv) { hbmpVendorLogo = OpenDIB(pProv->szProviderLogo,-1); g_pCurrentProvider = pProv;
//if tool tip is showing, kill it
TOOLINFO ti; ti.cbSize = sizeof(ti); if (SendMessage(g_hwndToolTips, TTM_GETCURRENTTOOL, 0, (LPARAM) (LPTOOLINFO) &ti)) { if (ti.uId == TOOLID_LOGO) { //fake a button down
MSG msg; msg.lParam = 0; msg.wParam = 0; msg.message = WM_LBUTTONDOWN; msg.hwnd = hwnd; SendMessage(g_hwndToolTips, TTM_RELAYEVENT, 0, (LPARAM)&msg); } } }
InvalidateRect(hwnd,NULL,FALSE); UpdateWindow(hwnd); } //end if downloading
} break;
case WM_LED_DOWNLOAD : { BOOL fDownloading = (BOOL)lParam; if (fDownloading == g_fDownloading) { //can get called multiple times for same mode
break; }
g_fDownloading = fDownloading;
if (g_fDownloading) { //get the path to the vendor logo file
LPCDOPT pOpts = (LPCDOPT)g_pSink->GetOptions();
if (pOpts) { LPCDOPTIONS pOptions = NULL; pOptions = pOpts->GetCDOpts();
if (pOptions) { if (pOptions->pCurrentProvider!=NULL) { hbmpVendorLogo = OpenDIB(pOptions->pCurrentProvider->szProviderLogo,-1); g_pCurrentProvider = pOptions->pCurrentProvider; } //end if current provider ok
} //end if poptions ok
} //end if popts created
//create the downloading animation
g_hwndDownload = Animate_Create(hwnd, IDI_ICON_ANI_DOWN, WS_CHILD, g_hInst);
//headers don't have Animate_OpenEx yet,
//so just do the straight call
SendMessage(g_hwndDownload,ACM_OPEN,(WPARAM)g_hInst, (LPARAM)MAKEINTRESOURCE(IDI_ICON_ANI_DOWN));
//move to the top/left of the window
RECT anirect; GetClientRect(g_hwndDownload,&anirect); MoveWindow(g_hwndDownload, LOGO_X_OFFSET, LOGO_Y_OFFSET, anirect.right - anirect.left, anirect.bottom - anirect.top, FALSE);
Animate_Play(g_hwndDownload,0,-1,-1);
ShowWindow(g_hwndPlay,SW_HIDE); ShowWindow(g_hwndDownload,SW_SHOW);
if (hbmpVendorLogo) { InvalidateRect(hwnd,NULL,FALSE); UpdateWindow(hwnd); } } else { ShowWindow(g_hwndDownload,SW_HIDE); ShowWindow(g_hwndPlay,SW_SHOW); DestroyWindow(g_hwndDownload); g_hwndDownload = NULL; if (hbmpVendorLogo) { GlobalFree(hbmpVendorLogo); InvalidateRect(hwnd,NULL,FALSE); UpdateWindow(hwnd); } } } break; }
return DefWindowProc( hwnd, message, wParam, lParam ); }
void LED_SetTool(HWND hwnd, UINT toolID, int left, int top, int right, int bottom) { TOOLINFO ti; RECT toolRect; BOOL fAddTool = TRUE;
SetRect(&toolRect,left,top,right,bottom);
ti.cbSize = sizeof(TOOLINFO); ti.uFlags = 0; ti.hwnd = hwnd; ti.hinst = g_hInst; ti.uId = toolID; ti.lpszText = LPSTR_TEXTCALLBACK;
//check to see if tool already exists
if (SendMessage(g_hwndToolTips, TTM_GETTOOLINFO, 0, (LPARAM) (LPTOOLINFO) &ti)) { //if tool exists, we don't want to add it ...
fAddTool = FALSE;
//... unless the rects have changed
if (memcmp(&ti.rect,&toolRect,sizeof(RECT)) != 0) { SendMessage(g_hwndToolTips, TTM_DELTOOL, 0, (LPARAM) (LPTOOLINFO) &ti); fAddTool = TRUE; } }
if (fAddTool) { SetRect(&ti.rect,left,top,right,bottom); SendMessage(g_hwndToolTips, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti); } }
/*****************************Private*Routine******************************\
* LED_OnCreate * * * * History: * 18-11-93 - StephenE - Created * \**************************************************************************/ BOOL LED_OnCreate( HWND hwnd, LPCREATESTRUCT lpCreateStruct ) { HDC hdcLed;
hdcLed = GetDC( hwnd ); SetTextColor( hdcLed, CurrentColorRef ); ReleaseDC( hwnd, hdcLed );
//create the tooltips
g_hwndToolTips = CreateWindow(TOOLTIPS_CLASS, (LPTSTR) NULL, TTS_ALWAYSTIP | WS_POPUP, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hwnd, (HMENU) NULL, g_hInst, NULL);
//determine color depth
HDC hdcScreen = GetDC(NULL); UINT uBPP = GetDeviceCaps(hdcScreen, PLANES) * GetDeviceCaps(hdcScreen, BITSPIXEL); ReleaseDC(NULL, hdcScreen);
//load the logo
HBITMAP hbmpTemp = NULL; if (uBPP == 4) //16-color
{ hbmpTemp = (HBITMAP)LoadImage(g_hInst,MAKEINTRESOURCE(IDB_CDLOGO_16),IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION); } else { hbmpTemp = (HBITMAP)LoadImage(g_hInst,MAKEINTRESOURCE(IDB_CDLOGO),IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION); } hbmpLogo = DibFromBitmap((HBITMAP)hbmpTemp,0,0,NULL,0); GetObject(hbmpTemp,sizeof(g_bmLogo),&g_bmLogo); DeleteObject(hbmpTemp);
g_hwndPlay = Animate_Create(hwnd, IDI_ICON_ANI_PLAY, WS_CHILD, g_hInst);
//headers don't have Animate_OpenEx yet,
//so just do the straight call
SendMessage(g_hwndPlay,ACM_OPEN,(WPARAM)g_hInst, (LPARAM)MAKEINTRESOURCE(IDI_ICON_ANI_PLAY));
//move to the top/left of the window
RECT anirect; GetClientRect(g_hwndPlay,&anirect); MoveWindow(g_hwndPlay, LOGO_X_OFFSET, LOGO_Y_OFFSET, anirect.right - anirect.left, anirect.bottom - anirect.top, FALSE);
LED_SetTool(hwnd,TOOLID_STATUS,anirect.left,anirect.top,anirect.right,anirect.bottom);
ShowWindow(g_hwndPlay,SW_SHOW);
g_hwndMode = Animate_Create(hwnd, IDI_ICON_ANI_MODE, WS_CHILD, g_hInst);
//headers don't have Animate_OpenEx yet,
//so just do the straight call
SendMessage(g_hwndMode,ACM_OPEN,(WPARAM)g_hInst, (LPARAM)MAKEINTRESOURCE(IDI_ICON_ANI_MODE));
//move to the top/left of the window
GetClientRect(g_hwndMode,&anirect); MoveWindow(g_hwndMode, (g_bmLogo.bmWidth - (anirect.right - anirect.left)) + LOGO_X_OFFSET, LOGO_Y_OFFSET, anirect.right - anirect.left, anirect.bottom - anirect.top, FALSE);
LED_SetTool(hwnd,TOOLID_MODE, (g_bmLogo.bmWidth - (anirect.right - anirect.left)) + LOGO_X_OFFSET, LOGO_Y_OFFSET, g_bmLogo.bmWidth + LOGO_X_OFFSET, LOGO_Y_OFFSET + (anirect.bottom - anirect.top));
ShowWindow(g_hwndMode,SW_SHOW);
//set the bounding rect for clicking on the time ... intialize to whole rect
RECT rcParent; GetClientRect(hwnd,&rcParent); SetRect(&g_timerect,rcParent.left,rcParent.top,rcParent.right,rcParent.bottom);
return TRUE; }
void LED_Animation(HDC hdc) { ShowWindow(g_hwndMode,SW_SHOW); if (!g_fDownloading) { ShowWindow(g_hwndPlay,SW_SHOW);
if (g_State != g_dwLastState) { g_dwLastState = g_State; Animate_Stop(g_hwndPlay);
if (g_State & CD_PLAYING) { Animate_Play(g_hwndPlay,ANI_STOP_FRAME,ANI_LAST_PLAY_FRAME,-1); }
if (g_State & CD_STOPPED) { Animate_Seek(g_hwndPlay,ANI_STOP_FRAME); }
if (g_State & CD_PAUSED) { Animate_Play(g_hwndPlay,ANI_LAST_PLAY_FRAME,ANI_PAUSE_FRAME,-1); }
if ((g_State & CD_NO_CD) || (g_State & CD_DATA_CD_LOADED)) { Animate_Seek(g_hwndPlay,ANI_NOCD_FRAME); } } } else { if (g_hwndDownload) { ShowWindow(g_hwndDownload,SW_SHOW); } }
RECT rect; GetClientRect(g_hwndPlay,&rect); ExcludeClipRect(hdc, LOGO_X_OFFSET, LOGO_Y_OFFSET, (rect.right - rect.left) + LOGO_X_OFFSET, (rect.bottom - rect.top) + LOGO_Y_OFFSET);
DWORD dwCurFrame = MODE_NORMAL_FRAME;
if (g_fContinuous) { dwCurFrame = MODE_REPEATALL_FRAME; } if (g_fIntroPlay) { dwCurFrame = MODE_INTRO_FRAME; } if (!g_fSelectedOrder) { dwCurFrame = MODE_RANDOM_FRAME; } if (g_fRepeatSingle) { dwCurFrame = MODE_REPEAT1_FRAME; }
if (dwCurFrame != g_dwLastModeFrame) { g_dwLastModeFrame = dwCurFrame; Animate_Seek(g_hwndMode,dwCurFrame); }
GetClientRect(g_hwndMode,&rect); ExcludeClipRect(hdc, (g_bmLogo.bmWidth - (rect.right - rect.left)) + LOGO_X_OFFSET, LOGO_Y_OFFSET, g_bmLogo.bmWidth + LOGO_X_OFFSET, (rect.bottom - rect.top) + LOGO_Y_OFFSET); }
BOOL LED_LargeMode(HWND hwnd) { RECT rcParent; GetClientRect(GetParent(hwnd),&rcParent); if (rcParent.right - rcParent.left < LARGE_MODE_INDICATOR) { return FALSE; }
return TRUE; }
/*****************************Private*Routine******************************\
* LED_OnPaint * * * * History: * 18-11-93 - StephenE - Created * \**************************************************************************/ void LED_OnPaint( HWND hwnd ) { PAINTSTRUCT ps; HDC hdcLed;
hdcLed = BeginPaint( hwnd, &ps ); DoDrawing(hwnd, hdcLed, &(ps.rcPaint)); EndPaint( hwnd, &ps ); }
/*****************************Private*Routine******************************\
* LED_OnLButtonUp * * Rotate the time remaing buttons and then set the display accordingly. * * History: * 18-11-93 - StephenE - Created * \**************************************************************************/ void LED_OnLButtonUp( HWND hwnd, int x, int y, UINT keyFlags ) { BOOL b, b2;
/*
** If this window is not the master display LED just return */ if ( GetWindowLongPtr(hwnd, GWLP_ID) != IDC_LED ) { return; }
RECT rcParent; GetClientRect(GetParent(hwnd),&rcParent);
POINT pt; pt.x = x; pt.y = y; //if we're downloading AND within the logo rect, launch the provider's url
if ((g_fDownloading) && (g_pCurrentProvider)) { RECT logoRect; SetRect(&logoRect, LOGO_X_OFFSET, (rcParent.bottom - g_bmLogo.bmHeight) - LOGO_Y_OFFSET, LOGO_X_OFFSET + g_bmLogo.bmWidth, rcParent.bottom - LOGO_Y_OFFSET);
if (PtInRect(&logoRect,pt)) { ShellExecute(NULL,_TEXT("open"),g_pCurrentProvider->szProviderHome,NULL,_TEXT(""),SW_NORMAL); return; } }
//if button in time rect AND volume isn't showing, allow click
if ((PtInRect(&g_timerect,pt)) && (g_fAllowDraw)) { b = g_fDisplayT; b2 = g_fDisplayD; g_fDisplayD = g_fDisplayTr; g_fDisplayT = g_fDisplayDr; g_fDisplayDr = b2; g_fDisplayTr = b;
//reset options
LPCDOPT pOpts = (LPCDOPT)g_pSink->GetOptions(); if (pOpts) { LPCDOPTDATA pOptions = pOpts->GetCDOpts()->pCDData; if (pOptions) { if (g_fDisplayT) { pOptions->fDispMode = CDDISP_TRACKTIME; }
if (g_fDisplayTr) { pOptions->fDispMode = CDDISP_TRACKREMAIN; }
if (g_fDisplayD) { pOptions->fDispMode = CDDISP_CDTIME; }
if (g_fDisplayDr) { pOptions->fDispMode = CDDISP_CDREMAIN; } } //end if poptions
pOpts->UpdateRegistry(); } //end if popts
UpdateDisplay( DISPLAY_UPD_LED ); } //end if point in rect of time
}
void LED_DrawVolume(HWND ledWnd, HDC hdc) { if (g_szMixerName == NULL) { return; }
//only do it in "large mode"
if (!LED_LargeMode(ledWnd)) { g_fAllowDraw = TRUE; //allow drawing of title and artist
return; } RECT volrect, wholerect; HWND hwndparent = GetParent(ledWnd); GetClientRect(hwndparent,&wholerect);
//normalize the rect and set new left-hand side
wholerect.bottom = (wholerect.bottom - wholerect.top); wholerect.top = 0; wholerect.right = (wholerect.right - wholerect.left); wholerect.left = INFO_AREA_OFFSET;
volrect.bottom = wholerect.bottom - LOGO_Y_OFFSET; volrect.top = volrect.bottom - VOLUME_LINE_HEIGHT; volrect.left = wholerect.left; volrect.right = volrect.left + VOLUME_WIDTH;
if (volrect.right > g_nLastXOrigin) { volrect.right = g_nLastXOrigin; }
int nWidth = volrect.right-volrect.left;
//setup
HDC memDC = CreateCompatibleDC(hdc); HBITMAP hbmp = CreateCompatibleBitmap(hdc,wholerect.right-wholerect.left,wholerect.bottom-wholerect.top); HBITMAP holdBmp = (HBITMAP)SelectObject(memDC,hbmp); HBRUSH hbrBlack = CreateSolidBrush(RGB(0x00,0x00,0x00)); HBRUSH hbrBlue = CreateSolidBrush(CurrentColorRef); HFONT horgFont = (HFONT)SelectObject(memDC,hLEDFontB);
int nStepWidth = (nWidth / VOLUME_STEPS); int nRectWidth = nStepWidth - VOLUME_SPACING;
//blank out the background
FillRect(memDC,&wholerect,hbrBlack); DeleteObject(hbrBlack);
SetTextColor(memDC,CurrentColorRef); SetBkColor(memDC, RGB(0x00,0x00,0x00));
SIZE sz; RECT textrect; memcpy(&textrect,&wholerect,sizeof(textrect)); GetTextExtentPoint32(memDC, g_szMixerName,_tcslen(g_szMixerName), &sz ); textrect.right = textrect.left + sz.cx; textrect.bottom = volrect.top - 3; textrect.top = textrect.bottom - sz.cy; ExtTextOut(memDC,textrect.left,textrect.top,ETO_OPAQUE,&textrect,g_szMixerName,_tcslen(g_szMixerName),NULL);
//draw lines
float nVolLines = ((float)g_dwLevel / 65535) * VOLUME_STEPS;
for (int i = 0; i < VOLUME_STEPS; i++) { RECT rect; int nLineTop = volrect.top+5; if ((i >= nVolLines) && (i != 0) && (i != VOLUME_STEPS -1)) { nLineTop = volrect.bottom - ((volrect.bottom - nLineTop) / 4); }
SetRect(&rect, volrect.left + (i * nStepWidth), nLineTop, volrect.left + (i * nStepWidth) + nRectWidth, volrect.bottom);
FillRect(memDC,&rect,hbrBlue); }
//blit from memory onto display and clean up
BitBlt(hdc,wholerect.left,wholerect.top,nWidth,wholerect.bottom-wholerect.top, memDC,wholerect.left,wholerect.top,SRCCOPY);
SelectObject(memDC,holdBmp); SelectObject(memDC,horgFont); DeleteDC(memDC); DeleteObject(hbmp); DeleteObject(hbrBlue); }
//draws text and excludes its clipping rect
//returns the bottom of the rectangle, so it can be used to do lines of text
int DrawAndExclude(HDC hdc, TCHAR* szText, int xPos, int yPos, int nRight, HWND hwnd, int ToolID) { SIZE sizeText; GetTextExtentPoint32( hdc, szText, _tcslen(szText), &sizeText );
RECT rc; rc.top = yPos; rc.left = xPos; rc.right = nRight; rc.bottom = rc.top + sizeText.cy; DrawText(hdc,szText,-1,&rc,DT_CALCRECT|DT_END_ELLIPSIS|DT_EXPANDTABS|DT_NOPREFIX|DT_SINGLELINE);
//don't do drawing and clipping, or tooltip, for null strings
if (_tcslen(szText)>0) { DrawText(hdc,szText,-1,&rc,DT_END_ELLIPSIS|DT_EXPANDTABS|DT_NOPREFIX|DT_SINGLELINE); ExcludeClipRect(hdc,rc.left,rc.top,rc.right,rc.bottom); LED_SetTool(hwnd,ToolID, rc.left, rc.top, rc.right, rc.bottom); }
return (rc.bottom); }
void LED_DrawLogo(HWND hwnd, HDC hdcLed, RECT* pPaintRect) { //check to see if we should even bother
RECT rcParent; GetClientRect(GetParent(hwnd),&rcParent);
RECT destrect, logorect; SetRect(&logorect,LOGO_X_OFFSET,(rcParent.bottom - g_bmLogo.bmHeight) - LOGO_Y_OFFSET,4+g_bmLogo.bmWidth,rcParent.bottom-LOGO_Y_OFFSET); if (!IntersectRect(&destrect,&logorect,pPaintRect)) { return; //painting wasn't needed
}
HANDLE hLogoOrVendor = hbmpLogo; if ((g_fDownloading) && (hbmpVendorLogo)) { hLogoOrVendor = hbmpVendorLogo; }
//draw the bitmap of the cd logo
DibBlt(hdcLed, // destination DC
LOGO_X_OFFSET, // x upper left
(rcParent.bottom - g_bmLogo.bmHeight) - LOGO_Y_OFFSET, // y upper left
// The next two lines specify the width and height.
-1, -1, hLogoOrVendor, // source image
0, 0, // x and y upper left
SRCCOPY,0); // raster operation
ExcludeClipRect(hdcLed,LOGO_X_OFFSET,(rcParent.bottom - g_bmLogo.bmHeight) - LOGO_Y_OFFSET,4+g_bmLogo.bmWidth,rcParent.bottom-LOGO_Y_OFFSET); LED_SetTool(hwnd,TOOLID_LOGO,LOGO_X_OFFSET,(rcParent.bottom - g_bmLogo.bmHeight) - LOGO_Y_OFFSET,4+g_bmLogo.bmWidth,rcParent.bottom-LOGO_Y_OFFSET); }
void LED_GetTimeRect(HWND hwnd, HDC hdcLed, LPCTSTR s, int sLen, RECT& rect) { RECT rcParent; GetClientRect(GetParent(hwnd),&rcParent);
HFONT hOrgFont = (HFONT)SelectObject(hdcLed,hLEDFontL); SIZE sz; GetTextExtentPoint32( hdcLed, s, sLen, &sz ); rect.left = (rcParent.right - sz.cx) - LOGO_X_OFFSET; rect.top = (rcParent.bottom - sz.cy) - LOGO_Y_OFFSET;
rect.bottom = rect.top + sz.cy + 3; rect.right = rcParent.right - 3;
SelectObject( hdcLed, hOrgFont ); }
void LED_DrawInfo(HWND hwnd, HDC hdcLed, LPCTSTR s, int sLen, RECT* pPaintRect) { //figure out where time text will be, so we don't run into it
RECT timerect; LED_GetTimeRect(hwnd,hdcLed,s,sLen,timerect); int xOrigin = timerect.left;
RECT rcParent; GetClientRect(GetParent(hwnd),&rcParent);
RECT rc; rc.bottom = rcParent.bottom; rc.top = rcParent.top; rc.left = rcParent.left + INFO_AREA_OFFSET; rc.right = xOrigin;
RECT destrect; if (!IntersectRect(&destrect,&rc,pPaintRect)) { return; //painting wasn't needed
}
HFONT hOrgFont = (HFONT)SelectObject( hdcLed, hLEDFontB );
TCHAR szDisp[MAX_PATH]; TCHAR sztrack[MAX_PATH];
_tcscpy(sztrack,TEXT(""));
PTRACK_INF t; if (CURRTRACK(g_CurrCdrom)!=NULL) { t = FindTrackNodeFromTocIndex( CURRTRACK(g_CurrCdrom)->TocIndex, ALLTRACKS( g_CurrCdrom ) ); if (t) { _tcscpy(sztrack,t->name); } }
LoadString(g_hInst, STR_DISPLAY_LABELS, szDisp, sizeof(szDisp)/sizeof(TCHAR));
DrawText( hdcLed, // handle to device context
szDisp, // pointer to string to draw
-1, // string length, in characters
&rc, // pointer to struct with formatting dimensions
DT_CALCRECT|DT_EXPANDTABS|DT_NOPREFIX);
rc.top = rcParent.top + ((rcParent.bottom - rc.bottom)/2); rc.bottom = rcParent.bottom + ((rcParent.bottom - rc.bottom)/2); rc.right = rc.left;
TCHAR szTitle[MAX_PATH]; _tcscpy(szTitle,TITLE(g_CurrCdrom));
if (_tcslen(szTitle)==0) { _tcscpy(szTitle,IdStr( STR_NEW_TITLE )); }
int nNextLineTop = 0; nNextLineTop = DrawAndExclude(hdcLed,szTitle,rc.right,rc.top,xOrigin,hwnd,TOOLID_TITLE); nNextLineTop = DrawAndExclude(hdcLed,sztrack,rc.right,nNextLineTop,xOrigin,hwnd,TOOLID_TRACK); DrawAndExclude(hdcLed,ARTIST(g_CurrCdrom),rc.right,nNextLineTop,xOrigin,hwnd,TOOLID_ARTIST);
SelectObject( hdcLed, hOrgFont ); }
void LED_DrawTrackMute(HWND hwnd, HDC hdcLed, RECT* pPaintRect) { RECT rcParent; GetClientRect(GetParent(hwnd),&rcParent);
//draw the mute status, if present (or track number)
BOOL fDrawInfo = TRUE; RECT muteRect; muteRect.top = LOGO_Y_OFFSET; muteRect.right = rcParent.right; muteRect.left = rcParent.left; muteRect.bottom = rcParent.bottom;
TCHAR mutestr[MAX_PATH];
if (g_fMute) { LoadString(g_hInst,STR_MUTE,mutestr,sizeof(mutestr)/sizeof(TCHAR)); } else { TCHAR tempstr[MAX_PATH]; LoadString(g_hInst,STR_INIT_TRACK,tempstr,sizeof(tempstr)/sizeof(TCHAR)); if (CURRTRACK(g_CurrCdrom)) { wsprintf(mutestr,tempstr,(CURRTRACK(g_CurrCdrom)->TocIndex)+1); } else { fDrawInfo = FALSE;
//remove the tooltip
TOOLINFO ti; ti.cbSize = sizeof(TOOLINFO); ti.uFlags = 0; ti.hwnd = hwnd; ti.hinst = g_hInst; ti.uId = TOOLID_TRACKORMUTE; ti.lpszText = LPSTR_TEXTCALLBACK; SendMessage(g_hwndToolTips, TTM_DELTOOL, 0, (LPARAM) (LPTOOLINFO) &ti); } }
if (fDrawInfo) { HFONT hOldFont;
hOldFont = (HFONT) SelectObject(hdcLed, hLEDFontB); DrawText(hdcLed,mutestr,-1,&muteRect,DT_CALCRECT|DT_SINGLELINE); muteRect.left = (rcParent.right - LOGO_X_OFFSET) - (muteRect.right - muteRect.left); muteRect.right = rcParent.right - LOGO_X_OFFSET;
RECT destrect; if (IntersectRect(&destrect,&muteRect,pPaintRect)) {
if (g_fMute) { SetTextColor(hdcLed,RGB(0xFF,0x00,0x00)); }
DrawText(hdcLed,mutestr,-1,&muteRect,DT_SINGLELINE); ExcludeClipRect(hdcLed,muteRect.left,muteRect.top,muteRect.right,muteRect.bottom); LED_SetTool(hwnd,TOOLID_TRACKORMUTE,muteRect.left,muteRect.top,muteRect.right,muteRect.bottom); SetTextColor( hdcLed, CurrentColorRef ); }
// restore font
SelectObject(hdcLed, hOldFont);
} //end if draw info
}
/*****************************Private*Routine******************************\
* LED_DrawText * * Draws the LED display screen text (quickly). The text is centered * vertically and horizontally. Only the backround is drawn if the g_fFlashed * flag is set. * * History: * 18-11-93 - StephenE - Created * \**************************************************************************/ void LED_DrawText( HWND hwnd, HDC hdcLed, LPCTSTR s, int sLen ) { RECT rc; SIZE sz; int xOrigin; int yOrigin; BOOL fLargeMode = FALSE;
HWND hwndparent = GetParent(hwnd); HFONT hOrgFont = NULL;
RECT rcParent; GetClientRect(hwndparent,&rcParent);
if (LED_LargeMode(hwnd)) { fLargeMode = TRUE; } else { //change the string to display the track info
if (CURRTRACK(g_CurrCdrom)) { TCHAR tempstr[MAX_PATH]; wsprintf(tempstr,TEXT("[%i] %s"),CURRTRACK(g_CurrCdrom)->TocIndex+1,s); _tcscpy((TCHAR*)s,tempstr); sLen = _tcslen(s); } }
if (fLargeMode) { hOrgFont = (HFONT)SelectObject(hdcLed,hLEDFontL); } else { hOrgFont = (HFONT)SelectObject(hdcLed,hLEDFontS); }
GetTextExtentPoint32( hdcLed, s, sLen, &sz );
if (fLargeMode) { xOrigin = (rcParent.right - sz.cx) - LOGO_X_OFFSET; yOrigin = (rcParent.bottom - sz.cy) - LOGO_Y_OFFSET; } else { xOrigin = ((rcParent.right - rcParent.left) - sz.cx) / 2; yOrigin = ((rcParent.bottom - rcParent.top) - sz.cy) / 2; }
if (sLen==1) { xOrigin = g_nLastXOrigin; } else { g_nLastXOrigin = xOrigin; }
if (fLargeMode) { if (!g_fAllowDraw) { int nRightClip = INFO_AREA_OFFSET + VOLUME_WIDTH; if (nRightClip > xOrigin) { nRightClip = xOrigin; } ExcludeClipRect(hdcLed,INFO_AREA_OFFSET,rcParent.top,nRightClip,rcParent.bottom); } }
rc.top = yOrigin; rc.bottom = rc.top + sz.cy + 3; rc.left = xOrigin; rc.right = rcParent.right - 3;
ExtTextOut( hdcLed, xOrigin, rc.top, ETO_OPAQUE, &rc, s, sLen, NULL); ExcludeClipRect(hdcLed,rc.left,rc.top,rc.right,rc.bottom); if (fLargeMode) { //set time rect to cover just the time values for clicking
SetRect(&g_timerect,rc.left,rc.top,rc.right,rc.bottom); } else { SIZE tracksz; tracksz.cx = 0; if (CURRTRACK(g_CurrCdrom)) { TCHAR tempstr[MAX_PATH]; wsprintf(tempstr,TEXT("[%i]"),CURRTRACK(g_CurrCdrom)->TocIndex+1); GetTextExtentPoint32( hdcLed, tempstr, _tcslen(tempstr), &tracksz ); LED_SetTool(hwnd,TOOLID_TRACKORMUTE,rcParent.left,rcParent.top,rc.left+tracksz.cx,rcParent.bottom); } else { rc.left = rcParent.left; }
//set time rect to cover the part of the client area that isn't the track
SetRect(&g_timerect,rc.left+tracksz.cx,rcParent.top,rcParent.right,rcParent.bottom); }
LED_SetTool(hwnd,TOOLID_TIME,g_timerect.left,g_timerect.top,g_timerect.right,g_timerect.bottom);
HBRUSH hbrBlack = CreateSolidBrush(RGB(0x00,0x00,0x00));
RECT rectLED; GetClientRect(hwnd,&rectLED); FillRect(hdcLed,&rectLED,hbrBlack); DeleteObject(hbrBlack);
SelectObject(hdcLed, hOrgFont); }
/*****************************Private*Routine******************************\
* LED_OnSetText * * Change the LED display text. Calling DefWindowProc ensures that the * window text is saved correctly. * * History: * 18-11-93 - StephenE - Created * \**************************************************************************/ void LED_OnSetText( HWND hwnd, LPCTSTR lpszText ) { DefWindowProc( hwnd, WM_SETTEXT, 0, (LPARAM)lpszText);
if (LED_LargeMode(hwnd)) { RECT rect; HDC hdc = GetDC(hwnd); LED_GetTimeRect(hwnd, hdc, lpszText, _tcslen(lpszText), rect); ReleaseDC(hwnd,hdc); rect.left = g_nLastXOrigin; InvalidateRect(hwnd,&rect,FALSE); } else { InvalidateRect(hwnd,NULL,FALSE); }
UpdateWindow(hwnd); }
/*****************************Private*Routine******************************\
* LED_CreateLEDFonts * * Small font is 12pt MS Sans Serif * Large font is 18pt MS Sans Serif * * History: * dd-mm-94 - StephenE - Created * \**************************************************************************/ void LED_CreateLEDFonts( HDC hdc ) { LOGFONT lf; int iLogPelsY;
iLogPelsY = GetDeviceCaps( hdc, LOGPIXELSY );
ZeroMemory( &lf, sizeof(lf) );
HFONT hTempFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT); GetObject(hTempFont,sizeof(lf),&lf);
lf.lfHeight = (-9 * iLogPelsY) / 72; /* 9pt */ if (lf.lfCharSet == ANSI_CHARSET) { lf.lfWeight = FW_BOLD; } lf.lfOutPrecision = OUT_DEFAULT_PRECIS; lf.lfClipPrecision = CLIP_DEFAULT_PRECIS; lf.lfQuality = PROOF_QUALITY; lf.lfPitchAndFamily = DEFAULT_PITCH | FF_SWISS;
hLEDFontS = CreateFontIndirect(&lf);
lf.lfHeight = (-10 * iLogPelsY) / 72; /* 10 pt */ if (lf.lfCharSet == ANSI_CHARSET) { lf.lfWeight = FW_BOLD; }
hLEDFontB = CreateFontIndirect(&lf);
lf.lfHeight = (-20 * iLogPelsY) / 72; /* 20 pt */ if (lf.lfCharSet == ANSI_CHARSET) { lf.lfWeight = FW_EXTRABOLD; /* extra bold */ }
hLEDFontL = CreateFontIndirect(&lf);
/*
** If can't create either font set up some sensible defaults. */ if ( hLEDFontL == NULL || hLEDFontS == NULL || hLEDFontB == NULL) { if ( hLEDFontL != NULL ) { DeleteObject( hLEDFontL ); }
if ( hLEDFontS != NULL ) { DeleteObject( hLEDFontS ); }
if ( hLEDFontB != NULL ) { DeleteObject( hLEDFontB ); }
hLEDFontS = hLEDFontL = hLEDFontB = (HFONT)GetStockObject( ANSI_VAR_FONT ); } }
/* -------------------------------------------------------------------------
** Private functions for the Text class ** ------------------------------------------------------------------------- */ void Text_OnPaint( HWND hwnd );
LRESULT CALLBACK TextWndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );
void Text_OnSetText( HWND hwnd, LPCTSTR lpszText );
void Text_OnSetFont( HWND hwndCtl, HFONT hfont, BOOL fRedraw );
/******************************Public*Routine******************************\
* Init_SJE_TextClass * * Called to register the text window class . * This function must be called before the CD Player dialog box is created. * * History: * 18-11-93 - StephenE - Created * \**************************************************************************/ BOOL Init_SJE_TextClass( HINSTANCE hInst ) { WNDCLASS wndclass;
ZeroMemory( &wndclass, sizeof(wndclass) );
/*
** Register the Text window. */ wndclass.lpfnWndProc = TextWndProc; wndclass.hInstance = hInst; wndclass.hCursor = LoadCursor( NULL, IDC_ARROW ); wndclass.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1); wndclass.lpszClassName = g_szTextClassName;
return RegisterClass( &wndclass ); }
/******************************Public*Routine******************************\
* TextWndProc * * This routine handles the WM_PAINT and WM_SETTEXT messages * for the "Text" display window. * * History: * 18-11-93 - StephenE - Created * \**************************************************************************/ LRESULT CALLBACK TextWndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { switch( message ) {
HANDLE_MSG( hwnd, WM_PAINT, Text_OnPaint ); HANDLE_MSG( hwnd, WM_SETTEXT, Text_OnSetText ); HANDLE_MSG( hwnd, WM_SETFONT, Text_OnSetFont ); }
return DefWindowProc( hwnd, message, wParam, lParam ); }
/*****************************Private*Routine******************************\
* Text_OnPaint * * * * History: * 18-11-93 - StephenE - Created * \**************************************************************************/ void Text_OnPaint( HWND hwnd ) { PAINTSTRUCT ps; TCHAR s[128]; int sLen; HDC hdc; RECT rc; HFONT hfont; HFONT hfontOrg; LONG_PTR lStyle;
hdc = BeginPaint( hwnd, &ps );
GetWindowRect( hwnd, &rc ); MapWindowRect( GetDesktopWindow(), hwnd, &rc );
lStyle = GetWindowLongPtr( hwnd, GWL_STYLE ); sLen = GetWindowText( hwnd, s, 128 ); hfont = (HFONT)GetWindowLongPtr( hwnd, GWLP_USERDATA ); if ( hfont ) { hfontOrg = (HFONT)SelectObject( hdc, hfont ); }
/*
** Draw a frame around the window */ DrawEdge( hdc, &rc, EDGE_SUNKEN, BF_RECT );
/*
** Draw the text */ SetBkColor( hdc, GetSysColor( COLOR_BTNFACE ) ); SetTextColor( hdc, GetSysColor( COLOR_WINDOWTEXT ) ); rc.left = 1 + (2 * GetSystemMetrics(SM_CXBORDER));
DrawText( hdc, s, sLen, &rc, DT_NOPREFIX | DT_LEFT | DT_VCENTER | DT_NOCLIP | DT_SINGLELINE );
if ( hfontOrg ) { SelectObject( hdc, hfontOrg ); }
EndPaint( hwnd, &ps ); }
/*****************************Private*Routine******************************\
* Text_OnSetText * * Change the text. Calling DefWindowProc ensures that the * window text is saved correctly. * * History: * 18-11-93 - StephenE - Created * \**************************************************************************/ void Text_OnSetText( HWND hwnd, LPCTSTR lpszText ) { DefWindowProc( hwnd, WM_SETTEXT, 0, (LPARAM)lpszText); InvalidateRect( hwnd, NULL, TRUE ); UpdateWindow( hwnd ); }
/*****************************Private*Routine******************************\
* Text_OnSetFont * * Sets the windows font * * History: * 18-11-93 - StephenE - Created * \**************************************************************************/ void Text_OnSetFont( HWND hwnd, HFONT hfont, BOOL fRedraw ) { SetWindowLongPtr( hwnd, GWLP_USERDATA, (LONG_PTR)hfont ); if ( fRedraw ) { InvalidateRect( hwnd, NULL, TRUE ); UpdateWindow( hwnd ); } }
|