windows-nt/Source/XPSP1/NT/windows/feime/cht/lctool/lctool.c

1256 lines
34 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*************************************************
* lctool.c *
* *
* Copyright (C) 1995-1999 Microsoft Inc. *
* *
*************************************************/
// Change's Note
//
#include <windows.h> // required for all Windows applications
#include <windowsx.h>
#include <commctrl.h>
#include <htmlhelp.h>
#include "rc.h"
#include "lctool.h"
#include "movelst.h"
#define LC_CLASS _TEXT("LcToolWClass")
#define LC_SUBCLASS _TEXT("LcToolSubWClass")
#define HELPNAME _TEXT("LCTOOL.CHM")
#define X_ITEM_1 40
#define X_ITEM_2 120
#define Y_ITEM_1 10
#define Y_ITEM_2 30
#define Y_ITEM_3 20
#define ALLOCBLOCK 3000
#define STATE_ON 0x8000
#define TOTALSCALE 500
#define LINESHIFT 2
#define PAGESHIFT 10
#ifndef UNICODE
#define lWordBuff iWordBuff
#define lPhraseBuff iPhraseBuff
#define lNext_Seg iNext_Seg
#endif
typedef struct{
WORD wKey;
USHORT uState;
WPARAM wID;
} FUNCKEYBUF, FAR *LPFUNCKEYBUF;
FUNCKEYBUF lpFuncKey[]={
#if defined(DEBUG)
{ 'N', CTRL_STATE, IDM_NEW }, // for debug
#endif
//{ 'Z', CTRL_STATE, IDM_UNDO },
//{ 'X', CTRL_STATE, IDM_CUT },
//{ 'C', CTRL_STATE, IDM_COPY },
//{ 'V', CTRL_STATE, IDM_PASTE },
{ VK_DELETE, 0, IDM_CLEAR },
{ 'D', CTRL_STATE, IDM_DELETEL },
{ VK_RETURN, 0, IDM_INSERTL },
{ VK_F3, 0, IDM_SNEXT }
};
UINT nFuncKey=sizeof(lpFuncKey)/sizeof(FUNCKEYBUF);
HFONT hFont;
char szAppName[9];
UINT CharWidth;
UINT CharHeight;
UINT line_height;
int nWidth;
int nHeight;
int cxHD0 = 50, cxHD1 = 30, cxHD2 = 200, cyHD;
int cyCaption, cyMenu;
HWND subhWnd;
TCHAR szPhrasestr[MAX_CHAR_NUM];
// Local function prototypes.
BOOL InitApplication(HINSTANCE);
BOOL InitInstance(HINSTANCE, int);
void lcPaint(HWND);
BOOL lcInit(HWND);
void lcResize(HWND hwnd);
BOOL lcTranslateMsg(MSG *);
void lcMoveEditWindow(HWND hwnd, int nOffset);
void lcOrgEditWindow();
void draw_horz_header(HWND hwnd);
void draw_vert_header(HWND hwnd);
void draw_box0(HDC hdc, int, int, int, int);
void draw_box1(HDC hdc, int, int, int, int);
// FUNCTION: WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
//
// PURPOSE: calls initialization function, processes message loop
//
//
int APIENTRY WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
// Other instances of app running?
if (hPrevInstance)
{
return FALSE; // Exits if there is another instance
} else {
// Initialize shared things
if (!InitApplication(hInstance))
return FALSE; // Exits if unable to initialize
}
// Perform initializations that apply to a specific instance
if (!InitInstance(hInstance, nCmdShow))
return FALSE;
// Acquire and dispatch messages until a WM_QUIT message is received.
while (GetMessage(&msg, NULL, 0, 0))
{
if(!lcTranslateMsg(&msg)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
// Returns the value from PostQuitMessage
return (INT)(msg.wParam);
}
BOOL InitApplication(
HINSTANCE hInstance)
{
WNDCLASSEX wc;
hCursorArrow = LoadCursor(NULL,IDC_ARROW);
hCursorWait = LoadCursor(NULL, IDC_WAIT);
// Fill in window class structure with parameters that describe the
// main window.
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_DBLCLKS; //|CS_HREDRAW | CS_VREDRAW; // Class style(s).
wc.lpfnWndProc = (WNDPROC)WndProc; // Window Procedure
wc.cbClsExtra = 0; // No per-class extra data.
wc.cbWndExtra = 0; // No per-window extra data.
wc.hInstance = hInstance; // Owner of this class
wc.hIcon = LoadImage(hInstance,_TEXT("ALogIcon"),
IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR);
#ifdef UNICODE
wc.hIconSm = NULL;
#else
wc.hIconSm = LoadImage(hInstance,_TEXT("ALogIcon"),
IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
#endif
wc.hCursor = LoadCursor(NULL, IDC_ARROW); // Cursor
wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1); // Light Gray color
wc.lpszMenuName = _TEXT("LcToolMenu");
wc.lpszClassName =LC_CLASS;
// Register the window class and return FALSE if unsuccesful.
if (!RegisterClassEx(&wc))
{
return FALSE;
}
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_DBLCLKS; //|CS_HREDRAW | CS_VREDRAW; // Class style(s).
wc.lpfnWndProc = (WNDPROC)WndSubProc; // Window Procedure
wc.cbClsExtra = 0; // No per-class extra data.
wc.cbWndExtra = 0; // No per-window extra data.
wc.hInstance = hInstance; // Owner of this class
wc.hIcon = 0;
wc.hIconSm = 0;
wc.hCursor = LoadCursor(NULL, IDC_ARROW); // Cursor
wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1); // Light Gray color
wc.lpszMenuName = NULL,
wc.lpszClassName = LC_SUBCLASS;
if (!RegisterClassEx(&wc))
{
return FALSE;
}
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = 0;
wc.lpfnWndProc = (WNDPROC)ClassDlgProc;
wc.cbClsExtra = 0; // No per-class extra data.
wc.cbWndExtra = DLGWINDOWEXTRA;
wc.hInstance = hInstance;
wc.hIcon = 0;
wc.hIconSm = 0;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
wc.lpszMenuName = NULL;
wc.lpszClassName = _TEXT("PrivDlgClass");
if (!RegisterClassEx(&wc))
{
return FALSE;
}
return TRUE;
}
BOOL InitInstance(
HINSTANCE hInstance,
int nCmdShow)
{
HWND hwnd; // Main window handle.
HDC hDC;
TEXTMETRIC tm;
RECT rect;
TCHAR szTitle[MAX_PATH];
TCHAR szFont[MAX_PATH];
HFONT hSysFont;
LOGFONT lfEditFont;
UINT scrollCy, scrollCx;
DWORD style;
LoadString(hInstance, IDS_MAIN_TITLE,szTitle, sizeof(szTitle)/sizeof(TCHAR));
hInst = hInstance; // Store instance handle in our global variable
/* create fixed pitch font as default font */
hSysFont=GetStockObject(SYSTEM_FIXED_FONT);
GetObject(hSysFont, sizeof(LOGFONT), &lfEditFont);
lfEditFont.lfWeight = 400;
lfEditFont.lfHeight = 12;
lfEditFont.lfWidth = lfEditFont.lfHeight/2;
lfEditFont.lfPitchAndFamily = FIXED_PITCH | FF_MODERN;
LoadString(hInstance, IDS_FONT_NAME,szFont, sizeof(szFont)/sizeof(TCHAR));
lstrcpy(lfEditFont.lfFaceName, szFont);
/* create the logical font */
hFont = CreateFontIndirect(&lfEditFont);
hDC = GetDC(NULL);
SelectObject(hDC, hFont);
GetTextMetrics(hDC, &tm);
ReleaseDC(NULL, hDC);
rect.top = tm.tmHeight ;
rect.left = rect.top;
CharWidth=tm.tmAveCharWidth;
CharHeight=tm.tmHeight + 10;
line_height=CharHeight - 1;
iPage_line=rect.top*22/line_height;
if(iPage_line > MAX_LINE)
iPage_line=MAX_LINE;
nWidth=rect.top*33;
cyCaption = GetSystemMetrics(SM_CYCAPTION);
cyMenu = GetSystemMetrics(SM_CYMENU);
nHeight = line_height * iPage_line + CharHeight + cyCaption + cyMenu + 12; //3;
cxHD1 = MulDiv(CharWidth * 2, 96, 72) * 2; // <== @E02
//cxHD2 = nWidth - cxHD0 - cxHD1 + 1;
cxHD2 = MulDiv(CharWidth * 2, 96, 72) * MAX_CHAR_NUM;
scrollCy = GetSystemMetrics(SM_CYHSCROLL);
#ifndef UNICODE
scrollCy += 2;
#endif
scrollCx = GetSystemMetrics(SM_CXVSCROLL);
// Create a main window for this application instance.
style = (WS_CAPTION | WS_SYSMENU | WS_THICKFRAME |
WS_MINIMIZEBOX | WS_MAXIMIZEBOX); // & (~WS_VSCROLL),
hwnd = CreateWindowEx(
WS_EX_CLIENTEDGE,
LC_CLASS,
szTitle,
style,
rect.left,
rect.top,
nWidth,
nHeight + scrollCy,
HWND_DESKTOP,
NULL,
hInstance,
NULL
);
// If window could not be created, return "failure"
if (!hwnd)
return FALSE;
//InitCommonControls();
hwndMain=hwnd;
hMenu=GetMenu(hwnd);
// Make the window visible; update its client area; and return "success"
ShowWindow(hwnd, nCmdShow); // Show the window
// UpdateWindow(hwnd); // Sends WM_PAINT message
// Reset the search phrase
szPhrasestr[0] = 0;
return TRUE;
}
LRESULT CALLBACK WndProc(
HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
HWND hwndEdit;
DWORD dw; /* return value from various messages */
UINT EnableOrNot; /* is something currently selected? */
TCHAR szTitle[MAX_PATH];
TCHAR szMsg1[MAX_PATH];
BOOL bResult;
switch (message) {
case WM_COMMAND:
if(HIWORD(wParam) == EN_SETFOCUS) {
lcEditFocusOn(LOWORD(wParam));
break;
}
switch (wParam) {
case IDM_SAVE:
SetCursor(hCursorWait);
#ifdef UNICODE
bResult = lcFSave(hwnd, FALSE);
#else
bResult = lcFSave(hwnd);
#endif
SetCursor(hCursorArrow);
InvalidateRect(hwnd, NULL, TRUE);
draw_vert_header(hwnd);
if (bResult) {
LoadString(hInst, IDS_APPNAME, szMsg1, sizeof(szMsg1));
#ifdef UNICODE
LoadString(hInst, IDS_ACTIVATED, szTitle, sizeof(szTitle));
#else
LoadString(hInst, IDS_WILLBEACTIVATED, szTitle, sizeof(szTitle));
#endif
MessageBox(hwndMain, szTitle, szMsg1, MB_OK | MB_ICONEXCLAMATION);
}
break;
#ifdef UNICODE
case IDM_SAVEAS:
SetCursor(hCursorWait);
bResult = lcFSave(hwnd, TRUE);
SetCursor(hCursorArrow);
InvalidateRect(hwnd, NULL, TRUE);
draw_vert_header(hwnd);
if (bResult) {
LoadString(hInst, IDS_APPNAME, szMsg1, sizeof(szMsg1));
LoadString(hInst, IDS_WILLBEACTIVATED, szTitle, sizeof(szTitle));
MessageBox(hwndMain, szTitle, szMsg1, MB_OK | MB_ICONEXCLAMATION);
}
break;
#endif
case IDM_APPEND: //@D01A
SetCursor(hCursorWait); //@D01A
lcAppend(hwnd); //@D03C
SetCursor(hCursorArrow); //@D01A
break; //@D01A
case IDM_IMPORT:
// Clear all flag first
SetCursor(hCursorWait);
lcImport(hwnd);
SetCursor(hCursorArrow);
InvalidateRect(hwnd, NULL, TRUE);
break;
#ifdef UNICODE
case IDM_EXPORT2BIG5:
SetCursor(hCursorWait);
lcExport(hwnd,FILE_BIG5);
SetCursor(hCursorArrow);
break;
#endif
case IDM_EXPORT:
SetCursor(hCursorWait);
#ifdef UNICODE
lcExport(hwnd,FILE_UNICODE);
#else
lcExport(hwnd);
#endif
SetCursor(hCursorArrow);
break;
case IDM_PRINT:
{
int nRes;
nRes=lcPrint(hwnd);
SetCursor(hCursorArrow);
if(nRes != TRUE)
lcErrMsg(nRes);
}
break;
case IDM_EXIT :
if(!lcQuerySave(hwnd))
break;
DestroyWindow(hwnd);
return (TRUE);
case IDM_UNDO:
PostMessage( GetFocus(), WM_UNDO, 0, 0);
break;
case IDM_CUT:
PostMessage( GetFocus(), WM_CUT, 0, 0);
break;
case IDM_COPY:
PostMessage( GetFocus(), WM_COPY, 0, 0);
break;
case IDM_PASTE:
PostMessage( GetFocus(), WM_PASTE, 0, 0);
break;
case IDM_CLEAR:
PostMessage( GetFocus(), WM_CLEAR, 0, 0);
break;
case IDM_DELETEL:
lcDelLine(hwnd);
lcOrgEditWindow();
break;
case IDM_INSERTL:
lcInsLine(hwnd);
lcOrgEditWindow();
break;
case IDM_SORT:
SetCursor(hCursorWait);
lcSort(hwnd);
SetCursor(hCursorArrow);
lcOrgEditWindow();
InvalidateRect(hwnd, NULL, TRUE);
draw_vert_header(hwnd);
break;
case IDM_GOTO:
lcGoto(hwnd);
lcOrgEditWindow();
SetScrollPos(subhWnd, SB_VERT, yPos, TRUE);
return ((LONG)TRUE);
case IDM_SEARCH:
lcSearch(hwnd, FALSE);
SetScrollPos(subhWnd, SB_VERT, yPos, TRUE);
draw_vert_header(hwndMain);
return ((LONG)TRUE);
case IDM_SNEXT:
lcSearch(hwnd, TRUE);
SetScrollPos(subhWnd, SB_VERT, yPos, TRUE);
draw_vert_header(hwndMain);
return ((LONG)TRUE);
case IDM_CHGSEQ:
lcChangeSequence(hwnd);
InvalidateRect(hwnd, NULL, TRUE);
return ((LONG)TRUE);
case IDM_ABOUT :
LoadString(hInst, IDS_MAIN_TITLE, szTitle, sizeof(szTitle));
ShellAbout(hwnd, szTitle,_TEXT(""), LoadIcon(hInst,_TEXT("ALogIcon")));
return ((LONG)TRUE);
case IDM_HELP :
// if(!WinHelp(hwnd, HELPNAME, HELP_FINDER, 0L))
if ( !HtmlHelp(hwnd, HELPNAME, HH_DISPLAY_TOPIC, 0L) )
lcErrMsg(IDS_ERR_MEMORY);
return ((LONG)TRUE);
case IDM_VSCROLL :
SetScrollPos(subhWnd, SB_VERT, yPos, TRUE);
return ((LONG)TRUE);
}
break;
case WM_INITMENUPOPUP: /* wParam is menu handle */
// Check save file
lcQueryModify(hwnd);
/* Enable the 'Save' option if any modified */
EnableMenuItem((HMENU)wParam, IDM_SAVE,
(UINT)(bSaveFile ? MF_ENABLED : MF_GRAYED));
EnableMenuItem((HMENU)wParam, IDM_SAVEAS,
(UINT)(bSaveFile ? MF_ENABLED : MF_GRAYED));
/* Find out if something is currently selected in the edit box */
hwndEdit=GetFocus();
dw = (DWORD)SendMessage(hwndEdit,EM_GETSEL,0,0L);
EnableOrNot = (UINT)((HIWORD(dw) != LOWORD(dw) ? MF_ENABLED : MF_GRAYED));
/* Enable / disable the Edit menu options appropriately */
EnableMenuItem ((HMENU)wParam, IDM_UNDO ,
(UINT)(SendMessage(hwndEdit,EM_CANUNDO,0,0L) ? MF_ENABLED : MF_GRAYED));
EnableMenuItem ((HMENU)wParam, IDM_CUT , EnableOrNot);
EnableMenuItem ((HMENU)wParam, IDM_COPY , EnableOrNot);
EnableMenuItem ((HMENU)wParam, IDM_PASTE,
(UINT)(IsClipboardFormatAvailable(CF_TEXT) ? MF_ENABLED : MF_GRAYED));
EnableMenuItem ((HMENU)wParam, IDM_CLEAR, EnableOrNot);
break;
case WM_CREATE:
SendMessage (hwnd, WM_SETFONT, (WPARAM)hFont, 0);
if(!lcInit(hwnd))
PostMessage(hwnd, WM_CLOSE, 0, 0);
break;
case WM_SIZE:
nWidth=LOWORD(lParam);
nHeight=HIWORD(lParam);
if (wParam != SIZE_MINIMIZED)
lcResize(hwnd);
return (DefWindowProc(hwnd, message, wParam, lParam));
case WM_PAINT:
lcPaint(hwnd);
break;
case WM_CLOSE:
if(!lcQuerySave(hwnd))
break;
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
GlobalUnlock(hWord);
GlobalUnlock(hPhrase);
GlobalFree(hWord);
GlobalFree(hPhrase);
break;
default:
return (DefWindowProc(hwnd, message, wParam, lParam));
}
return TRUE;
}
BOOL lcInit(
HWND hwnd)
{
TCHAR *pszFilterSpec;
TCHAR szStr[MAX_PATH];
UINT i;
DWORD style = WS_VISIBLE | WS_CHILD | ES_LEFT;
RECT rect;
int scrollBarWidth, scrollCy;
// style &= (~WS_BORDER);
scrollBarWidth = GetSystemMetrics(SM_CXVSCROLL);
GetClientRect(hwnd, &rect);
cxHD2 = (rect.right - rect.left) - cxHD0 - cxHD1 + 1;
cyHD = CharHeight - 1;
scrollCy = GetSystemMetrics(SM_CYHSCROLL);
subhWnd=CreateWindowEx(
0,
LC_SUBCLASS,
NULL,
(style | WS_HSCROLL | WS_VSCROLL), // | WS_BORDER),
cxHD0 + cxHD1 - 1, CharHeight,
cxHD2 + 1, CharHeight + (iPage_line - 1) * line_height + scrollCy,
hwnd,
NULL,
hInst,
NULL
);
// Create EDIT CONTROL
for(i=0; i<iPage_line; i++)
{
hwndWord[i]=CreateWindowEx(
WS_EX_CLIENTEDGE,
_TEXT("EDIT"),
NULL,
style /*|ES_CENTER*/ | WS_BORDER,
cxHD0, CharHeight+i*line_height,
cxHD1 - 1, CharHeight,
hwnd,
(HMENU)UIntToPtr( (IDE_WORD_START+i) ),
hInst,
NULL
);
hwndPhrase[i]=CreateWindowEx(
WS_EX_CLIENTEDGE,
_TEXT("EDIT"),
NULL,
style /*| ES_CENTER | ES_AUTOHSCROLL*/ | WS_BORDER,
-1, i*line_height,
MulDiv(CharWidth * 2, 96, 72) * MAX_CHAR_NUM,
CharHeight,
subhWnd,
(HMENU)UIntToPtr( (IDE_PHRASE_START+i) ),
hInst,
NULL
);
SendMessage(hwndWord[i], EM_SETLIMITTEXT, 2, 0);
SendMessage(hwndPhrase[i], EM_SETLIMITTEXT, MAX_CHAR_NUM-1, 0);
SendMessage(hwndWord[i], WM_SETFONT, (WPARAM)hFont,
MAKELPARAM(TRUE, 0));
SendMessage(hwndPhrase[i], WM_SETFONT, (WPARAM)hFont,
MAKELPARAM(TRUE, 0));
}
hwndFocus=hwndWord[0];
// Allocate global memory
hWord = GlobalAlloc(GMEM_MOVEABLE, ALLOCBLOCK*sizeof(WORDBUF));
if(!hWord) {
lcErrMsg(IDS_ERR_MEMORY_QUIT);
return FALSE;
}
nWordBuffsize = ALLOCBLOCK;
lWordBuff = 0;
lpWord = (LPWORDBUF)GlobalLock(hWord);
if(!lpWord) {
lcErrMsg(IDS_ERR_MEMORY_QUIT);
return FALSE;
}
hPhrase = GlobalAlloc(GMEM_MOVEABLE, ALLOCBLOCK*sizeof(PHRASEBUF));
if(!hPhrase) {
GlobalFree(hWord);
lcErrMsg(IDS_ERR_MEMORY_QUIT);
return FALSE;
}
nPhraseBuffsize = ALLOCBLOCK;
lPhraseBuff = 0;
lpPhrase = (LPPHRASEBUF)GlobalLock(hPhrase);
if(!lpPhrase) {
GlobalFree(hWord);
lcErrMsg(IDS_ERR_MEMORY_QUIT);
return FALSE;
}
iFirstFree=NULL_SEG;
// Read file to memory
SetCursor(hCursorWait);
lcFOpen(hwnd);
SetCursor(hCursorArrow);
if(lWordBuff == 0)
lcInsLine(hwnd);
iDisp_Top=0;
yPos=0;
xPos=0;
bSaveFile=FALSE;
SetScrollRange(subhWnd, SB_VERT, 0, lWordBuff-iPage_line, TRUE);
SetScrollPos(subhWnd, SB_VERT, yPos, TRUE);
SetScrollRange(subhWnd, SB_HORZ, 0, TOTALSCALE, TRUE);
SetScrollPos(subhWnd, SB_HORZ, xPos, TRUE);
lcSetEditText(iDisp_Top, TRUE);
SetFocus(hwndWord[0]);
if(!GetPrinterConfig(hwnd))
lcErrMsg(IDS_PTRCONFIGFAILED);
// Initial filter spec
LoadString (hInst, IDS_FILTERSPEC, szFilterSpec, sizeof(szFilterSpec));
LoadString (hInst, IDS_DEFAULTFILEEXT, szExt, sizeof(szExt));
pszFilterSpec=szFilterSpec;
pszFilterSpec+=lstrlen(pszFilterSpec)+1;
lstrcpy(pszFilterSpec,szExt);
LoadString (hInst, IDS_FILTERSPEC_ALL, szStr, sizeof(szStr));
pszFilterSpec+=lstrlen(pszFilterSpec)+1;
lstrcpy(pszFilterSpec,szStr);
LoadString (hInst, IDS_ALLFILEEXT, szStr, sizeof(szStr));
pszFilterSpec+=lstrlen(pszFilterSpec)+1;
lstrcpy(pszFilterSpec,szStr);
pszFilterSpec+=lstrlen(pszFilterSpec)+1;
*pszFilterSpec=0;
return TRUE;
}
LRESULT CALLBACK WndSubProc(
HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
int nOffset;
switch (message) {
case WM_CREATE:
SendMessage (hwnd, WM_SETFONT, (WPARAM)hFont, 0);
break;
case WM_SETFOCUS:
if(hwnd != hwndFocus)
SetFocus(hwndFocus);
break;
case WM_VSCROLL:
switch((int)LOWORD(wParam)){
case SB_LINEUP :
lcUp_key(GetFocus());
break;
case SB_LINEDOWN :
lcDown_key(GetFocus());
break;
case SB_PAGEUP :
lcPgUp_key(GetFocus());
break;
case SB_PAGEDOWN :
lcPgDown_key(GetFocus());
break;
case SB_THUMBPOSITION :
yPos=HIWORD(wParam);
if(lWordBuff < iPage_line)
yPos=0;
if(((UINT)yPos) < iPage_line)
yPos=0;
if(!lcSetEditText(yPos, TRUE)) {
yPos=iDisp_Top;
break;
}
iDisp_Top=yPos;
break;
} //switch(wParam)
SetScrollPos(hwnd, SB_VERT, yPos, TRUE);
draw_vert_header(hwndMain);
break;
case WM_HSCROLL:
nOffset = 0;
switch((int)LOWORD(wParam)){
case SB_LINELEFT :
nOffset = -LINESHIFT;
break;
case SB_LINERIGHT :
nOffset = LINESHIFT;
break;
case SB_PAGELEFT :
nOffset = -PAGESHIFT;
break;
case SB_PAGERIGHT :
nOffset = PAGESHIFT;
break;
case SB_THUMBPOSITION :
nOffset=HIWORD(wParam) - xPos;
break;
} //switch(wParam)
if (xPos + nOffset < 0) nOffset = -xPos;
if (xPos + nOffset > TOTALSCALE) nOffset = TOTALSCALE - xPos;
xPos += nOffset;
SetScrollPos(hwnd, SB_HORZ, xPos, TRUE);
lcMoveEditWindow(hwnd, nOffset);
break;
case WM_CLOSE:
DestroyWindow(hwnd);
break;
default:
return (DefWindowProc(hwnd, message, wParam, lParam));
}
return 0;
}
void lcMoveEditWindow(
HWND hwnd, int nOffset)
{
RECT baseRect, rect;
UINT i, nTotalWidth;
GetWindowRect(hwnd, &baseRect);
#ifdef UNICODE
nTotalWidth = MulDiv(CharWidth * 2, 96, 72) * MAX_CHAR_NUM;
#else
nTotalWidth = MulDiv(CharWidth * 2, 72, 96) * MAX_CHAR_NUM;
#endif
for(i=0; i<iPage_line; i++)
{
GetWindowRect(hwndPhrase[i], &rect);
rect.left -= baseRect.left;
rect.top -= baseRect.top;
rect.left -= MulDiv(nTotalWidth, nOffset, TOTALSCALE);
if (rect.left > -1) rect.left = -1;
if (xPos == 0) rect.left = -1;
SetWindowPos(hwndPhrase[i], NULL, rect.left, rect.top, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
}
}
void lcOrgEditWindow()
{
UINT i;
xPos = 0;
SetScrollPos(subhWnd, SB_HORZ, xPos, TRUE);
for(i=0; i<iPage_line; i++)
{
SetWindowPos(hwndPhrase[i], NULL, -1, i*line_height, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
}
}
void lcMoveEditWindowByWord(UINT nWords)
{
RECT rect;
UINT i, nTotalWidth, nOffset;
#ifdef UNICODE
nTotalWidth = MulDiv(CharWidth * 2, 96, 72) * MAX_CHAR_NUM;
nOffset = MulDiv(CharWidth, 96, 72) * nWords;
#else
nTotalWidth = MulDiv(CharWidth * 2, 72, 96) * MAX_CHAR_NUM;
nOffset = MulDiv(CharWidth, 72, 96) * nWords;
#endif
for(i=0; i<iPage_line; i++)
{
rect.left = -1;
rect.top = i * line_height;
rect.left -= nOffset;
SetWindowPos(hwndPhrase[i], NULL, rect.left, rect.top, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
}
xPos = MulDiv(nOffset, TOTALSCALE, nTotalWidth);
SetScrollPos(subhWnd, SB_HORZ, xPos, TRUE);
}
void lcResize(
HWND hwnd)
{
UINT i;
DWORD style = WS_VISIBLE | WS_CHILD | ES_LEFT;
RECT rect;
int scrollBarWidth, scrollCy;
int right, bottom;
UINT iPage_line_old = iPage_line;
static BOOL bResizePainted = TRUE;
if (bResizePainted) {
bResizePainted = FALSE;
return;
}
// #53592 10/10/96
/*
for(i=0; i<iPage_line; i++)
{
DestroyWindow(hwndWord[i]);
hwndWord[i] = 0;
DestroyWindow(hwndPhrase[i]);
hwndPhrase[i] = 0;
}
*/
iPage_line=nHeight/line_height;
if(iPage_line > MAX_LINE)
iPage_line=MAX_LINE;
// #53592 10/10/96
// Shrink, destroy extra edit control windows
if (iPage_line < iPage_line_old)
{
for(i=iPage_line; i<iPage_line_old; i++)
{
DestroyWindow(hwndWord[i]);
hwndWord[i] = 0;
DestroyWindow(hwndPhrase[i]);
hwndPhrase[i] = 0;
}
}
nHeight = line_height * iPage_line + CharHeight + cyCaption + cyMenu+12 ;
scrollBarWidth = GetSystemMetrics(SM_CXVSCROLL);
scrollCy = GetSystemMetrics(SM_CYHSCROLL);
#ifndef UNICODE
scrollCy += 2;
#endif
right = nWidth + (2 * scrollBarWidth);
bottom = nHeight + scrollCy;
bResizePainted = TRUE;
SetWindowPos(hwnd, NULL, 0, 0, right, bottom, SWP_NOMOVE | SWP_NOZORDER);
GetClientRect(hwnd, &rect);
cxHD2 = (rect.right - rect.left) - cxHD0 - cxHD1 + 1;
right = cxHD2 + 1;
bottom = CharHeight + (iPage_line - 1) * line_height + scrollCy;
SetWindowPos(subhWnd, NULL, 0, 0, right, bottom, SWP_NOMOVE | SWP_NOZORDER);
cyHD = CharHeight - 1;
// #53592 10/10/96
// Create extra EDIT CONTROL if needed
for(i=iPage_line_old; i<iPage_line; i++)
{
hwndWord[i]=CreateWindowEx(
WS_EX_CLIENTEDGE,
_TEXT("EDIT"),
NULL,
style | WS_BORDER,
cxHD0, CharHeight+i*line_height,
cxHD1-1, CharHeight,
hwnd,
(HMENU)UIntToPtr( (IDE_WORD_START+i) ),
hInst,
NULL
);
hwndPhrase[i]=CreateWindowEx(
WS_EX_CLIENTEDGE,
_TEXT("EDIT"),
NULL,
style /*| ES_AUTOHSCROLL*/ | WS_BORDER,
-1, i*line_height,
MulDiv(CharWidth * 2, 96, 72) * MAX_CHAR_NUM,
CharHeight,
subhWnd,
(HMENU)UIntToPtr( (IDE_PHRASE_START+i) ),
hInst,
NULL
);
SendMessage(hwndWord[i], EM_SETLIMITTEXT, 2, 0);
SendMessage(hwndPhrase[i], EM_SETLIMITTEXT, MAX_CHAR_NUM-1, 0);
SendMessage(hwndWord[i],
WM_SETFONT,
(WPARAM)hFont,
MAKELPARAM(TRUE, 0));
SendMessage(hwndPhrase[i],
WM_SETFONT,
(WPARAM)hFont,
MAKELPARAM(TRUE, 0));
}
hwndFocus=hwndWord[0];
SetScrollRange(subhWnd, SB_VERT, 0, lWordBuff-iPage_line, TRUE);
SetScrollPos(subhWnd, SB_VERT, yPos, TRUE);
xPos = 0;
SetScrollRange(subhWnd, SB_HORZ, 0, TOTALSCALE, TRUE);
SetScrollPos(subhWnd, SB_HORZ, xPos, TRUE);
lcSetEditText(iDisp_Top, TRUE);
SetFocus(hwndWord[0]);
}
void draw_horz_header(HWND hwnd)
{
HDC hdc = GetDC(hwnd);
RECT rect, r0, r1, r2;
TCHAR szStr[MAX_PATH];
HFONT hOldFont;
GetClientRect(hwnd, &rect);
SetRect(&r0, 0, 0, cxHD0 - 1, cyHD);
SetRect(&r1, cxHD0, 0, cxHD0 + cxHD1 - 1, cyHD);
SetRect(&r2, cxHD0 + cxHD1, 0, rect.right - 1, cyHD);
draw_box1(hdc, r0.left, r0.top, r0.right - 1, r0.bottom);
draw_box1(hdc, r1.left, r1.top, r1.right, r1.bottom);
draw_box1(hdc, r2.left, r2.top, r2.right, r2.bottom);
SetBkColor(hdc, 0x00c0c0c0); // Set Background color to Light gray
r1.top += ((r1.bottom - r1.top - cyHD + 10) / 2);
r2.top += ((r2.bottom - r2.top - cyHD + 10) / 2);
hOldFont = SelectObject(hdc, hFont);
LoadString(hInst, IDS_MAIN_WORD, szStr, sizeof(szStr)/sizeof(TCHAR));
DrawText(hdc, szStr, lstrlen(szStr), &r1, DT_CENTER | DT_VCENTER);
LoadString(hInst, IDS_MAIN_PHRASE, szStr, sizeof(szStr));
DrawText(hdc, szStr, lstrlen(szStr), &r2, DT_CENTER | DT_VCENTER);
SelectObject(hdc, hOldFont);
ReleaseDC(hwnd, hdc);
}
void draw_vert_header(HWND hwnd)
{
HDC hdc = GetDC(hwnd);
RECT rect, r, r0;
TCHAR szStr[MAX_PATH];
UINT i;
HFONT hOldFont;
GetClientRect(hwnd, &rect);
SetRect(&r0, 0, 0, cxHD0 - 1, cyHD);
SetBkColor(hdc, 0x00c0c0c0); // Set Background color to Light gray
hOldFont = SelectObject(hdc, hFont);
r0.top = r0.bottom + 2;
r0.bottom = r0.top + cyHD - 1;
for(i = 0; i < iPage_line; i++)
{
draw_box1(hdc, r0.left, r0.top, r0.right, r0.bottom);
r = r0;
r.top += ((r.bottom - r.top - cyHD + 10) / 2);
//r.top += ((r.bottom - r.top - cyHD + 5) / 2);
wsprintf(szStr, _TEXT("%d "), iDisp_Top + i + 1);
DrawText(hdc, szStr, lstrlen(szStr), &r, DT_RIGHT);
r0.top = r0.bottom + 1;
r0.bottom = r0.top + cyHD - 1;
}
SelectObject(hdc, hOldFont);
ReleaseDC(hwnd, hdc);
}
void DrawHeader(HWND hwnd)
{
draw_horz_header(hwnd);
draw_vert_header(hwnd);
}
void lcPaint(HWND hwnd)
{
PAINTSTRUCT ps; // paint structure
HDC hDC; // display-context variable
hDC = BeginPaint (hwnd, &ps);
EndPaint(hwnd, &ps);
DrawHeader(hwnd);
}
BOOL lcAllocWord()
{
HANDLE hTemp;
nWordBuffsize += ALLOCBLOCK;
GlobalUnlock(hWord);
hTemp= GlobalReAlloc(hWord, nWordBuffsize*sizeof(WORDBUF),
GMEM_MOVEABLE);
if(hTemp == NULL) {
nWordBuffsize -= ALLOCBLOCK;
lcErrMsg(IDS_ERR_MEMORY);
return FALSE;
}
hWord=hTemp;
lpWord=(LPWORDBUF)GlobalLock(hWord);
if(lpWord == NULL) {
nWordBuffsize -= ALLOCBLOCK;
lcErrMsg(IDS_ERR_MEMORY);
return FALSE;
}
return TRUE;
}
BOOL lcAllocPhrase()
{
HANDLE hTemp;
nPhraseBuffsize += ALLOCBLOCK;
GlobalUnlock(hPhrase);
hTemp= GlobalReAlloc(hPhrase, nPhraseBuffsize*sizeof(PHRASEBUF),
GMEM_MOVEABLE);
if(hTemp == NULL) {
nPhraseBuffsize -= ALLOCBLOCK;
lcErrMsg(IDS_ERR_MEMORY);
return FALSE;
}
hPhrase=hTemp;
lpPhrase=(LPPHRASEBUF)GlobalLock(hPhrase);
if(lpPhrase == NULL) {
nPhraseBuffsize -= ALLOCBLOCK;
lcErrMsg(IDS_ERR_MEMORY);
return FALSE;
}
return TRUE;
}
UINT lcGetSeg(
)
{
LPPHRASEBUF Phrase;
UINT iFree;
if(iFirstFree == NULL_SEG) {
// If Allocated Phrase buffer not enough Reallocate it
if(lPhraseBuff+1 == nPhraseBuffsize)
if(!lcAllocPhrase())
return(NULL_SEG);
lpPhrase[lPhraseBuff].lNext_Seg=NULL_SEG;
return(lPhraseBuff++);
}
iFree=iFirstFree;
Phrase=&lpPhrase[iFirstFree];
iFirstFree=Phrase->lNext_Seg;
Phrase->lNext_Seg=NULL_SEG;
return(iFree);
}
void lcFreeSeg(
UINT iFree)
{
LPPHRASEBUF Phrase;
Phrase=&lpPhrase[iFree];
while(Phrase->lNext_Seg!=NULL_SEG)
Phrase=&lpPhrase[Phrase->lNext_Seg];
Phrase->lNext_Seg=iFirstFree;
iFirstFree=iFree;
}
BOOL lcTranslateMsg(
MSG *msg)
{
USHORT uCtrl;
USHORT uKeyState;
UINT i;
// Process keystroke, for EDIT CONTROL
if(msg->message == WM_CHAR) {
if(msg->wParam == 0x09) { // Tab key
lcTab_key(msg->hwnd);
return TRUE;
}
}
if(msg->message == WM_KEYDOWN) {
uCtrl=GetKeyState(VK_CONTROL);
uKeyState=(uCtrl & STATE_ON) ? CTRL_STATE : 0;
for(i=0; i<nFuncKey; i++) {
if((lpFuncKey[i].uState == uKeyState) &&
(lpFuncKey[i].wKey == msg->wParam)) {
PostMessage( hwndMain, WM_COMMAND, lpFuncKey[i].wID, 0);
return FALSE;
}
}
if(lcKey(msg->hwnd, msg->wParam, uKeyState))
{
draw_vert_header(hwndMain);
return TRUE;
}
}
return FALSE;
}
void draw_box0(HDC hdc, int x1, int y1, int x2, int y2)
{
RECT r = {x1, y1, x2, y2};
HPEN hPen, hOldPen;
HBRUSH hOldBr;
POINT pt;
hOldBr = SelectObject(hdc, GetStockObject(LTGRAY_BRUSH));
hOldPen = SelectObject(hdc, GetStockObject(NULL_PEN));
Rectangle(hdc, r.left, r.top, r.right, r.bottom);
SelectObject(hdc, hOldPen);
SelectObject(hdc, hOldBr);
hPen = CreatePen(PS_SOLID, 1, RGB(128, 128, 128));
if ( hPen )
{
hOldPen = SelectObject(hdc, hPen);
MoveToEx(hdc, r.right, r.top, &pt);
LineTo(hdc, r.left, r.top);
LineTo(hdc, r.left, r.bottom);
SelectObject(hdc, hOldPen);
DeleteObject(hPen);
}
hOldPen = SelectObject(hdc, GetStockObject(WHITE_PEN));
MoveToEx(hdc, r.right, r.top + 1, &pt);
LineTo(hdc, r.right, r.bottom);
LineTo(hdc, r.left + 1, r.bottom);
SelectObject(hdc, hOldPen);
}
void draw_box1(HDC hdc, int x1, int y1, int x2, int y2)
{
RECT r = {x1, y1, x2, y2};
HPEN hPen, hOldPen;
HBRUSH hOldBr;
POINT pt;
hOldBr = SelectObject(hdc, GetStockObject(LTGRAY_BRUSH));
hOldPen = SelectObject(hdc, GetStockObject(NULL_PEN));
Rectangle(hdc, r.left, r.top, r.right, r.bottom);
SelectObject(hdc, hOldPen);
SelectObject(hdc, hOldBr);
hOldPen = SelectObject(hdc, GetStockObject(WHITE_PEN));
MoveToEx(hdc, r.right, r.top, &pt);
LineTo(hdc, r.left, r.top);
LineTo(hdc, r.left, r.bottom);
SelectObject(hdc, hOldPen);
hPen = CreatePen(PS_SOLID, 1, RGB(128, 128, 128));
if ( hPen )
{
hOldPen = SelectObject(hdc, hPen);
MoveToEx(hdc, r.right, r.top + 1, &pt);
LineTo(hdc, r.right, r.bottom);
LineTo(hdc, r.left + 1, r.bottom);
SelectObject(hdc, hOldPen);
DeleteObject(hPen);
}
}