📄 textfile.c
字号:
#include <windows.h>
#include <windowsx.h>
#include "TextFile.h"
#define N 30
#define UNTITLED TEXT ("无标题")
static TCHAR szAppName[] = TEXT ("TextFile");
LRESULT CALLBACK MainWndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
HWND hwnd;
WNDCLASS wc;
MSG msg;
HACCEL hAccel;
wc.style = CS_VREDRAW | CS_HREDRAW;
wc.lpfnWndProc = MainWndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon (hInstance, IDI_APPLICATION);
wc.hCursor = LoadCursor (NULL, IDC_ARROW);
wc.hbrBackground = GetStockObject (WHITE_BRUSH);
wc.lpszMenuName = szAppName;
wc.lpszClassName = szAppName;
if (!RegisterClass (&wc))
{
MessageBox (NULL, TEXT ("注册窗口类失败!"), szAppName,
MB_ICONERROR);
return 0;
}
hwnd = CreateWindow (szAppName, NULL,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL);
if( !hwnd ) return FALSE;
ShowWindow ( hwnd, iCmdShow );
UpdateWindow ( hwnd );
hAccel = LoadAccelerators (hInstance, szAppName);
if (!hAccel)
{
MessageBeep(0);
return FALSE;
}
while (GetMessage (&msg, NULL, 0, 0))
{
if (!TranslateAccelerator (hwnd, hAccel, &msg))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
}
return msg.wParam;
}
/*****************************************************************************
函数: QuerySaveFile(HWND, TCHAR *);
功能: 弹出消息框,提醒文件内容改变,询问是否要求保存。
当用户选择“是”按钮时执行文件保存操作。
返回值:IDYES(保存);IDNO(不保存);IDCANCEL(取消操作)
*************************************************************************/
int QuerySaveFile(HWND hWnd, TCHAR * szTitleName)
{
TCHAR szBuffer[MAX_PATH];
int iResponse;
wsprintf (szBuffer, TEXT ("文件 %s 的内容已经更改,是否需要保存?"),
szTitleName[0] ? szTitleName : UNTITLED) ;
iResponse = MessageBox (hWnd, szBuffer, TEXT ("文件操作演示程序"),
MB_YESNOCANCEL | MB_ICONQUESTION) ;
if (iResponse == IDYES)
if (!SendMessage (hWnd, WM_COMMAND, IDM_FILE_SAVE, 0))
iResponse = IDCANCEL;
return (iResponse);
}
LRESULT CALLBACK MainWndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HWND hWndEdit;
static TCHAR szFileFilter[] = TEXT ("Text Files (*.TXT)\0*.txt\0") \
TEXT ("Text Files (*.C)\0*.c\0") \
TEXT ("Text Files (*.H)\0*.h\0") \
TEXT ("Text Files (*.RC)\0*.rc\0") \
TEXT ("All Files (*.*)\0*.*\0\0");
static TCHAR szFileName[MAX_PATH], szFileTitle[MAX_PATH];
static OPENFILENAME ofn;
static HANDLE hFile;
static BOOL bFileChange = FALSE;
TCHAR szWndCaption[MAX_PATH];
int iFileLength;
LPTSTR lpBuffer;
DWORD dwBytes;
switch (message)
{
case WM_CREATE:
hWndEdit=CreateWindow (TEXT ("edit"), //窗口类名
NULL, //无标题
WS_CHILD|WS_VISIBLE|WS_HSCROLL| //编辑控件风格
WS_VSCROLL|WS_BORDER|ES_LEFT|
ES_MULTILINE|ES_AUTOHSCROLL|
ES_AUTOVSCROLL,
0,0,0,0,
hWnd, //父窗口句柄
(HMENU)1, //编辑控件子窗口标识
(HINSTANCE) GetWindowLong (hWnd, GWL_HINSTANCE),
NULL);
//初始化结构变量 ofn
ofn.lStructSize = sizeof (OPENFILENAME);
ofn.hwndOwner = hWnd;
ofn.hInstance = NULL;
ofn.lpstrFilter = szFileFilter;
ofn.lpstrCustomFilter = NULL;
ofn.nMaxCustFilter = 0;
ofn.nFilterIndex = 0;
ofn.lpstrFile = NULL; //调用 GetOpenFileName 函数前设置
ofn.nMaxFile = MAX_PATH;
ofn.lpstrFileTitle = NULL; //调用 GetOpenFileName 函数前设置
ofn.nMaxFileTitle = MAX_PATH;
ofn.lpstrInitialDir = NULL;
ofn.lpstrTitle = NULL;
ofn.Flags = 0; //调用 GetOpenFileName 函数前设置
ofn.nFileOffset = 0;
ofn.nFileExtension = 0;
ofn.lpstrDefExt = TEXT ("txt");
ofn.lCustData = 0L;
ofn.lpfnHook = NULL;
//显示窗口标题
szFileName[0] = '\0';
szFileTitle[0] = '\0';
wsprintf (szWndCaption, TEXT ("%s - %s"), UNTITLED, szAppName);
SetWindowText (hWnd, szWndCaption) ;
return 0;
case WM_SETFOCUS:
SetFocus (hWndEdit);
return 0;
case WM_SIZE:
MoveWindow (hWndEdit, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);
return 0;
case WM_COMMAND: // 响应菜单及编辑控件通知消息
if (lParam && LOWORD (wParam) == 1) //编辑子窗口通知消息
{
switch (HIWORD (wParam))
{
case EN_UPDATE :
bFileChange = TRUE ;
return 0 ;
case EN_ERRSPACE :
case EN_MAXTEXT :
MessageBox (hWnd,TEXT ("编辑控件内存溢出"),
TEXT ("文件操作示例程序"), MB_OK|MB_ICONSTOP);
return 0 ;
}
break ;
}
else
{
//菜单消息
switch (LOWORD (wParam))
{
case IDM_FILE_EXIT:
SendMessage (hWnd, WM_CLOSE, 0, 0) ;
return 0 ;
case IDM_FILE_NEW:
//若之前打开的文件需要保存,
//且保存未成功或用户取消新建操作,结束消息,返回0
if (bFileChange && IDCANCEL == QuerySaveFile(hWnd, szFileTitle))
return 0 ;
SetWindowText (hWndEdit, TEXT ("\0"));
szFileName[0] = '\0';
szFileTitle[0] = '\0';
wsprintf (szWndCaption, TEXT ("%s - %s"), UNTITLED, szAppName);
SetWindowText (hWnd, szWndCaption) ;
bFileChange = FALSE ;
return 0 ;
case IDM_FILE_OPEN:
if (bFileChange && IDCANCEL == QuerySaveFile (hWnd, szFileTitle))
return 0 ;
//设置对话框结构变量ofn
ofn.hwndOwner = hWnd;
ofn.lpstrFile = szFileName;
ofn.lpstrFileTitle = szFileTitle;
ofn.Flags = OFN_HIDEREADONLY | OFN_CREATEPROMPT ;
//显示“打开”对话框
if (GetOpenFileName (&ofn))
{
//打开指定文件
hFile = CreateFile (szFileName, GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, 0, NULL);
if ((DWORD)hFile == -1)
{
MessageBox (hWnd, TEXT ("打开指定文件操作失败"),
TEXT ("文件操作演示程序"), MB_OK | MB_ICONERROR);
szFileName[0] = '\0';
szFileTitle[0] = '\0';
}
else //读取文件内容
{
iFileLength = min (GetFileSize (hFile, NULL),
(DWORD)SendMessage(hWndEdit, EM_GETLIMITTEXT, 0, 0));
lpBuffer = (LPTSTR)malloc (iFileLength+1);
ReadFile (hFile, lpBuffer, iFileLength, &dwBytes, NULL);
CloseHandle (hFile);
lpBuffer[iFileLength] = '\0';
SetWindowText (hWndEdit, lpBuffer);
free (lpBuffer);
}
}
else
{
MessageBox (hWnd, TEXT ("获取文件名失败"),
TEXT ("文件操作演示程序"), MB_OK | MB_ICONERROR);
szFileName[0] = '\0';
szFileTitle[0] = '\0';
}
wsprintf (szWndCaption, TEXT ("%s - %s"),
(szFileTitle[0] == '\0') ? UNTITLED : szFileTitle, szAppName);
SetWindowText (hWnd, szWndCaption) ;
bFileChange = FALSE ;
return 0 ;
case IDM_FILE_SAVE:
//当文件名不为“无标题”时执行保存操作,否则执行“另存为”命令
if (szFileTitle[0])
{
hFile = CreateFile (szFileName, GENERIC_WRITE, 0,
NULL, CREATE_ALWAYS, 0, NULL);
if ((DWORD)hFile == -1)
{
MessageBox (hWnd, TEXT ("打开指定文件操作失败"),
TEXT ("文件操作演示程序"), MB_OK | MB_ICONERROR);
szFileName[0] = '\0';
szFileTitle[0] = '\0';
return FALSE ;
}
else
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -