www.pudn.com > freepy.rar > uistatus.cpp


/* 
 * Copyright (C) 1999.4  Li ZhenChun 
 * 
 * This program is free software; you can redistribute it and/or modify 
 * it under the terms of the GNU General Public License as published by 
 * the Free Software Foundation; either version 2 of the License; or 
 * (at your option) any later version. 
 * 
 * This program is distributed in the hope that is will be useful, but 
 * WITHOUT ANY WARRANTY; without even the implied warranty of  
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 
 * General Public License for more details. 
 * 
 * You should have received a copy of the GNU General Public License 
 * along with this program; if not, write to the Free Software 
 * Foundation, Inc., 675 Mass Ave, Cambridge, M A 02139, USA. 
 * 
 * Author: Li ZhenChun  email: zhchli@163.net or zhchli@126.com 
 *  
 */ 
 
#include "freepy.h" 
#include "stub.h" 
 
#define HELPFILENAME      _T("freepy.hlp") 
 
#define TIMEID            1 
#define TIMEOUT           600 
 
#define BITMAPX           20 
#define BITMAPY           20 
#define BITMAPCHINESEDES  60 
#define BITMAPFULLDES     80 
#define BITMAPPUNCTDES    100 
#define BITMAPCHINESESRC  60 
#define BITMAPFULLSRC     100 
#define BITMAPPUNCTSRC    140 
 
#define BUTTONMENU        0x01 
#define BUTTONPY          0x02 
#define BUTTONCHINESE     0x04 
#define BUTTONFULL        0x08 
#define BUTTONPUNCT       0x10 
#define BUTTONPUSH        0x8000 
 
#define SETFUZZY          0x01 
#define SETSORT           0x02 
 
static HBITMAP hBmpStatus; 
 
void PaintStatus( HWND,HDC,DWORD); 
DWORD CheckButtonPos( HWND , LPPOINT); 
BOOL WINAPI SetDialogProc(HWND,UINT,WPARAM,LPARAM); 
BOOL WINAPI AboutDialogProc(HWND,UINT,WPARAM,LPARAM); 
 
LRESULT WINAPI StatusWndProc( 
			HWND hWnd , 
			UINT message , 
			WPARAM wParam , 
			LPARAM lParam ) 
{ 
	static BOOL  fCanMove = FALSE; 
    static POINT ptdif; 
    static RECT  drc; 
    static SIZE  sz; 
	static DWORD dwButton; 
 
    DWORD        dwT; 
    POINT        pt; 
	HDC          hDC; 
	HFONT        oldFont; 
	HKEY         hKey,hChildKey; 
	DWORD        dwDisposition; 
 
	hDC = GetDC(hWnd); 
	oldFont = (HFONT)SelectObject(hDC, hUIFont); 
    switch (message) 
    { 
        case WM_CREATE: 
            hBmpStatus = LoadBitmap(hInst,MAKEINTRESOURCE(STATUSBITMAP)); 
            break; 
 
        case WM_PAINT: 
			{ 
			    PAINTSTRUCT ps; 
			    HDC hPaintDC; 
 
				hPaintDC = BeginPaint(hWnd,&ps); 
		        PaintStatus(hWnd ,hPaintDC, 0); 
				EndPaint(hWnd,&ps); 
			    break; 
			} 
 
		case WM_TIMER: 
			KillTimer(hWnd,TIMEID); 
			SetCursor(LoadCursor(NULL,IDC_SIZEALL)); 
			fCanMove = TRUE; 
			dwButton &= ~BUTTONPUSH; 
			PaintStatus(hWnd,hDC,dwButton); 
			break; 
 
        case WM_SETCURSOR: 
			if ( HIWORD(lParam) == WM_LBUTTONDOWN ) { 
				SetCapture(hWnd); 
 
				GetCursorPos( &pt ); 
				GetWindowRect(hWnd,&drc); 
				ptdif.x = pt.x - drc.left; 
				ptdif.y = pt.y - drc.top; 
				sz.cx = drc.right - drc.left; 
				sz.cy = drc.bottom - drc.top; 
				SetWindowLong(hWnd,FIGWL_MOUSE,FIM_CAPUTURED); 
 
				dwButton = CheckButtonPos( hWnd, &pt); 
				dwButton |= BUTTONPUSH; 
				PaintStatus(hWnd,hDC,dwButton); 
 
				if( dwButton & BUTTONPY) 
					SetTimer(hWnd,TIMEID,1,NULL); 
				else 
					SetTimer(hWnd,TIMEID,TIMEOUT,NULL); 
			} 
			else  
				return DefWindowProc(hWnd,message,wParam,lParam); 
			break; 
 
        case WM_LBUTTONUP: 
			KillTimer(hWnd,TIMEID); 
			ReleaseCapture(); 
			if( fCanMove ) { 
				dwT = GetWindowLong(hWnd,FIGWL_MOUSE); 
				if (dwT & FIM_MOVED) { 
					DrawUIBorder(&drc); 
					GetCursorPos( &pt ); 
					MoveWindow(hWnd,pt.x - ptdif.x, 
							pt.y - ptdif.y, 
							sz.cx, 
							sz.cy,TRUE); 
				} 
				SetCursor(LoadCursor(NULL,IDC_ARROW)); 
			} 
			else{ 
				if( dwButton & BUTTONCHINESE ) { 
				    HWND hSvrWnd; 
					HIMC hIMC; 
					LPINPUTCONTEXT lpIMC; 
 
					hSvrWnd = (HWND)GetWindowLong(hWnd,FIGWL_SVRWND); 
					hIMC = (HIMC)GetWindowLong(hSvrWnd,IMMGWL_IMC); 
			        lpIMC = ImmLockIMC(hIMC); 
					if(lpIMC->fOpen) { 
						lpIMC->fOpen=FALSE; 
						MakeResultString(hIMC,FALSE); 
					} 
					else lpIMC->fOpen=TRUE; 
				} 
 
				if( dwButton & BUTTONFULL){ 
					if(wConversionSet & CONVERSION_SET_FULLSHAPE) 
						wConversionSet &= ~CONVERSION_SET_FULLSHAPE; 
					else 
						wConversionSet |= CONVERSION_SET_FULLSHAPE; 
				} 
 
				if( dwButton & BUTTONPUNCT ){ 
					if(wConversionSet & CONVERSION_SET_PUNCT) 
						wConversionSet &= ~CONVERSION_SET_PUNCT; 
					else 
						wConversionSet |= CONVERSION_SET_PUNCT; 
				} 
 
				if( dwButton & BUTTONMENU ){ 
					HMENU hMenu,hSubMenu; 
					POINT pt; 
					int cmd; 
 
					hMenu = LoadMenu(hInst, MAKEINTRESOURCE(FREEPYMENU)); 
					hSubMenu = GetSubMenu(hMenu,0); 
  
					pt.x = 0; 
					pt.y = 0; 
					ClientToScreen(hWnd, &pt); 
 
	                cmd = TrackPopupMenu(hSubMenu,  
                                     TPM_LEFTALIGN | TPM_BOTTOMALIGN | TPM_RETURNCMD,  
                                     pt.x, 
                                     pt.y, 
                                     0,  
                                     hWnd,  
                                     NULL); 
					switch (cmd) { 
					case IDM_SET: 
						DialogBox( hInst,MAKEINTRESOURCE(DIALOGSET),NULL,SetDialogProc); 
						InvalidateRect(hWnd,NULL,FALSE); 
						break; 
					case IDM_HELP: 
						{ 
							TCHAR szHelpFileName[100]; 
							LPTSTR lpHelpFileName; 
 
							lpHelpFileName = szHelpFileName; 
							lpHelpFileName += GetWindowsDirectory(szHelpFileName,100); 
							 
							if (*(lpHelpFileName-1) != _T('\\')) 
								*lpHelpFileName++ = _T('\\'); 
							_tcscpy(lpHelpFileName,HELPFILENAME); 
							//WinHelp(NULL,szHelpFileName,HELP_CONTENTS,0); 
							InvalidateRect(hWnd,NULL,FALSE); 
						} 
						break; 
					case IDM_ABOUT: 
						DialogBox( hInst,MAKEINTRESOURCE(DIALOGABOUT),NULL,AboutDialogProc); 
						InvalidateRect(hWnd,NULL,FALSE); 
						break; 
					default: 
						break; 
					} 
 
		            if (hMenu) DestroyMenu(hMenu); 
				} 
 
				dwButton &= ~BUTTONPUSH; 
				PaintStatus(hWnd,hDC,dwButton); 
			} 
 
			SetWindowLong(hWnd,FIGWL_MOUSE,0); 
			fCanMove = FALSE; 
			break; 
         
        case WM_MOUSEMOVE: 
			if( fCanMove ) { 
				dwT = GetWindowLong(hWnd,FIGWL_MOUSE); 
				if (dwT & FIM_MOVED) { 
					DrawUIBorder(&drc); 
					GetCursorPos( &pt ); 
					drc.left   = pt.x - ptdif.x; 
					drc.top    = pt.y - ptdif.y; 
					drc.right  = drc.left + sz.cx; 
					drc.bottom = drc.top + sz.cy; 
					DrawUIBorder(&drc); 
				} 
				else if (dwT & FIM_CAPUTURED) 
				{ 
					DrawUIBorder(&drc); 
					SetWindowLong(hWnd,FIGWL_MOUSE,dwT | FIM_MOVED); 
				} 
			} 
//			else KillTimer(hWnd,TIMEID); 
			break; 
 
        case WM_DESTROY: 
            DeleteObject(hBmpStatus); 
            break; 
 
		case WM_MOVE: 
			if ( RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
				_T("Software"), 
				0, 
				KEY_READ, 
				&hKey) == ERROR_SUCCESS ){ 
				 
				if( RegCreateKeyEx( hKey, 
					_T("freepy"), 
					0, 
					NULL, 
					REG_OPTION_NON_VOLATILE , 
					KEY_ALL_ACCESS , 
					NULL, 
					&hChildKey, 
					&dwDisposition ) == ERROR_SUCCESS) { 
						RegSetValueEx(hChildKey, 
							_T("Position"), 
							0, 
							REG_DWORD, 
							(LPBYTE)&lParam, 
							sizeof(DWORD)); 
					RegCloseKey(hChildKey); 
				} 
				 
				RegCloseKey(hKey); 
			} 
			break; 
 
        default: 
            if (!MyIsIMEMessage(message)) 
                return DefWindowProc(hWnd,message,wParam,lParam); 
            break; 
    } 
	SelectObject(hDC, oldFont); 
	ReleaseDC(hWnd,hDC); 
    return 0; 
} 
 
void CreateStatusWindow( HWND hUIWnd, LPUIEXTRA lpUIExtra) 
{ 
    if (!IsWindow(lpUIExtra->uiStatus.hWnd)) 
    { 
		RECT screenrc; 
		HKEY hKey; 
		DWORD dwPosition,dwData=sizeof(DWORD); 
		BOOL fFlag=TRUE; 
 
		lpUIExtra->uiStatus.sz.cx = BITMAPX * 6 ; 
		lpUIExtra->uiStatus.sz.cy = BITMAPY ; 
 
		if ( RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
			_T("Software\\freepy"), 
			0, 
			KEY_READ, 
			&hKey) == ERROR_SUCCESS ){ 
			if( RegQueryValueEx( hKey, 
								_T("Position"), 
								NULL, 
								NULL, 
								(LPBYTE)&dwPosition, 
								&dwData) == ERROR_SUCCESS ){ 
				lpUIExtra->uiStatus.pt.x = (int)(short) LOWORD(dwPosition); 
				lpUIExtra->uiStatus.pt.y = (int)(short) HIWORD(dwPosition); 
				fFlag = FALSE; 
			} 
			RegCloseKey(hKey); 
		} 
 
		if(fFlag){ 
			SystemParametersInfo(SPI_GETWORKAREA, 
							0, 
							&screenrc, 
							0); 
 
			lpUIExtra->uiStatus.pt.x = screenrc.left + 10; 
			lpUIExtra->uiStatus.pt.y = screenrc.bottom - lpUIExtra->uiStatus.sz.cy - 5; 
		} 
 
		lpUIExtra->uiStatus.hWnd =  
                      CreateWindowEx( 0, 
                            STATUSCLASSNAME,NULL, 
                            WS_DISABLED | WS_POPUP, 
                            lpUIExtra->uiStatus.pt.x, 
                            lpUIExtra->uiStatus.pt.y, 
							lpUIExtra->uiStatus.sz.cx, 
							lpUIExtra->uiStatus.sz.cy, 
                            hUIWnd,NULL,hInst,NULL); 
		SetWindowLong(lpUIExtra->uiStatus.hWnd,FIGWL_SVRWND,(DWORD)hUIWnd); 
	} 
 
	ShowWindow(lpUIExtra->uiStatus.hWnd,SW_SHOWNOACTIVATE); 
    return; 
} 
 
DWORD CheckButtonPos( HWND hStatusWnd, LPPOINT lppt) 
{ 
    POINT pt; 
    RECT rc; 
	DWORD dwButton = 0; 
 
    if (lppt) 
    { 
        pt = *lppt; 
        ScreenToClient(hStatusWnd,&pt); 
        GetClientRect(hStatusWnd,&rc); 
        if (!PtInRect(&rc,pt)) 
            return 0; 
 
		if(pt.x < BITMAPX) { 
			dwButton |= BUTTONMENU; 
		} 
		else if (pt.x < BITMAPCHINESEDES) { 
			dwButton |= BUTTONPY; 
		} 
		else if (pt.x < BITMAPFULLDES) { 
			dwButton |= BUTTONCHINESE; 
		} 
		else if (pt.x < BITMAPPUNCTDES) { 
			dwButton |= BUTTONFULL; 
		} 
		else if (pt.x < BITMAPPUNCTDES + BITMAPX) { 
			dwButton |= BUTTONPUNCT; 
		} 
	} 
    return dwButton; 
} 
 
void PaintStatus( HWND hStatusWnd,HDC hDC,DWORD dwButton ) 
{ 
 
    HIMC hIMC; 
    LPINPUTCONTEXT lpIMC; 
    HDC hMemDC; 
    HBITMAP hBmpOld; 
    HWND hSvrWnd; 
 
    hSvrWnd = (HWND)GetWindowLong(hStatusWnd,FIGWL_SVRWND); 
 
    if (hIMC = (HIMC)GetWindowLong(hSvrWnd,IMMGWL_IMC)) 
    { 
        lpIMC = ImmLockIMC(hIMC); 
        hMemDC = CreateCompatibleDC(hDC); 
        hBmpOld = (HBITMAP)SelectObject(hMemDC,hBmpStatus); 
 
		if( (dwButton & BUTTONMENU) || !dwButton){ 
			if( dwButton & BUTTONPUSH) 
				BitBlt(hDC,0,0,BITMAPX,BITMAPY,hMemDC,0,BITMAPY,SRCCOPY); 
			else 
				BitBlt(hDC,0,0,BITMAPX,BITMAPY,hMemDC,0,0,SRCCOPY); 
		} 
 
		if( (dwButton & BUTTONPY) || !dwButton){ 
			if( dwButton & BUTTONPUSH) 
				BitBlt(hDC,BITMAPX,0,BITMAPX*2,BITMAPY,hMemDC,BITMAPX,BITMAPY,SRCCOPY); 
			else 
				BitBlt(hDC,BITMAPX,0,BITMAPX*2,BITMAPY,hMemDC,BITMAPX,0,SRCCOPY); 
		} 
 
		if( (dwButton & BUTTONCHINESE) || !dwButton){ 
			if(lpIMC->fOpen){ 
				if( dwButton & BUTTONPUSH) 
					BitBlt(hDC,BITMAPCHINESEDES,0,BITMAPX,BITMAPY,hMemDC,BITMAPCHINESESRC,BITMAPY,SRCCOPY); 
				else 
					BitBlt(hDC,BITMAPCHINESEDES,0,BITMAPX,BITMAPY,hMemDC,BITMAPCHINESESRC,0,SRCCOPY); 
			} 
			else{ 
				if( dwButton & BUTTONPUSH) 
					BitBlt(hDC,BITMAPCHINESEDES,0,BITMAPX,BITMAPY,hMemDC,BITMAPCHINESESRC + BITMAPX,BITMAPY,SRCCOPY); 
				else 
					BitBlt(hDC,BITMAPCHINESEDES,0,BITMAPX,BITMAPY,hMemDC,BITMAPCHINESESRC + BITMAPX,0,SRCCOPY); 
			} 
		} 
 
		if( (dwButton & BUTTONFULL) || !dwButton){ 
			if(wConversionSet & CONVERSION_SET_FULLSHAPE) { 
				if( dwButton & BUTTONPUSH) 
					BitBlt(hDC,BITMAPFULLDES,0,BITMAPX,BITMAPY,hMemDC,BITMAPFULLSRC,BITMAPY,SRCCOPY); 
				else 
					BitBlt(hDC,BITMAPFULLDES,0,BITMAPX,BITMAPY,hMemDC,BITMAPFULLSRC,0,SRCCOPY); 
			} 
			else{ 
				if( dwButton & BUTTONPUSH) 
					BitBlt(hDC,BITMAPFULLDES,0,BITMAPX,BITMAPY,hMemDC,BITMAPFULLSRC + BITMAPX,BITMAPY,SRCCOPY); 
				else 
					BitBlt(hDC,BITMAPFULLDES,0,BITMAPX,BITMAPY,hMemDC,BITMAPFULLSRC + BITMAPX,0,SRCCOPY); 
			} 
		} 
 
		if( (dwButton & BUTTONPUNCT) || !dwButton){ 
			if(wConversionSet & CONVERSION_SET_PUNCT) { 
				if( dwButton & BUTTONPUSH) 
					BitBlt(hDC,BITMAPPUNCTDES,0,BITMAPX,BITMAPY,hMemDC,BITMAPPUNCTSRC,BITMAPY,SRCCOPY); 
				else 
					BitBlt(hDC,BITMAPPUNCTDES,0,BITMAPX,BITMAPY,hMemDC,BITMAPPUNCTSRC,0,SRCCOPY); 
			} 
			else{ 
				if( dwButton & BUTTONPUSH) 
					BitBlt(hDC,BITMAPPUNCTDES,0,BITMAPX,BITMAPY,hMemDC,BITMAPPUNCTSRC + BITMAPX,BITMAPY,SRCCOPY); 
				else 
					BitBlt(hDC,BITMAPPUNCTDES,0,BITMAPX,BITMAPY,hMemDC,BITMAPPUNCTSRC + BITMAPX,0,SRCCOPY); 
			} 
		} 
 
		SelectObject(hMemDC,hBmpOld); 
        DeleteDC(hMemDC); 
        ImmUnlockIMC(hIMC); 
    } 
} 
 
void UpdateStatusWindow(LPUIEXTRA lpUIExtra) 
{ 
    if (IsWindow(lpUIExtra->uiStatus.hWnd)) { 
		InvalidateRect(lpUIExtra->uiStatus.hWnd,NULL,FALSE); 
	} 
} 
 
BOOL WINAPI SetDialogProc( 
			HWND hWnd , 
			UINT message , 
			WPARAM wParam , 
			LPARAM lParam ) 
{ 
	switch(message) { 
	case WM_INITDIALOG: 
		CheckDlgButton(hWnd,IDC_CHECKSORT, 
			(wConversionSet & CONVERSION_SET_SORT)? BST_CHECKED :BST_UNCHECKED ); 
		CheckDlgButton(hWnd,IDC_CHECKFOLLOW, 
			(wConversionSet & CONVERSION_SET_FOLLOW)? BST_CHECKED :BST_UNCHECKED ); 
		CheckDlgButton(hWnd,IDC_CHECKGBK, 
			(wConversionSet & CONVERSION_SET_GBK)? BST_CHECKED :BST_UNCHECKED ); 
		CheckDlgButton(hWnd,IDC_CHECKFUZZYC, 
			(wConversionSet & CONVERSION_SET_FUZZYC)? BST_CHECKED :BST_UNCHECKED ); 
		CheckDlgButton(hWnd,IDC_CHECKFUZZYN, 
			(wConversionSet & CONVERSION_SET_FUZZYN)? BST_CHECKED :BST_UNCHECKED ); 
		CheckDlgButton(hWnd,IDC_CHECKFUZZYH, 
			(wConversionSet & CONVERSION_SET_FUZZYH)? BST_CHECKED :BST_UNCHECKED ); 
		CheckDlgButton(hWnd,IDC_CHECKFUZZYB, 
			(wConversionSet & CONVERSION_SET_FUZZYB)? BST_CHECKED :BST_UNCHECKED ); 
		CheckDlgButton(hWnd,IDC_CHECKSHAPE, 
			(wConversionSet & CONVERSION_SET_SHAPE)? BST_CHECKED :BST_UNCHECKED ); 
		CheckDlgButton(hWnd,IDC_CHECKBIG5, 
			(wConversionSet & CONVERSION_SET_BIG5)? BST_CHECKED :BST_UNCHECKED ); 
		break; 
 
	case WM_COMMAND: 
		switch(wParam) { 
		case IDC_CHECKFUZZYC: 
			break; 
 
		case IDC_CHECKFUZZYN: 
			break; 
 
		case IDC_CHECKFUZZYH: 
			break; 
 
		case IDC_CHECKSORT: 
			break; 
 
		case IDOK: 
			if(IsDlgButtonChecked(hWnd,IDC_CHECKSORT) == BST_CHECKED) 
				wConversionSet |= CONVERSION_SET_SORT; 
			else 
				wConversionSet &= ~CONVERSION_SET_SORT; 
 
			if(IsDlgButtonChecked(hWnd,IDC_CHECKFOLLOW) == BST_CHECKED) 
				wConversionSet |= CONVERSION_SET_FOLLOW; 
			else 
				wConversionSet &= ~CONVERSION_SET_FOLLOW; 
 
			if(IsDlgButtonChecked(hWnd,IDC_CHECKGBK) == BST_CHECKED) 
				wConversionSet |= CONVERSION_SET_GBK; 
			else 
				wConversionSet &= ~CONVERSION_SET_GBK; 
 
			if(IsDlgButtonChecked(hWnd,IDC_CHECKFUZZYC) == BST_CHECKED) 
				wConversionSet |= CONVERSION_SET_FUZZYC; 
			else 
				wConversionSet &= ~CONVERSION_SET_FUZZYC; 
 
			if(IsDlgButtonChecked(hWnd,IDC_CHECKFUZZYN) == BST_CHECKED) 
				wConversionSet |= CONVERSION_SET_FUZZYN; 
			else 
				wConversionSet &= ~CONVERSION_SET_FUZZYN; 
 
			if(IsDlgButtonChecked(hWnd,IDC_CHECKFUZZYH) == BST_CHECKED) 
				wConversionSet |= CONVERSION_SET_FUZZYH; 
			else 
				wConversionSet &= ~CONVERSION_SET_FUZZYH; 
 
			if(IsDlgButtonChecked(hWnd,IDC_CHECKFUZZYB) == BST_CHECKED) 
				wConversionSet |= CONVERSION_SET_FUZZYB; 
			else 
				wConversionSet &= ~CONVERSION_SET_FUZZYB; 
 
			if(IsDlgButtonChecked(hWnd,IDC_CHECKSHAPE) == BST_CHECKED) 
				wConversionSet |= CONVERSION_SET_SHAPE; 
			else 
				wConversionSet &= ~CONVERSION_SET_SHAPE; 
 
			if(IsDlgButtonChecked(hWnd,IDC_CHECKBIG5) == BST_CHECKED) 
				wConversionSet |= CONVERSION_SET_BIG5; 
			else 
				wConversionSet &= ~CONVERSION_SET_BIG5; 
			 
			EndDialog(hWnd,TRUE); 
			break; 
 
		case IDCANCEL: 
			EndDialog(hWnd,TRUE); 
			break; 
 
		default: 
			return FALSE; 
			break; 
		} 
		break; 
 
	default: 
		return FALSE; 
		break; 
	} 
	return TRUE; 
} 
 
BOOL WINAPI AboutDialogProc( 
			HWND hWnd , 
			UINT message , 
			WPARAM wParam , 
			LPARAM lParam ) 
{ 
 
	switch(message) { 
	case WM_INITDIALOG: 
		break; 
 
	case WM_COMMAND: 
		switch(wParam) { 
		case IDOK: 
		case IDCANCEL: 
			EndDialog(hWnd,TRUE); 
			break; 
		default: 
			return FALSE; 
			break; 
		} 
		break; 
	default: 
		return FALSE; 
		break; 
	} 
	return TRUE; 
}