1256 lines
34 KiB
C
1256 lines
34 KiB
C
|
|
||
|
/*************************************************
|
||
|
* 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);
|
||
|
}
|
||
|
}
|