一个小demo:
HWND RichEdit; BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { HWND hWnd; RECT rcClient; hInst = LoadLibrary(TEXT("RICHED20.dll")); hInst = hInstance; // 将实例句柄存储在全局变量中 hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); GetClientRect(hWnd,&rcClient); RichEdit = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("RichEdit20A"),NULL, ES_MULTILINE | WS_CHILD |WS_VISIBLE |WS_VSCROLL |WS_HSCROLL | ES_WANTRETURN, 10, 10, rcClient.right-50, rcClient.bottom-50, hWnd, 0, hInstance, NULL); FileInitialize (hWnd) ; if (!hWnd) { return FALSE; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; }在WndProc中需要加入以下代码:
case IDM_Open: { ZeroMemory(&ofn,sizeof (ofn)); ZeroMemory(szFileName,MAX_PATH); ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hWnd; ofn.lpstrFile = szFileName; ofn.nMaxFile = sizeof(szFileName); ofn.lpstrFilter = TEXT("Text File(*.txt)/0*.txt/0All File(*.*)/0*.*"); ofn.nFilterIndex = 1; ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; ofn.lpstrInitialDir = NULL; ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; if (GetOpenFileName(&ofn) == FALSE) break; LoadFromFile(RichEdit,szFileName); break; } break; case IDM_Save: { SaveFile(szFileName,256); SaveToFile(RichEdit,szFileName); } break;
由于文件处理比较繁琐,所以单提出来一个file.cpp头文件:
#include <windows.h> #include <commdlg.h> static OPENFILENAME ofn ; void FileInitialize (HWND hwnd) { static TCHAR szFilter[] = TEXT ("Text Files (*.TXT)\0*.txt\0") \ TEXT ("ASCII Files (*.ASC)\0*.asc\0") \ TEXT ("All Files (*.*)\0*.*\0\0") ; ofn.lStructSize = sizeof (OPENFILENAME) ; ofn.hwndOwner = hwnd ; ofn.hInstance = NULL ; ofn.lpstrFilter = szFilter ; ofn.lpstrCustomFilter = NULL ; ofn.nMaxCustFilter = 0 ; ofn.nFilterIndex = 0 ; ofn.lpstrFile = NULL ; ofn.nMaxFile = MAX_PATH ; ofn.lpstrFileTitle = NULL ; ofn.nMaxFileTitle = MAX_PATH ; ofn.lpstrInitialDir = NULL ; ofn.lpstrTitle = NULL ; ofn.Flags = 0 ; ofn.nFileOffset = 0 ; ofn.nFileExtension = 0 ; ofn.lpstrDefExt = TEXT ("txt") ; ofn.lCustData = 0L ; ofn.lpfnHook = NULL ; ofn.lpTemplateName = NULL ; } BOOL FileOpenDlg (HWND hwnd, PTSTR pstrFileName, PTSTR pstrTitleName) { ofn.hwndOwner = hwnd ; ofn.lpstrFile = pstrFileName ; ofn.lpstrFileTitle = pstrTitleName ; ofn.Flags = OFN_HIDEREADONLY | OFN_CREATEPROMPT ; return GetOpenFileName (&ofn) ; } BOOL FileSaveDlg (HWND hwnd, PTSTR pstrFileName, PTSTR pstrTitleName) { ofn.hwndOwner = hwnd ; ofn.lpstrFile = pstrFileName ; ofn.lpstrFileTitle = pstrTitleName ; ofn.Flags = OFN_OVERWRITEPROMPT ; return GetSaveFileName (&ofn) ; } BOOL FileRead (HWND hwndEdit, PTSTR pstrFileName) { BYTE bySwap ; DWORD dwBytesRead ; HANDLE hFile ; int i, iFileLength, iUniTest ; PBYTE pBuffer, pText, pConv ; if (INVALID_HANDLE_VALUE == (hFile = CreateFile (pstrFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL))) return FALSE ; iFileLength = GetFileSize (hFile, NULL) ; pBuffer = (PBYTE)malloc(iFileLength + 2) ; ReadFile (hFile, pBuffer, iFileLength, &dwBytesRead, NULL) ; CloseHandle (hFile) ; pBuffer[iFileLength] = '\0' ; pBuffer[iFileLength + 1] = '\0' ; iUniTest = IS_TEXT_UNICODE_SIGNATURE | IS_TEXT_UNICODE_REVERSE_SIGNATURE ; if (IsTextUnicode (pBuffer, iFileLength, &iUniTest)) { pText = pBuffer + 2 ; iFileLength -= 2 ; if (iUniTest & IS_TEXT_UNICODE_REVERSE_SIGNATURE) { for (i = 0 ; i < iFileLength / 2 ; i++) { bySwap = ((BYTE *) pText) [2 * i] ; ((BYTE *) pText) [2 * i] = ((BYTE *) pText) [2 * i + 1] ; ((BYTE *) pText) [2 * i + 1] = bySwap ; } } pConv = (PBYTE)malloc(iFileLength + 2) ; #ifndef UNICODE WideCharToMultiByte (CP_ACP, 0, (PWSTR) pText, -1, (LPSTR)pConv, iFileLength + 2, NULL, NULL) ; #else lstrcpy ((PTSTR) pConv, (PTSTR) pText) ; #endif } else { pText = pBuffer ; pConv = (PBYTE)malloc (2 * iFileLength + 2) ; #ifdef UNICODE // MultiByteToWideChar (CP_ACP, 0, pText, -1, (PTSTR) pConv, // iFileLength + 1) ; ; #else lstrcpy ((PTSTR) pConv, (PTSTR) pText) ; #endif } SetWindowText (hwndEdit, (PTSTR) pConv) ; free (pBuffer) ; free (pConv) ; return TRUE ; } BOOL FileWrite (HWND hwndEdit, PTSTR pstrFileName) { DWORD dwBytesWritten ; HANDLE hFile ; int iLength ; PTSTR pstrBuffer ; WORD wByteOrderMark = 0xFEFF ; if (INVALID_HANDLE_VALUE == (hFile = CreateFile (pstrFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL))) return FALSE ; iLength = GetWindowTextLength (hwndEdit) ; pstrBuffer = (PTSTR) malloc ((iLength + 1) * sizeof (TCHAR)) ; if (!pstrBuffer) { CloseHandle (hFile) ; return FALSE ; } #ifdef UNICODE WriteFile (hFile, &wByteOrderMark, 2, &dwBytesWritten, NULL) ; #endif GetWindowText (hwndEdit, pstrBuffer, iLength + 1) ; WriteFile (hFile, pstrBuffer, iLength * sizeof (TCHAR), &dwBytesWritten, NULL) ; if ((iLength * sizeof (TCHAR)) != (int) dwBytesWritten) { CloseHandle (hFile) ; free (pstrBuffer) ; return FALSE ; } CloseHandle (hFile) ; free (pstrBuffer) ; return TRUE ; } void OkMessage (HWND hwnd, TCHAR * szMessage, TCHAR * szTitleName) { TCHAR szBuffer[64 + MAX_PATH] ; wsprintf (szBuffer, szMessage, szTitleName[0] ? szTitleName : _T("UNTITLED")) ; MessageBox (hwnd, szBuffer, NULL, MB_OK | MB_ICONEXCLAMATION) ; } BOOL LoadFromFile(HWND hEdit,LPCTSTR lpFileName) { HANDLE hFile = NULL; HANDLE hFileMapping = NULL; LPCTSTR lpData = NULL; hFile = CreateFile(lpFileName,GENERIC_READ,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if (INVALID_HANDLE_VALUE == hFile) { return FALSE; } hFileMapping = CreateFileMapping(hFile,NULL,PAGE_READONLY | SEC_COMMIT,0,0,NULL); if (NULL == hFileMapping) { CloseHandle(hFile); return FALSE; } lpData = (LPCTSTR)MapViewOfFile(hFileMapping,FILE_MAP_READ,0,0,0); if (lpData == NULL) { CloseHandle(hFileMapping); CloseHandle(hFile); } SetWindowText(hEdit,lpData); UnmapViewOfFile(lpData); CloseHandle(hFileMapping); CloseHandle(hFile); return TRUE; } BOOL SaveToFile(HWND hEdit,LPCTSTR lpFileName) { HANDLE hFile = NULL; HANDLE hFileMapping = NULL; LPTSTR lpData = NULL; int nTextLength = 0; hFile = CreateFile(lpFileName,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); if (INVALID_HANDLE_VALUE == hFile) { return FALSE; } nTextLength = GetWindowTextLength(hEdit) + 1; hFileMapping = CreateFileMapping(hFile,NULL,PAGE_READWRITE,0,nTextLength,NULL); if (NULL == hFileMapping) { CloseHandle(hFile); return FALSE; } lpData = (LPTSTR)MapViewOfFile(hFileMapping,FILE_MAP_WRITE,0,0,0); if (lpData == NULL) { CloseHandle(hFileMapping); CloseHandle(hFile); } GetWindowText(hEdit,lpData,nTextLength); FlushViewOfFile(lpData,nTextLength); UnmapViewOfFile(lpData); CloseHandle(hFileMapping); CloseHandle(hFile); return TRUE; } bool SaveFile(LPTSTR lpFileName,int nLength) { OPENFILENAME ofn; ZeroMemory(&ofn,sizeof (ofn)); ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = NULL; ofn.lpstrFile = lpFileName; ofn.nMaxFile = nLength; ofn.lpstrFilter = TEXT("Text File(*.txt)/0*.txt/0All File(*.*)/0*.*"); ofn.nFilterIndex = 1; ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; ofn.lpstrInitialDir = NULL; ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; if (GetSaveFileName(&ofn) == FALSE) return false; lstrcat(lpFileName,TEXT(".txt")); return true; }