📄 edit.c
字号:
//=============================================================================
//
// EditSaveFile()
//
BOOL EditSaveFile(HWND hwnd,LPCSTR pszFile,int iCodePage,BOOL bSaveCopy)
{
HANDLE hFile;
BOOL bWriteSuccess;
LPSTR lpData;
DWORD cbData;
DWORD dwBytesWritten;
hFile = CreateFile(pszFile,
GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
// failure could be due to missing attributes (2k/XP)
if (hFile == INVALID_HANDLE_VALUE)
{
DWORD dwAttributes = GetFileAttributes(pszFile);
if (dwAttributes != INVALID_FILE_ATTRIBUTES)
{
dwAttributes = dwAttributes & (FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM);
hFile = CreateFile(pszFile,
GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL | dwAttributes,
NULL);
}
}
if (hFile == INVALID_HANDLE_VALUE)
return FALSE;
// ensure consistent line endings
if (bFixLineEndings)
SendMessage(hwnd,SCI_CONVERTEOLS,SendMessage(hwnd,SCI_GETEOLMODE,0,0),0);
// get text
cbData = SendMessage(hwnd,SCI_GETLENGTH,0,0);
lpData = GlobalAlloc(GPTR,cbData + 1);
SendMessage(hwnd,SCI_GETTEXT,GlobalSize(lpData),(LPARAM)lpData);
if (cbData == 0)
bWriteSuccess = SetEndOfFile(hFile);
else
{
SetEndOfFile(hFile);
if (iCodePage & NCP_UNICODE)
{
LPWSTR lpDataWide;
int cbDataWide;
CPINFO cpi;
UINT uCP_UTF8;
// UTF-8 text is interpreted as ANSI when saving as Unicode on Windows 95
uCP_UTF8 = (GetCPInfo(CP_UTF8, &cpi) || IsValidCodePage(CP_UTF8)) ? CP_UTF8 : CP_ACP;
lpDataWide = GlobalAlloc(GPTR,cbData * 2 + 16);
cbDataWide = MultiByteToWideChar(uCP_UTF8,0,lpData,cbData,lpDataWide,GlobalSize(lpDataWide));
if (iCodePage & NCP_UNICODE_BOM) {
if (iCodePage & NCP_UNICODE_REVERSE)
WriteFile(hFile,(LPCVOID)"\xFE\xFF",2,&dwBytesWritten,NULL);
else
WriteFile(hFile,(LPCVOID)"\xFF\xFE",2,&dwBytesWritten,NULL);
}
if (iCodePage & NCP_UNICODE_REVERSE)
_swab((char*)lpDataWide,(char*)lpDataWide,cbDataWide * sizeof(WCHAR));
bWriteSuccess = WriteFile(hFile,lpDataWide,cbDataWide * sizeof(WCHAR),&dwBytesWritten,NULL);
GlobalFree(lpData);
}
else if (iCodePage & NCP_UTF8)
{
if (iCodePage & NCP_UTF8_SIGN)
WriteFile(hFile,(LPCVOID)"\xEF\xBB\xBF",3,&dwBytesWritten,NULL);
bWriteSuccess = WriteFile(hFile,lpData,cbData,&dwBytesWritten,NULL);
}
else // convert text to 8bit
{
//LPWSTR lpDataWide = GlobalAlloc(GPTR,cbData * 2 + 16);
//int cbDataWide = MultiByteToWideChar(CP_UTF8,0,lpData,cbData,lpDataWide,GlobalSize(lpDataWide));
//ZeroMemory(lpData,GlobalSize(lpData));
//cbData = WideCharToMultiByte(CP_ACP,0,lpDataWide,cbDataWide,lpData,GlobalSize(lpData),NULL,NULL);
//GlobalFree(lpDataWide);
bWriteSuccess = WriteFile(hFile,lpData,cbData,&dwBytesWritten,NULL);
GlobalFree(lpData);
}
}
CloseHandle(hFile);
if (bWriteSuccess)
{
if (!bSaveCopy)
SendMessage(hwnd,SCI_SETSAVEPOINT,0,0);
return TRUE;
}
else
return FALSE;
}
//=============================================================================
//
// EditMakeUppercase()
//
void EditMakeUppercase(HWND hwnd)
{
int cchTextW;
int iCurPos;
int iAnchorPos;
UINT cpEdit;
int i;
BOOL bChanged = FALSE;
iCurPos = SendMessage(hwnd,SCI_GETCURRENTPOS,0,0);
iAnchorPos = SendMessage(hwnd,SCI_GETANCHOR,0,0);
if (iCurPos != iAnchorPos)
{
if (SC_SEL_RECTANGLE != SendMessage(hwnd,SCI_GETSELECTIONMODE,0,0))
{
int iSelCount = SendMessage(hwnd,SCI_GETSELECTIONEND,0,0) -
SendMessage(hwnd,SCI_GETSELECTIONSTART,0,0);
LPSTR pszText = GlobalAlloc(GPTR,(iSelCount)+2);
LPWSTR pszTextW = GlobalAlloc(GPTR,(iSelCount*2)+2);
if (pszText == NULL || pszTextW == NULL) {
GlobalFree(pszText);
GlobalFree(pszTextW);
return;
}
SendMessage(hwnd,SCI_GETSELTEXT,0,(LPARAM)pszText);
cpEdit = SendMessage(hwnd,SCI_GETCODEPAGE,0,0);
cchTextW = MultiByteToWideChar(cpEdit,0,pszText,iSelCount,pszTextW,GlobalSize(pszTextW) / sizeof(WCHAR));
for (i = 0; i < cchTextW; i++) {
if (IsCharLowerW(pszTextW[i])) {
pszTextW[i] = LOWORD(CharUpperW((LPWSTR)MAKELONG(pszTextW[i],0)));
bChanged = TRUE;
}
}
if (bChanged) {
WideCharToMultiByte(cpEdit,0,pszTextW,cchTextW,pszText,GlobalSize(pszText),NULL,NULL);
GlobalFree(pszTextW);
SendMessage(hwnd,SCI_BEGINUNDOACTION,0,0);
SendMessage(hwnd,SCI_CLEAR,0,0);
SendMessage(hwnd,SCI_ADDTEXT,(WPARAM)iSelCount,(LPARAM)pszText);
SendMessage(hwnd,SCI_SETSEL,(WPARAM)iAnchorPos,(LPARAM)iCurPos);
SendMessage(hwnd,SCI_ENDUNDOACTION,0,0);
GlobalFree(pszText);
}
else
GlobalFree(pszTextW);
}
else
MsgBox(MBINFO,IDS_SELRECT);
}
}
//=============================================================================
//
// EditMakeLowercase()
//
void EditMakeLowercase(HWND hwnd)
{
int cchTextW;
int iCurPos;
int iAnchorPos;
UINT cpEdit;
int i;
BOOL bChanged = FALSE;
iCurPos = SendMessage(hwnd,SCI_GETCURRENTPOS,0,0);
iAnchorPos = SendMessage(hwnd,SCI_GETANCHOR,0,0);
if (iCurPos != iAnchorPos)
{
if (SC_SEL_RECTANGLE != SendMessage(hwnd,SCI_GETSELECTIONMODE,0,0))
{
int iSelCount = SendMessage(hwnd,SCI_GETSELECTIONEND,0,0) -
SendMessage(hwnd,SCI_GETSELECTIONSTART,0,0);
LPSTR pszText = GlobalAlloc(GPTR,(iSelCount)+2);
LPWSTR pszTextW = GlobalAlloc(GPTR,(iSelCount*2)+2);
if (pszText == NULL || pszTextW == NULL) {
GlobalFree(pszText);
GlobalFree(pszTextW);
return;
}
SendMessage(hwnd,SCI_GETSELTEXT,0,(LPARAM)pszText);
cpEdit = SendMessage(hwnd,SCI_GETCODEPAGE,0,0);
cchTextW = MultiByteToWideChar(cpEdit,0,pszText,iSelCount,pszTextW,GlobalSize(pszTextW) / sizeof(WCHAR));
for (i = 0; i < cchTextW; i++) {
if (IsCharUpperW(pszTextW[i])) {
pszTextW[i] = LOWORD(CharLowerW((LPWSTR)MAKELONG(pszTextW[i],0)));
bChanged = TRUE;
}
}
if (bChanged) {
WideCharToMultiByte(cpEdit,0,pszTextW,cchTextW,pszText,GlobalSize(pszText),NULL,NULL);
GlobalFree(pszTextW);
SendMessage(hwnd,SCI_BEGINUNDOACTION,0,0);
SendMessage(hwnd,SCI_CLEAR,0,0);
SendMessage(hwnd,SCI_ADDTEXT,(WPARAM)iSelCount,(LPARAM)pszText);
SendMessage(hwnd,SCI_SETSEL,(WPARAM)iAnchorPos,(LPARAM)iCurPos);
SendMessage(hwnd,SCI_ENDUNDOACTION,0,0);
GlobalFree(pszText);
}
else
GlobalFree(pszTextW);
}
else
MsgBox(MBINFO,IDS_SELRECT);
}
}
//=============================================================================
//
// EditInvertCase()
//
void EditInvertCase(HWND hwnd)
{
int cchTextW;
int iCurPos;
int iAnchorPos;
UINT cpEdit;
int i;
BOOL bChanged = FALSE;
iCurPos = SendMessage(hwnd,SCI_GETCURRENTPOS,0,0);
iAnchorPos = SendMessage(hwnd,SCI_GETANCHOR,0,0);
if (iCurPos != iAnchorPos)
{
if (SC_SEL_RECTANGLE != SendMessage(hwnd,SCI_GETSELECTIONMODE,0,0))
{
int iSelCount = SendMessage(hwnd,SCI_GETSELECTIONEND,0,0) -
SendMessage(hwnd,SCI_GETSELECTIONSTART,0,0);
LPSTR pszText = GlobalAlloc(GPTR,(iSelCount)+2);
LPWSTR pszTextW = GlobalAlloc(GPTR,(iSelCount*2)+2);
if (pszText == NULL || pszTextW == NULL) {
GlobalFree(pszText);
GlobalFree(pszTextW);
return;
}
SendMessage(hwnd,SCI_GETSELTEXT,0,(LPARAM)pszText);
cpEdit = SendMessage(hwnd,SCI_GETCODEPAGE,0,0);
cchTextW = MultiByteToWideChar(cpEdit,0,pszText,iSelCount,pszTextW,GlobalSize(pszTextW) / sizeof(WCHAR));
for (i = 0; i < cchTextW; i++) {
if (IsCharUpperW(pszTextW[i])) {
pszTextW[i] = LOWORD(CharLowerW((LPWSTR)MAKELONG(pszTextW[i],0)));
bChanged = TRUE;
}
else if (IsCharLowerW(pszTextW[i])) {
pszTextW[i] = LOWORD(CharUpperW((LPWSTR)MAKELONG(pszTextW[i],0)));
bChanged = TRUE;
}
}
if (bChanged) {
WideCharToMultiByte(cpEdit,0,pszTextW,cchTextW,pszText,GlobalSize(pszText),NULL,NULL);
GlobalFree(pszTextW);
SendMessage(hwnd,SCI_BEGINUNDOACTION,0,0);
SendMessage(hwnd,SCI_CLEAR,0,0);
SendMessage(hwnd,SCI_ADDTEXT,(WPARAM)iSelCount,(LPARAM)pszText);
SendMessage(hwnd,SCI_SETSEL,(WPARAM)iAnchorPos,(LPARAM)iCurPos);
SendMessage(hwnd,SCI_ENDUNDOACTION,0,0);
GlobalFree(pszText);
}
else
GlobalFree(pszTextW);
}
else
MsgBox(MBINFO,IDS_SELRECT);
}
}
//=============================================================================
//
// EditTitleCase()
//
void EditTitleCase(HWND hwnd)
{
int cchTextW;
int iCurPos;
int iAnchorPos;
UINT cpEdit;
int i;
BOOL bNewWord = TRUE;
BOOL bChanged = FALSE;
iCurPos = SendMessage(hwnd,SCI_GETCURRENTPOS,0,0);
iAnchorPos = SendMessage(hwnd,SCI_GETANCHOR,0,0);
if (iCurPos != iAnchorPos)
{
if (SC_SEL_RECTANGLE != SendMessage(hwnd,SCI_GETSELECTIONMODE,0,0))
{
int iSelCount = SendMessage(hwnd,SCI_GETSELECTIONEND,0,0) -
SendMessage(hwnd,SCI_GETSELECTIONSTART,0,0);
LPSTR pszText = GlobalAlloc(GPTR,(iSelCount)+2);
LPWSTR pszTextW = GlobalAlloc(GPTR,(iSelCount*2)+2);
if (pszText == NULL || pszTextW == NULL) {
GlobalFree(pszText);
GlobalFree(pszTextW);
return;
}
SendMessage(hwnd,SCI_GETSELTEXT,0,(LPARAM)pszText);
cpEdit = SendMessage(hwnd,SCI_GETCODEPAGE,0,0);
cchTextW = MultiByteToWideChar(cpEdit,0,pszText,iSelCount,pszTextW,GlobalSize(pszTextW) / sizeof(WCHAR));
for (i = 0; i < cchTextW; i++) {
if (!IsCharAlphaNumericW(pszTextW[i]) && !wcschr(L"'
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -