📄 dbcsedit.c
字号:
{
HANDLE hMem;
hMem = RemoveProp ( hWnd, szNoEnter);
GlobalFree ( hMem );
}
break;
case WM_MOUSEMOVE:
if (!bMouseDown)
break;
CallWindowProc(fpOldEditProc,hWnd,message,wParam,lParam);
if(IsBetweenHanzi(hWnd))
{
if (GetWindowLong (hWnd, GWL_EXSTYLE) & ES_MULTILINE)
{
hDC = GetDC (hWnd);
ptm = (NPTEXTMETRIC)LocalAlloc (LPTR, sizeof(TEXTMETRIC));
GetTextMetrics (hDC, ptm);
if (LOWORD(lParam) > xMousePos)
lParam += ptm->tmAveCharWidth;
else
lParam -= ptm->tmAveCharWidth;
CallWindowProc (fpOldEditProc,hWnd,message,wParam, lParam);
LocalFree ((HANDLE)ptm);
ReleaseDC (hWnd, hDC);
InvalidateRect (hWnd, NULL, FALSE);
}
else
{
ldat = CallWindowProc (fpOldEditProc,hWnd,EM_GETSEL,0,0L);
if (LOWORD(lParam) > xMousePos)
{
if (LOWORD(ldat)==xLastPos)
{
CallWindowProc (fpOldEditProc, hWnd,
EM_SETSEL, 0, ldat-0x10000);
CallWindowProc (fpOldEditProc, hWnd,
EM_SETSEL, 0, ldat+0x10000);
}
else
{
CallWindowProc (fpOldEditProc,hWnd,
EM_SETSEL, 0, SWAPLONG(ldat-1));
CallWindowProc (fpOldEditProc,hWnd,
EM_SETSEL, 0, SWAPLONG(ldat+1));
}
}
else
{
if (LOWORD(ldat)==xLastPos)
CallWindowProc (fpOldEditProc,hWnd,
EM_SETSEL, 0, ldat-0x10000);
else
CallWindowProc (fpOldEditProc,hWnd,
EM_SETSEL, 0, SWAPLONG(ldat-1));
}
}
}
// xMousePos = LOWORD(lParam);
return NULL;
case WM_LBUTTONDOWN:
bMouseDown=1;
xMousePos = LOWORD(lParam);
CallWindowProc(fpOldEditProc,hWnd,message,wParam,lParam);
ldat = CallWindowProc (fpOldEditProc,hWnd,EM_GETSEL,0,0L);
xLastPos = LOWORD(ldat);
if (IsBetweenHanzi(hWnd))
{
if ( LOWORD ( ldat ) == HIWORD ( ldat ))
CallWindowProc (fpOldEditProc,hWnd,
EM_SETSEL, 0, ldat-0x10001);
else
{
if ( IsStartBetweenHanzi ( hWnd ))
CallWindowProc ( fpOldEditProc, hWnd, EM_SETSEL, 0, ldat-0x1 );
else
CallWindowProc ( fpOldEditProc, hWnd, EM_SETSEL, 0, ldat-0x10000 );
}
xLastPos--;
}
return NULL;
case WM_LBUTTONDBLCLK:
CallWindowProc (fpOldEditProc,hWnd,
EM_SETSEL, 0,
GetWordPos (hWnd));
return NULL;
case WM_LBUTTONUP:
bMouseDown=0;
break;
case WM_KEYDOWN:
switch(wParam){
case VK_SHIFT:
ldat = CallWindowProc (fpOldEditProc,hWnd,EM_GETSEL,0,0L);
if (LOWORD(ldat)==HIWORD(ldat))
xLastPos = LOWORD(ldat);
break;
case VK_UP:
ldat = CallWindowProc(fpOldEditProc,hWnd,message,wParam,lParam);
if(IsBetweenHanzi(hWnd)) {
ldat = CallWindowProc(fpOldEditProc,hWnd,WM_KEYDOWN,VK_LEFT,lParam);
}
return ldat;
case VK_DOWN:
ldat = CallWindowProc(fpOldEditProc,hWnd,message,wParam,lParam);
if(IsBetweenHanzi(hWnd)){
ldat = CallWindowProc(fpOldEditProc,hWnd,WM_KEYDOWN,VK_LEFT, lParam);
}
return ldat;
case VK_RIGHT:
if (!(GetKeyState (VK_SHIFT) & 0x8000))
{
CallWindowProc (fpOldEditProc,hWnd,message,wParam,lParam);
if(IsBetweenHanzi(hWnd))
CallWindowProc (fpOldEditProc,hWnd,message,wParam,lParam);
return NULL;
}
ldat = CallWindowProc (fpOldEditProc,hWnd,EM_GETSEL,0,0L);
if (LOWORD(ldat) == HIWORD(ldat))
xLastPos = LOWORD(ldat);
if (LOWORD(ldat) == xLastPos)
{
if (IsBeforeHanzi (hWnd,1))
CallWindowProc (fpOldEditProc,hWnd,
EM_SETSEL, 0, ldat+0x20000);
else
CallWindowProc (fpOldEditProc,hWnd,
message,wParam,lParam);
}
else if (HIWORD(ldat) == xLastPos)
{
if (IsBeforeHanzi (hWnd,-1))
CallWindowProc (fpOldEditProc,hWnd,
EM_SETSEL, 0, SWAPLONG(ldat+0x2));
else
CallWindowProc (fpOldEditProc,hWnd,
message,wParam,lParam);
}
else
{
CallWindowProc (fpOldEditProc,hWnd,message,wParam,lParam);
if(IsBetweenHanzi(hWnd))
CallWindowProc (fpOldEditProc,hWnd,message,wParam,lParam);
}
return NULL;
case VK_LEFT:
if (!(GetKeyState (VK_SHIFT) & 0x8000))
{
CallWindowProc (fpOldEditProc,hWnd,message,wParam,lParam);
if(IsBetweenHanzi(hWnd))
CallWindowProc (fpOldEditProc,hWnd,message,wParam,lParam);
return NULL;
}
ldat = CallWindowProc (fpOldEditProc,hWnd,EM_GETSEL,0,0L);
if (LOWORD(ldat) == HIWORD(ldat))
xLastPos = LOWORD(ldat);
if (HIWORD(ldat) == xLastPos)
{
if (LOWORD(ldat))
{
if (IsAfterHanzi (hWnd,-1))
CallWindowProc (fpOldEditProc,hWnd,
EM_SETSEL, 0, SWAPLONG(ldat-0x2));
else
CallWindowProc (fpOldEditProc,hWnd,message,wParam,lParam);
}
}
else if (LOWORD(ldat) == xLastPos)
{
if (IsAfterHanzi(hWnd,1))
CallWindowProc (fpOldEditProc,hWnd,
EM_SETSEL, 0, ldat-0x20000);
else
CallWindowProc (fpOldEditProc,hWnd,message,wParam,lParam);
}
else
{
CallWindowProc (fpOldEditProc,hWnd,message,wParam,lParam);
if(IsBetweenHanzi(hWnd))
CallWindowProc (fpOldEditProc,hWnd,message,wParam,lParam);
}
return NULL;
case VK_DELETE:
if (!(GetKeyState(VK_SHIFT) & 0x8000))
{
ldat = CallWindowProc (fpOldEditProc,hWnd,EM_GETSEL,0,0L);
if ( IsBeforeHanzi ( hWnd, 0 ))
{
CallWindowProc ( fpOldEditProc, hWnd, EM_SETSEL, 0, ldat+0x20000 );
ldat = 0;
CallWindowProc ( fpOldEditProc, hWnd, EM_REPLACESEL, 0, ( DWORD )( LPSTR ) &ldat );
}
else
CallWindowProc ( fpOldEditProc, hWnd, WM_KEYDOWN, VK_DELETE, lParam );
return NULL;
}
break;
}
break;
#ifdef _WIN31
// following is added by MA : 12/03/93
case WM_IME_REPORT:
switch ( wParam )
{
case IR_DBCSCHAR:
return 0;
case IR_STRING:
if ( bSetFlag )
{
LPSTR lpMem;
long lStartPosition, lLastPosition;
RECT UpdateArea;
if (( lpMem = GlobalLock ( LOWORD ( lParam ))) == NULL )
return NULL;
lStartPosition = CallWindowProc ( fpOldEditProc, hWnd, EM_GETSEL, 0, 0L );
while ( * lpMem )
CallWindowProc ( fpOldEditProc, hWnd, WM_CHAR, ( WORD )( unsigned char )* lpMem ++, 1L );
GetClientRect ( hWnd, & UpdateArea );
lLastPosition = CallWindowProc ( fpOldEditProc, hWnd, EM_GETSEL, 0, 0L );
CalculateLine ( fpOldEditProc, hWnd, lStartPosition, lLastPosition, & UpdateArea );
GlobalUnlock ( LOWORD ( lParam ));
InvalidateRect ( hWnd, & UpdateArea, FALSE );
}
return bSetFlag;
default:
return NULL;
}
#endif
case WM_CHAR:
switch(wParam)
{
case VK_BACK:
ldat = CallWindowProc (fpOldEditProc,hWnd,EM_GETSEL,0,0L);
if (GetWindowLong (hWnd, GWL_EXSTYLE) & ES_MULTILINE)
{
if (LOWORD(ldat) == HIWORD(ldat))
{
if (LOWORD(ldat))
CallWindowProc (fpOldEditProc,hWnd,
EM_SETSEL, 0,
IsAfterHanzi (hWnd,-1) ? ldat-0x2
: ldat-0x1);
}
ldat = 0;
CallWindowProc (fpOldEditProc, hWnd,
EM_REPLACESEL, 0,
(long)(LPSTR)&ldat);
}
else
{
if (LOWORD(ldat)==HIWORD(ldat) && IsAfterHanzi (hWnd,-1))
CallWindowProc (fpOldEditProc,hWnd,message,wParam,lParam);
CallWindowProc (fpOldEditProc,hWnd,message,wParam,lParam);
}
return NULL;
default:
{
HANDLE hMem;
LPSTR lpBuf;
hMem = GetProp ( hWnd, szNoEnter);
if (( lpBuf = GlobalLock ( hMem )) != NULL )
{
if ( * lpBuf == 0 )
{
if ( IsDBCSLeadByte((char) wParam ))
{
* ( WORD FAR * ) lpBuf = wParam;
* ( LONG FAR * ) ( lpBuf + 2 ) = lParam;
GlobalUnlock ( hMem );
return NULL;
} // else do old
else
GlobalUnlock ( hMem );
}
else
{
// LPSTR lpMem;
long lStartPosition, lLastPosition;
RECT UpdateArea;
lStartPosition = CallWindowProc ( fpOldEditProc, hWnd, EM_GETSEL, 0, 0L );
GetClientRect ( hWnd, & UpdateArea );
lLastPosition = CallWindowProc ( fpOldEditProc, hWnd, EM_GETSEL, 0, 0L );
CalculateLine ( fpOldEditProc, hWnd, lStartPosition, lLastPosition, & UpdateArea );
CallWindowProc ( fpOldEditProc, hWnd, WM_CHAR, * ( WORD FAR * ) lpBuf, * ( LONG FAR * ) ( lpBuf+2 ) );
CallWindowProc ( fpOldEditProc, hWnd, WM_CHAR, wParam, lParam );
InvalidateRect ( hWnd, & UpdateArea, FALSE );
* lpBuf = 0;
GlobalUnlock ( hMem );
return NULL;
}
}
}
break;
}
break;
}
return (CallWindowProc(fpOldEditProc,hWnd,message,wParam,lParam));
}
void CalculateLine ( FARPROC fpOldEditProc, HWND hWnd, long lStartPosition, long lLastPosition, RECT FAR * pUpdateArea )
{
long lWinHeight = pUpdateArea -> bottom - pUpdateArea -> top;
long lFirstLine = CallWindowProc ( fpOldEditProc, hWnd, EM_GETFIRSTVISIBLELINE, 0, 0L );
long lStartPos = CallWindowProc ( fpOldEditProc, hWnd, EM_LINEFROMCHAR, LOWORD ( lStartPosition ), 0L );
long lLineinWnd, lLineCount, ldat, i;
POINT CaretPos;
HDC hDC;
TEXTMETRIC tm;
// create repaint top limit
if ( lStartPos >= lFirstLine )
{
CallWindowProc ( fpOldEditProc, hWnd, EM_SETSEL, 0, MAKELONG ( LOWORD ( lStartPosition ), LOWORD ( lStartPosition )));
GetCaretPos ( & CaretPos );
pUpdateArea -> top = CaretPos.y;
CallWindowProc ( fpOldEditProc, hWnd, EM_SETSEL, 0, lLastPosition );
}
// get TEXTMETRICS
hDC = GetDC ( hWnd );
GetTextMetrics ( hDC, & tm );
ReleaseDC ( hWnd, hDC );
lLineinWnd = lWinHeight / ( tm.tmHeight + tm.tmExternalLeading );
lLineCount = CallWindowProc ( fpOldEditProc, hWnd, EM_GETLINECOUNT, 0, 0L );
for ( i = CallWindowProc ( fpOldEditProc, hWnd, EM_LINEFROMCHAR, LOWORD( lStartPosition ), 0L );
i < min ( lLineCount, lFirstLine+lLineinWnd )-1; i++ )
if ( CheckLine ( fpOldEditProc, hWnd, i ) == TRUE ) break;
// create repaint area bottom limit
if ( i < min ( lLineCount, lFirstLine+lLineinWnd )-1 )
{ // i+1 is the next line
ldat = CallWindowProc ( fpOldEditProc, hWnd, EM_LINEINDEX, LOWORD(i+1), 0L );
CallWindowProc ( fpOldEditProc, hWnd, EM_SETSEL, 0, MAKELONG(LOWORD(ldat),LOWORD(ldat)) );
GetCaretPos ( & CaretPos );
CallWindowProc ( fpOldEditProc, hWnd, EM_SETSEL, 0, lLastPosition );
pUpdateArea -> bottom = CaretPos.y;
} // else update all last area
}
int WINAPI WordBreakProc (lpString, iCurrent, iCount, wAction)
LPSTR lpString;
short iCurrent;
short iCount;
WORD wAction;
{
switch (wAction)
{
case WB_LEFT:
return (AnsiPrev (lpString, lpString+iCurrent) - lpString);
case WB_RIGHT:
return (AnsiNext (lpString+iCurrent) - lpString);
case WB_ISDELIMITER:
return FALSE;
}
return NULL;
}
BOOL CheckLine ( FARPROC fpOldEditProc, HWND hWnd, long nLineNum )
{
int nLineLength, nThisLineStartPos, nThatLineStartPos;
nThisLineStartPos = CallWindowProc ( fpOldEditProc, hWnd, EM_LINEINDEX, LOWORD ( nLineNum ), 0L );
nLineLength = CallWindowProc ( fpOldEditProc, hWnd, EM_LINELENGTH, LOWORD (nThisLineStartPos ), 0L );
nThatLineStartPos = CallWindowProc ( fpOldEditProc, hWnd, EM_LINEINDEX, LOWORD ( nLineNum ) + 1, 0L );
if ( nThatLineStartPos == nLineLength + nThisLineStartPos + 2 )
return TRUE;
else
return FALSE;
}
void EnumEditWindows (HWND hWnd, FARPROC fpProc)
{
if (hWnd)
{
do {
GetClassName (hWnd, szClass, 7);
if (!lstrcmpi (szClass, szEdit))
fpProc ((HWND)hWnd);
EnumEditWindows (GetWindow (hWnd, GW_CHILD), fpProc);
} while (hWnd = GetWindow (hWnd, GW_HWNDNEXT));
}
}
void CALLBACK SetEditWnd (HWND hWnd)
{
if (GetWindowLong (hWnd, GWL_WNDPROC) == (LONG)fpOldEditProc)
{
SetWindowLong (hWnd, GWL_WNDPROC, (long)(FARPROC)EditProc);
SetProp (hWnd, szNoEnter, GlobalAlloc (GHND, 100));
PostMessage (hWnd, EM_SETWORDBREAKPROC, NULL,
(LPARAM)(FARPROC)WordBreakProc);
}
}
void CALLBACK ResetEditWnd (HWND hWnd)
{
if (GetWindowLong (hWnd, GWL_WNDPROC) == (WORD)(FARPROC)EditProc)
{
SetWindowLong (hWnd, GWL_WNDPROC, (long)fpOldEditProc);
GlobalFree (RemoveProp (hWnd, szNoEnter));
PostMessage (hWnd, EM_SETWORDBREAKPROC, NULL,
(LPARAM)fpOldWordBreakProc);
}
}
BOOL WINAPI EnableDBCSEditCtrl ( int b )
{
HWND hWnd;
static BOOL bDBCSEditCtrl = FALSE;
if (bCWinVer)
return FALSE;
hWnd = CreateWindow (szEdit, szNewEditer, NULL,
0, 0, 0, 0,
NULL, NULL, hInst, NULL);
if ( ! hWnd )
return FALSE;
if (b)
{
if ( !bDBCSEditCtrl)
{
fpOldWordBreakProc = (FARPROC)SendMessage (hWnd, EM_GETWORDBREAKPROC,
NULL, NULL);
fpOldEditProc = (FARPROC)SetClassLong (hWnd, GCL_WNDPROC,
(long)(FARPROC)EditProc);
EnumEditWindows (GetWindow (GetActiveWindow (), GW_HWNDFIRST),
(FARPROC)SetEditWnd);
bDBCSEditCtrl = TRUE;
}
if ( b == 1 )
bSetFlag = FALSE;
else
bSetFlag = TRUE;
}
else if (!b && bDBCSEditCtrl)
{
SetClassLong (hWnd, GCL_WNDPROC, (long)fpOldEditProc);
EnumEditWindows (GetWindow (GetActiveWindow (), GW_HWNDFIRST),
(FARPROC)ResetEditWnd);
bDBCSEditCtrl = FALSE;
}
DestroyWindow (hWnd);
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -