You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
641 lines
17 KiB
641 lines
17 KiB
|
|
/*************************************************
|
|
* winmain.c *
|
|
* *
|
|
* Copyright (C) 1995-1999 Microsoft Inc. *
|
|
* *
|
|
*************************************************/
|
|
|
|
//
|
|
// 1/17/96
|
|
// @E01 Change for multi-threading
|
|
// @E02 Change for multi-threading without extending function
|
|
|
|
#include <windows.h> // required for all Windows applications
|
|
#include <tchar.h>
|
|
#include <process.h> // <=== @E01
|
|
#include <commctrl.h> // <=== @E01
|
|
#include <htmlhelp.h>
|
|
#include "rc.h" // prototypes specific to this application
|
|
#include "uimetool.h"
|
|
#include "wizard.h"
|
|
#include "imeattr.h"
|
|
#include "imerc.h"
|
|
#include "imm.h"
|
|
|
|
#ifdef UNICODE
|
|
typedef DWORD UNALIGNED FAR *LPUNADWORD;
|
|
typedef WORD UNALIGNED FAR *LPUNAWORD;
|
|
typedef TCHAR UNALIGNED FAR *LPUNATCHAR;
|
|
#else
|
|
typedef DWORD FAR *LPUNADWORD;
|
|
typedef WORD FAR *LPUNAWORD;
|
|
typedef TCHAR FAR *LPUNATCHAR;
|
|
#define TCHAR BYTE
|
|
#endif
|
|
|
|
HINSTANCE hInst;
|
|
HWND hProgMain = 0; // <=== @E01
|
|
|
|
const static DWORD aLCtoolHelpIDs[] = { // Context Help IDs
|
|
IDD_IME_NAME, IDH_IME_NAME,
|
|
IDD_TABLE_NAME, IDH_TABLE_NAME,
|
|
IDD_ROOT_NUM, IDH_ROOT_NUM,
|
|
IDD_IME_FILE_NAME, IDH_IME_FILE_NAME,
|
|
IDD_CANDBEEP_YES, IDH_CANDBEEP_YES,
|
|
IDD_CANDBEEP_NO, IDH_CANDBEEP_NO,
|
|
IDD_BROWSE, IDH_TABLE_NAME,
|
|
0, 0
|
|
};
|
|
|
|
BOOL ErrorFlag = 0;
|
|
BOOL bFinish = 0;
|
|
UINT nWizStratPage = 0;
|
|
|
|
extern HWND hwndMain;
|
|
extern TCHAR szIme_Name[IME_NAME_LEN_TOOL];
|
|
extern TCHAR szTab_Name[MAX_PATH];
|
|
extern TCHAR szKey_Num_Str[KEY_NUM_STR_LEN];
|
|
extern TCHAR szFile_Out_Name[TAB_NAME_LEN];
|
|
extern TCHAR Show_Mess[MAX_PATH];
|
|
extern TCHAR Msg_buf[MAX_PATH];
|
|
extern BOOL bCandBeep;
|
|
|
|
void ErrMsg(UINT, UINT);
|
|
|
|
BOOL CheckImeFileName(HWND hDlg);
|
|
void ImmSetAlphanumMode(HWND hwnd);
|
|
void ImmSetNativeMode(HWND hwnd);
|
|
|
|
BOOL InitProgressMsg(void); // <=== @E01
|
|
BOOL ProgressMsg(void); // <=== @E01
|
|
|
|
void ResetParams(void)
|
|
{
|
|
lstrcpy(szIme_Name, _TEXT(""));
|
|
lstrcpy(szFile_Out_Name, _TEXT(""));
|
|
lstrcpy(szTab_Name, _TEXT(""));
|
|
lstrcpy(szKey_Num_Str, _TEXT("4"));
|
|
bCandBeep = TRUE;
|
|
|
|
nWizStratPage = 0;
|
|
}
|
|
|
|
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
|
|
{
|
|
DWORD retCode;
|
|
// DWORD dwID;
|
|
|
|
UNREFERENCED_PARAMETER( nCmdShow );
|
|
UNREFERENCED_PARAMETER( lpCmdLine );
|
|
UNREFERENCED_PARAMETER( hPrevInstance );
|
|
|
|
hInst = hInstance;
|
|
|
|
InitCommonControls();
|
|
|
|
//retCode = DialogBox ((HANDLE)hInst, (LPCTSTR)_TEXT("UimeToolDialog"),
|
|
// NULL, (DLGPROC)SetDialogProc);
|
|
ResetParams();
|
|
|
|
RE_START:
|
|
bFinish = 0;
|
|
retCode = CreateWizard(NULL, hInstance);
|
|
|
|
if(bFinish)
|
|
{
|
|
//SetCursor(LoadCursor(NULL, IDC_WAIT));
|
|
//MakeNewIme(hDlg);
|
|
// <=== @E01
|
|
if (InitProgressMsg()) {
|
|
//_beginthreadex(NULL, 0, MakeNewImeThread, NULL, 0, &dwID);
|
|
_beginthread((PVOID)MakeNewImeThread, 0, NULL);
|
|
// AttachThreadInput(dwID, GetCurrentThreadId(), TRUE);
|
|
ProgressMsg();
|
|
|
|
if (!bFinish) {
|
|
nWizStratPage = 2;
|
|
goto RE_START;
|
|
}
|
|
}
|
|
// <=== @E01
|
|
//SetCursor(LoadCursor(NULL, IDC_ARROW));
|
|
}
|
|
|
|
return (retCode);
|
|
|
|
}
|
|
|
|
INT_PTR APIENTRY ImeName(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
switch (message)
|
|
{
|
|
case WM_INITDIALOG:
|
|
hwndMain = hDlg;
|
|
SendDlgItemMessage(hDlg, IDD_IME_NAME, EM_SETLIMITTEXT, IME_NAME_LEN_TOOL-1, 0);
|
|
SendDlgItemMessage(hDlg, IDD_IME_FILE_NAME, EM_SETLIMITTEXT, TAB_NAME_LEN-1, 0);
|
|
|
|
//lstrcpy(szIme_Name, _TEXT(""));
|
|
//lstrcpy(szFile_Out_Name, _TEXT(""));
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
if(LOWORD(wParam) == IDD_IME_NAME)
|
|
{
|
|
if(HIWORD(wParam) == EN_SETFOCUS)
|
|
ImmSetNativeMode((HWND)lParam);
|
|
else if(HIWORD(wParam) == EN_KILLFOCUS)
|
|
ImmSetAlphanumMode((HWND)lParam);
|
|
}
|
|
else if(LOWORD(wParam) == IDD_IME_FILE_NAME)
|
|
{
|
|
if(HIWORD(wParam) == EN_SETFOCUS)
|
|
ImmSetAlphanumMode((HWND)lParam);
|
|
else if(HIWORD(wParam) == EN_KILLFOCUS)
|
|
{
|
|
ImmSetNativeMode((HWND)lParam);
|
|
ErrorFlag = !CheckImeFileName(hDlg);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case WM_NOTIFY:
|
|
switch (((NMHDR FAR *) lParam)->code)
|
|
{
|
|
case PSN_KILLACTIVE:
|
|
SetWindowLong(hDlg, DWLP_MSGRESULT, ErrorFlag ? TRUE : FALSE);
|
|
return 1;
|
|
break;
|
|
|
|
case PSN_RESET:
|
|
// reset to the original values
|
|
lstrcpy(szIme_Name, _TEXT(""));
|
|
lstrcpy(szFile_Out_Name, _TEXT(""));
|
|
SetWindowLong(hDlg, DWLP_MSGRESULT, FALSE);
|
|
break;
|
|
|
|
case PSN_SETACTIVE:
|
|
hwndMain = hDlg;
|
|
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_NEXT);
|
|
SendMessage(GetDlgItem(hDlg,0x3024 ), BM_SETSTYLE, (WPARAM)BS_PUSHBUTTON, MAKELONG(FALSE, 0));
|
|
//SendMessage(GetParent(hDlg), DM_SETDEFID, (WPARAM)IDC_BUTTON1, 0);
|
|
SendMessage(GetDlgItem(hDlg, IDD_IME_NAME), WM_SETTEXT, 0, (LPARAM)szIme_Name);
|
|
SendMessage(GetDlgItem(hDlg, IDD_IME_FILE_NAME), WM_SETTEXT, 0, (LPARAM)szFile_Out_Name);
|
|
break;
|
|
|
|
case PSN_WIZNEXT:
|
|
// the Next button was pressed
|
|
// check ime name
|
|
SendDlgItemMessage(hDlg, IDD_IME_NAME, WM_GETTEXT, (WPARAM)IME_NAME_LEN_TOOL, (LPARAM)szIme_Name);
|
|
if(szIme_Name[0] == 0 || !is_DBCS(*((LPUNAWORD)szIme_Name)))
|
|
{
|
|
MessageBeep(0);
|
|
ErrMsg(IDS_ERR_IMENAME, IDS_ERR_ERROR);
|
|
SetFocus(GetDlgItem(hDlg, IDD_IME_NAME));
|
|
ErrorFlag = 1;
|
|
break;
|
|
}
|
|
|
|
// check file name
|
|
ErrorFlag = !CheckImeFileName(hDlg);
|
|
break;
|
|
|
|
default:
|
|
return FALSE;
|
|
|
|
}
|
|
break;
|
|
|
|
case WM_HELP:
|
|
HtmlHelp(((LPHELPINFO) lParam)->hItemHandle, HELP_FILE,
|
|
HH_TP_HELP_WM_HELP, (DWORD_PTR)(LPTSTR) aLCtoolHelpIDs);
|
|
break;
|
|
|
|
case WM_CONTEXTMENU: // right mouse click
|
|
HtmlHelp((HWND) wParam, HELP_FILE, HH_TP_HELP_CONTEXTMENU,
|
|
(DWORD_PTR)(LPVOID) aLCtoolHelpIDs);
|
|
break;
|
|
|
|
default:
|
|
return FALSE;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
INT_PTR APIENTRY ImeTable(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
switch (message)
|
|
{
|
|
case WM_INITDIALOG:
|
|
hwndMain = hDlg;
|
|
//lstrcpy(szTab_Name, _TEXT(""));
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
switch(LOWORD(wParam))
|
|
{
|
|
case IDD_BROWSE:
|
|
GetOpenFile(hDlg);
|
|
break;
|
|
|
|
case IDD_TABLE_NAME:
|
|
if(HIWORD(wParam) == EN_SETFOCUS)
|
|
ImmSetAlphanumMode((HWND)lParam);
|
|
else if(HIWORD(wParam) == EN_KILLFOCUS)
|
|
ImmSetNativeMode((HWND)lParam);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case WM_NOTIFY:
|
|
switch (((NMHDR FAR *) lParam)->code)
|
|
{
|
|
case PSN_KILLACTIVE:
|
|
SetWindowLong(hDlg, DWLP_MSGRESULT, ErrorFlag ? TRUE : FALSE);
|
|
return 1;
|
|
break;
|
|
|
|
case PSN_RESET:
|
|
// rest to the original values
|
|
lstrcpy(szTab_Name, _TEXT(""));
|
|
SetWindowLong(hDlg, DWLP_MSGRESULT, FALSE);
|
|
break;
|
|
|
|
case PSN_SETACTIVE:
|
|
hwndMain = hDlg;
|
|
SendMessage(GetDlgItem(hDlg, IDD_TABLE_NAME), WM_SETTEXT, 0, (LPARAM)szTab_Name);
|
|
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK | PSWIZB_NEXT);
|
|
break;
|
|
|
|
case PSN_WIZBACK:
|
|
SendDlgItemMessage(hDlg, IDD_TABLE_NAME, WM_GETTEXT, (WPARAM)MAX_PATH, (LPARAM)szTab_Name);
|
|
ErrorFlag = 0;
|
|
break;
|
|
|
|
case PSN_WIZNEXT:
|
|
SendDlgItemMessage(hDlg, IDD_TABLE_NAME, WM_GETTEXT, (WPARAM)MAX_PATH, (LPARAM)szTab_Name);
|
|
if(szTab_Name[0] == 0)
|
|
{
|
|
MessageBeep(0);
|
|
SetFocus(GetDlgItem(hDlg, IDD_TABLE_NAME));
|
|
ErrorFlag = 1;
|
|
return FALSE;
|
|
}
|
|
ErrorFlag = 0;
|
|
break;
|
|
|
|
default:
|
|
return FALSE;
|
|
|
|
}
|
|
break;
|
|
|
|
case WM_HELP:
|
|
HtmlHelp(((LPHELPINFO) lParam)->hItemHandle, HELP_FILE,
|
|
HH_TP_HELP_WM_HELP, (DWORD_PTR)(LPTSTR) aLCtoolHelpIDs);
|
|
break;
|
|
|
|
case WM_CONTEXTMENU: // right mouse click
|
|
HtmlHelp((HWND) wParam, HELP_FILE, HH_TP_HELP_CONTEXTMENU,
|
|
(DWORD_PTR)(LPVOID) aLCtoolHelpIDs);
|
|
break;
|
|
|
|
default:
|
|
return FALSE;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
INT_PTR APIENTRY ImeParam(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
switch (message)
|
|
{
|
|
case WM_INITDIALOG:
|
|
hwndMain = hDlg;
|
|
//lstrcpy(szKey_Num_Str, _TEXT("4"));
|
|
//bCandBeep = TRUE;
|
|
SendDlgItemMessage(hDlg, IDD_ROOT_NUM, EM_SETLIMITTEXT, KEY_NUM_STR_LEN-1, 0);
|
|
SendDlgItemMessage(hDlg, IDD_SPIN, UDM_SETBUDDY, (WPARAM)GetDlgItem(hDlg, IDD_ROOT_NUM), 0);
|
|
SendDlgItemMessage(hDlg, IDD_SPIN, UDM_SETBASE, 10, 0);
|
|
SendDlgItemMessage(hDlg, IDD_SPIN, UDM_SETRANGE, 0, (LPARAM)(MAKELONG(8, 1)));
|
|
SendDlgItemMessage(hDlg, IDD_SPIN, UDM_SETPOS, 0, (LPARAM)(MAKELONG(4, 0)));
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
if(LOWORD(wParam) == IDD_ROOT_NUM)
|
|
{
|
|
switch(HIWORD(wParam))
|
|
{
|
|
case EN_SETFOCUS:
|
|
ImmSetAlphanumMode((HWND)lParam);
|
|
break;
|
|
|
|
case EN_KILLFOCUS:
|
|
ImmSetNativeMode((HWND)lParam);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case WM_NOTIFY:
|
|
switch (((NMHDR FAR *) lParam)->code)
|
|
{
|
|
case PSN_KILLACTIVE:
|
|
SetWindowLong(hDlg, DWLP_MSGRESULT, ErrorFlag ? TRUE : FALSE);
|
|
return 1;
|
|
break;
|
|
|
|
case PSN_RESET:
|
|
// rest to the original values
|
|
lstrcpy(szKey_Num_Str, _TEXT("4"));
|
|
bCandBeep = TRUE;
|
|
SetWindowLong(hDlg, DWLP_MSGRESULT, FALSE);
|
|
break;
|
|
|
|
case PSN_SETACTIVE:
|
|
hwndMain = hDlg;
|
|
SendMessage(GetDlgItem(hDlg, IDD_ROOT_NUM), WM_SETTEXT, 0, (LPARAM)szKey_Num_Str);
|
|
if(bCandBeep)
|
|
SendMessage(GetDlgItem(hDlg, IDD_CANDBEEP_YES), BM_SETCHECK, 1, 0L);
|
|
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK | PSWIZB_FINISH);
|
|
break;
|
|
|
|
case PSN_WIZBACK:
|
|
ErrorFlag = 0;
|
|
SendDlgItemMessage(hDlg, IDD_ROOT_NUM, WM_GETTEXT, (WPARAM)KEY_NUM_STR_LEN, (LPARAM)szKey_Num_Str);
|
|
if(SendDlgItemMessage(hDlg, IDD_CANDBEEP_YES, BM_GETCHECK, 0, 0 ) == BST_CHECKED )
|
|
bCandBeep=TRUE;
|
|
else
|
|
bCandBeep=FALSE;
|
|
break;
|
|
|
|
|
|
case PSN_WIZFINISH:
|
|
// check param
|
|
if(SendDlgItemMessage(hDlg, IDD_CANDBEEP_YES, BM_GETCHECK, 0, 0 ) == BST_CHECKED )
|
|
bCandBeep=TRUE;
|
|
else
|
|
bCandBeep=FALSE;
|
|
|
|
SendDlgItemMessage(hDlg, IDD_ROOT_NUM, WM_GETTEXT, (WPARAM)KEY_NUM_STR_LEN, (LPARAM)szKey_Num_Str);
|
|
if(szKey_Num_Str[0] < _TEXT('1'))
|
|
szKey_Num_Str[0] = _TEXT('1');
|
|
else if(szKey_Num_Str[0] > _TEXT('8'))
|
|
szKey_Num_Str[0] = _TEXT('8');
|
|
szKey_Num_Str[1] = 0;
|
|
|
|
// finish
|
|
ErrorFlag = 0;
|
|
bFinish = 1;
|
|
break;
|
|
|
|
default:
|
|
return FALSE;
|
|
}
|
|
break;
|
|
|
|
case WM_HELP:
|
|
HtmlHelp(((LPHELPINFO) lParam)->hItemHandle, HELP_FILE,
|
|
HH_TP_HELP_WM_HELP, (DWORD_PTR)(LPTSTR) aLCtoolHelpIDs);
|
|
break;
|
|
|
|
case WM_CONTEXTMENU: // right mouse click
|
|
HtmlHelp((HWND) wParam, HELP_FILE, HH_TP_HELP_CONTEXTMENU,
|
|
(DWORD_PTR)(LPVOID) aLCtoolHelpIDs);
|
|
break;
|
|
|
|
default:
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void FillInPropertyPage( PROPSHEETPAGE* psp, int idDlg, LPTSTR pszProc, DLGPROC pfnDlgProc)
|
|
{
|
|
psp->dwSize = sizeof(PROPSHEETPAGE);
|
|
psp->dwFlags = PSP_USEHICON;
|
|
psp->hInstance = hInst;
|
|
psp->pszTemplate = MAKEINTRESOURCE(idDlg);
|
|
psp->hIcon = LoadIcon(hInst, _TEXT("UIMETOOL"));
|
|
psp->pfnDlgProc = pfnDlgProc;
|
|
psp->pszTitle = pszProc;
|
|
psp->lParam = 0;
|
|
}
|
|
|
|
int CreateWizard(HWND hwndOwner, HINSTANCE hInst)
|
|
{
|
|
PROPSHEETPAGE psp[NUM_PAGES];
|
|
PROPSHEETHEADER psh;
|
|
|
|
FillInPropertyPage( &psp[0], IDD_IMENAME, _TEXT("通用輸入法名稱"), ImeName);
|
|
FillInPropertyPage( &psp[1], IDD_IMETABLE, _TEXT("主要對照表"), ImeTable);
|
|
FillInPropertyPage( &psp[2], IDD_IMEPARAM, _TEXT("輸入法參數"), ImeParam);
|
|
|
|
psh.dwSize = sizeof(PROPSHEETHEADER);
|
|
psh.dwFlags = PSH_PROPSHEETPAGE | PSH_WIZARD | PSH_NOAPPLYNOW | PSH_USEHICON;
|
|
psh.hwndParent = hwndOwner;
|
|
psh.hInstance = hInst;
|
|
psh.hIcon = LoadIcon(hInst, _TEXT("UIMETOOL"));
|
|
psh.pszCaption = _TEXT("通用輸入法建立精靈");
|
|
psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE);
|
|
psh.nStartPage = nWizStratPage;
|
|
psh.ppsp = (LPCPROPSHEETPAGE) psp;
|
|
|
|
return (int)(PropertySheet(&psh));
|
|
}
|
|
|
|
BOOL CheckImeFileName(HWND hDlg)
|
|
{
|
|
int i, len;
|
|
TCHAR szTitle[MAX_PATH];
|
|
|
|
SendDlgItemMessage(hDlg, IDD_IME_FILE_NAME, WM_GETTEXT, (WPARAM)MAX_PATH, (LPARAM)szFile_Out_Name);
|
|
if(szFile_Out_Name[0] == 0)
|
|
goto ERROR1;
|
|
|
|
// Check drive name, path name, extention name exist ?
|
|
len = lstrlen(szFile_Out_Name);
|
|
|
|
for(i = 0; i < len; i++)
|
|
{
|
|
if(szFile_Out_Name[i] == _TEXT('.'))
|
|
break;
|
|
}
|
|
|
|
if(i != len)
|
|
szFile_Out_Name[i] = 0;
|
|
|
|
if(GetFileTitle(szFile_Out_Name, szTitle, ARRAYSIZE(szTitle)))
|
|
{
|
|
SetFocus(GetDlgItem(hDlg, IDD_IME_FILE_NAME));
|
|
ERROR1:
|
|
MessageBeep(0);
|
|
return FALSE;
|
|
}
|
|
|
|
lstrcpy(szFile_Out_Name, szTitle);
|
|
SendMessage(GetDlgItem(hDlg, IDD_IME_FILE_NAME), WM_SETTEXT, 0, (LPARAM)szFile_Out_Name);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void ImmSetAlphanumMode(HWND hwnd)
|
|
{
|
|
DWORD fdwConversion, fdwSentence;
|
|
HIMC hIMC = ImmGetContext(hwnd);
|
|
ImmGetConversionStatus(hIMC, &fdwConversion, &fdwSentence);
|
|
ImmSetConversionStatus(hIMC, fdwConversion & ~IME_CMODE_NATIVE,
|
|
fdwSentence);
|
|
}
|
|
|
|
void ImmSetNativeMode(HWND hwnd)
|
|
{
|
|
DWORD fdwConversion, fdwSentence;
|
|
HIMC hIMC = ImmGetContext(hwnd);
|
|
ImmGetConversionStatus(hIMC, &fdwConversion, &fdwSentence);
|
|
ImmSetConversionStatus(hIMC, fdwConversion | IME_CMODE_NATIVE,
|
|
fdwSentence);
|
|
}
|
|
|
|
// <=== @E01
|
|
HWND hWndProgress;
|
|
UINT uMin, uMax;
|
|
LRESULT APIENTRY ProgressWndProc(HWND hWnd, UINT message,
|
|
UINT wParam,
|
|
LONG lParam);
|
|
|
|
BOOL InitProgressMsg(void)
|
|
{
|
|
WNDCLASS wcProgress;
|
|
int x, y, width, height;
|
|
TCHAR szTitle[MAX_PATH];
|
|
|
|
wcProgress.style = 0;
|
|
wcProgress.lpfnWndProc = (WNDPROC)ProgressWndProc;
|
|
wcProgress.cbClsExtra = 0;
|
|
wcProgress.cbWndExtra = 0;
|
|
wcProgress.hInstance = hInst;
|
|
wcProgress.hIcon = LoadIcon(hInst, MAKEINTRESOURCE(256));
|
|
wcProgress.hCursor = LoadCursor(NULL, IDC_ARROW);
|
|
wcProgress.hbrBackground = GetStockObject(LTGRAY_BRUSH);
|
|
wcProgress.lpszMenuName = NULL;
|
|
wcProgress.lpszClassName = _TEXT("ProgressWClass");
|
|
|
|
//if (!RegisterClass(&wcProgress))
|
|
// return FALSE;
|
|
RegisterClass(&wcProgress);
|
|
|
|
width = 300;
|
|
height = 100;
|
|
x = (GetSystemMetrics(SM_CXSCREEN) - width) / 2;
|
|
y = (GetSystemMetrics(SM_CYSCREEN) - height) / 2;
|
|
|
|
LoadString (hInst, IDS_BUILDTITLE, szTitle, sizeof(szTitle) / sizeof(TCHAR));
|
|
|
|
hProgMain = CreateWindowEx(
|
|
0,
|
|
_TEXT("ProgressWClass"),
|
|
szTitle, //_TEXT("通用輸入法建立中..."),
|
|
WS_BORDER | WS_CAPTION,
|
|
x, y, width, height,
|
|
NULL,
|
|
NULL,
|
|
hInst,
|
|
NULL);
|
|
|
|
|
|
if (!hProgMain)
|
|
return (FALSE);
|
|
|
|
ShowWindow(hProgMain, SW_SHOW);
|
|
UpdateWindow(hProgMain);
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL ProgressMsg(void)
|
|
{
|
|
MSG msg;
|
|
while (GetMessage(&msg,
|
|
NULL,
|
|
0,
|
|
0))
|
|
{
|
|
TranslateMessage(&msg);
|
|
DispatchMessage(&msg);
|
|
}
|
|
return (BOOL)(msg.wParam);
|
|
}
|
|
|
|
LRESULT APIENTRY ProgressWndProc(
|
|
HWND hWnd, /* window handle */
|
|
UINT message, /* type of message */
|
|
UINT wParam, /* additional information */
|
|
LONG lParam) /* additional information */
|
|
{
|
|
HDC hdc;
|
|
PAINTSTRUCT ps;
|
|
static UINT uCurrent;
|
|
|
|
switch (message)
|
|
{
|
|
|
|
case WM_CREATE:
|
|
hWndProgress = CreateWindowEx(
|
|
0,
|
|
PROGRESS_CLASS,
|
|
_TEXT("Position"),
|
|
WS_CHILD | WS_VISIBLE, // | PBS_SHOWPOS,
|
|
50,18,205,20,
|
|
hWnd,
|
|
NULL,
|
|
hInst,
|
|
NULL);
|
|
|
|
if (hWndProgress == NULL)
|
|
{
|
|
MessageBox (NULL, _TEXT("Progress Bar not created!"), NULL, MB_OK );
|
|
break;
|
|
}
|
|
|
|
|
|
uMin=0;
|
|
uMax=20;
|
|
uCurrent = uMin;
|
|
SendMessage(hWndProgress, PBM_SETRANGE, 0L, MAKELONG(uMin, uMax));
|
|
SendMessage(hWndProgress, PBM_SETSTEP, 1L, 0L);
|
|
|
|
SetTimer(hWnd, 1000, 500, NULL);
|
|
|
|
break;
|
|
|
|
case WM_PAINT:
|
|
{
|
|
hdc = BeginPaint(hWnd, &ps);
|
|
EndPaint(hWnd, &ps);
|
|
}
|
|
break;
|
|
|
|
case WM_TIMER:
|
|
if (uCurrent < uMax)
|
|
{
|
|
SendMessage(hWndProgress, PBM_STEPIT,0L,0L);
|
|
uCurrent++;
|
|
}
|
|
else
|
|
{
|
|
uCurrent = uMin;
|
|
}
|
|
break;
|
|
|
|
case WM_DESTROY: /* message: window being destroyed */
|
|
KillTimer(hWnd, 1000);
|
|
|
|
PostQuitMessage(0);
|
|
break;
|
|
|
|
default:
|
|
return (DefWindowProc(hWnd, message, wParam, lParam));
|
|
}
|
|
return (0);
|
|
}
|