我正在创建一个记事本应用程序,我已经做了基本的东西(打开文件,保存文件,写入文件)。我现在试图添加一个单词替换功能,就像在MS WORD中找到输入的单词,并用新单词替换所有出现的单词。下面是我的代码。
#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#define FILE_MENU_EXIT 2
#define FILE_MENU_BUILD 3
#define FILe_MENU_OPEN 4
#define FILE_MENU_SAVE 5
#define SEARCH_MENU_REPLACE 6
HMENU hMenu;
HMENU hDevMenu;
HWND hEdit,hCurrentPath;
HWND hOldWord,hNewWord;
int messagebox_id;
void replacerDialog(HINSTANCE);
void StillUnderConst();
void AddMenu(HWND);
void AddControls(HWND);
void AddDialogButton(HWND);
LRESULT CALLBACK WindowProcedure(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst , LPSTR args, int ncmdshow)
{
WNDCLASSW wc = {0};
wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
wc.hCursor = LoadCursor(NULL,IDC_ARROW);
wc.hInstance = hInst;
wc.lpszClassName = L"mywindowclass";
wc.lpfnWndProc = WindowProcedure;
if(!RegisterClassW(&wc))
return -1;
replacerDialog(hInst);
CreateWindowW(L"mywindowclass",L"Note Book",WS_VISIBLE|WS_MINIMIZEBOX|WS_SYSMENU,50,50,1000,650,NULL,NULL,NULL,NULL);
MSG msg = {0};
while(GetMessage(&msg,NULL,NULL,NULL))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
void display_file(char* path)
{
FILE *file;
//this function helps us open and access the file passed in
file = fopen(path,"rb");
//this function helps as move to certain parts of the file thats why its a file pointer
fseek(file,0,SEEK_END);
//the ftell() function retuurn an integer type whic is stored in a var so that the file can later be read
//it is a needed to have the file size to be able to read fromt the file thats why we went for its size
int _size = ftell(file);
//this takes us back to the beginning of he file
rewind(file);
//this is thevar in which the files data will be kept
char *data = new char[_size+1];
//the fread function helps us to read from of specified file
//fread function requires us to know the file size to be able to read from it
fread(data,_size,1,file);
data[_size] ='\0';
SetWindowText(hEdit,data);
fclose(file);
}
void open_file(HWND hWnd)
{
OPENFILENAME ofn;
ZeroMemory(&ofn,sizeof(OPENFILENAME));
char file_name[100];
//the memory allocated to the the ofn struct
ofn.lStructSize = (sizeof(OPENFILENAME));
//the owner of the dialog
ofn.hwndOwner = hWnd;
//the path of the file being open
ofn.lpstrFile = file_name;
ofn.lpstrFile[0] = '\0';
//the max length being allocated to the path
ofn.nMaxFile = 100;
ofn.lpstrFilter = "All file\0*.*\0Text files\0*.txt\0C++ files\0*.cpp\0";
ofn.nFilterIndex = 1;
//creates an openfile dialog based on the kind of structure passed in as an argument
GetOpenFileName(&ofn);
SetWindowText(hCurrentPath,ofn.lpstrFile);
// MessageBox(NULL,ofn.lpstrFile,NULL,MB_OK);
display_file(ofn.lpstrFile);
}
void write_file(char* path)
{
FILE *file;
//this function helps us open and access the file passed in
file = fopen(path,"w");
int _size = GetWindowTextLength(hEdit);
char *data = new char[_size+1];
GetWindowText(hEdit,data,_size+1);
fwrite(data,_size+1,1,file);
fclose(file);
}
void save_file(HWND hWnd)
{
OPENFILENAME ofn;
ZeroMemory(&ofn,sizeof(OPENFILENAME));
char file_name[100];
//the memory allocated to the the ofn struct
ofn.lStructSize = (sizeof(OPENFILENAME));
//the owner of the dialog
ofn.hwndOwner = hWnd;
//the path of the file being open
ofn.lpstrFile = file_name;
ofn.lpstrFile[0] = '\0';
//the max length being allocated to the path
ofn.nMaxFile = 100;
ofn.lpstrFilter = "All file\0*.*\0Text files\0*.txt\0C++ files\0*.cpp\0";
ofn.nFilterIndex = 1;
//creates an openfile dialog based on the kind of structure passed in as an argument
GetSaveFileName(&ofn);
write_file(ofn.lpstrFile);
}
LRESULT CALLBACK DialogProcedure(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp)
{
switch(msg)
{
case WM_CREATE:
AddDialogButton(hWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd,msg,wp,lp);
}
return 0;
}
void replacerDialog(HINSTANCE hInst)
{
WNDCLASSW dialog = {0};
dialog.hbrBackground = (HBRUSH)COLOR_WINDOW;
dialog.hCursor = LoadCursor(NULL,IDC_ARROW);
dialog.hInstance = hInst;
dialog.lpszClassName = L"mywindowdialog";
dialog.lpfnWndProc = DialogProcedure;
RegisterClassW(&dialog);
}
void displayDialog(HWND hWnd)
{
CreateWindowW(L"mywindowdialog",L"Replacer",WS_VISIBLE|WS_MINIMIZEBOX|WS_SYSMENU,50,50,300,300,hWnd,NULL,NULL,NULL);
}
void replacer(HWND hWnd)
{
char oword[100];
char nword[100];
wchar_t data[100000];
GetWindowText(hOldWord,oword,100);
GetWindowText(hNewWord,nword,100);
GetWindowText(hEdit,data,100000);
size_t startpos = data.find(oword);
data.replace(startpos,oword.length(),nword);
}
void AddDialogButton(HWND hWnd)
{
CreateWindowW(L"Static",L"Please enter the old word:",WS_CHILD|WS_VISIBLE,2,2,250,25,hWnd,NULL,NULL,NULL);
hOldWord = CreateWindowW(L"Edit",L"",WS_CHILD|WS_VISIBLE|WS_BORDER,10,20,250,30,hWnd,NULL,NULL,NULL);
CreateWindowW(L"Static",L"Please enter the new word:",WS_CHILD|WS_VISIBLE,2,100,250,25,hWnd,NULL,NULL,NULL);
hNewWord = CreateWindowW(L"Edit",L"",WS_CHILD|WS_VISIBLE|WS_BORDER,10,125,250,30,hWnd,NULL,NULL,NULL);
CreateWindowW(L"Button",L"Replace",WS_VISIBLE|WS_CHILD,220,220,70,40,hWnd,NULL,NULL,NULL);
}
LRESULT CALLBACK WindowProcedure(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp)
{
switch(msg)
{
case WM_KEYDOWN:
if (wp == VK_ESCAPE)
{
MessageBoxW(NULL,L"You just left clicked", NULL,MB_OK);
}
//The WM_COMMAND is sent to the windowproc when a button or menu is clicked
case WM_COMMAND:
//WPARAM is an argument that represents the IDs of menus and button
switch(wp)
{
case SEARCH_MENU_REPLACE:
displayDialog(hWnd);
break;
case FILE_MENU_SAVE:
save_file(hWnd);
break;
case FILe_MENU_OPEN:
open_file(hWnd);
break;
case FILE_MENU_EXIT:
messagebox_id = MessageBoxW(NULL,L"Are you sure?",L"Attention",MB_YESNO|MB_ICONEXCLAMATION);
if(messagebox_id == IDYES)
{
DestroyWindow(hWnd);
}
break;
}
break;
//WM_CREATE function is called when evr the window is created ,this is to initiate all of the components such as buttons and menus
case WM_CREATE:
AddControls(hWnd);
AddMenu(hWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProcW(hWnd,msg,wp,lp);
}
}
void AddMenu(HWND hWnd)
{
hMenu = CreateMenu();
HMENU hFileMEnu = CreateMenu();
HMENU hSearchMenu =CreateMenu();
AppendMenu(hMenu,MF_POPUP,(UINT_PTR)hFileMEnu,"FILE");
AppendMenu(hMenu,MF_STRING,NULL,"EDIT");
AppendMenu(hMenu,MF_STRING,NULL,"VIEW");
AppendMenu(hMenu,MF_POPUP,(UINT_PTR)hSearchMenu,"SEARCH");
AppendMenu(hMenu,MF_STRING,(UINT_PTR)FILE_MENU_BUILD,"BUILD");
AppendMenu(hMenu,MF_STRING,NULL,"HELP");
//sub menus under the file menu
AppendMenu(hFileMEnu,MF_STRING,NULL,"NEW");
AppendMenu(hFileMEnu,MF_STRING,(UINT_PTR)FILe_MENU_OPEN,"OPEN");
AppendMenu(hFileMEnu,MF_STRING,(UINT_PTR)FILE_MENU_SAVE,"SAVE");
AppendMenu(hFileMEnu,MF_STRING,FILE_MENU_EXIT,"EXIT");
AppendMenu(hSearchMenu,MF_STRING,NULL,"FIND");
AppendMenu(hSearchMenu,MF_STRING,(UINT_PTR)SEARCH_MENU_REPLACE,"REPLACE");
AppendMenu(hSearchMenu,MF_STRING,NULL,"GO TO");
//this is used to declare where and what menu is to cretaed
//SetMenu(handler(usually window handler),what menu is being set);
SetMenu(hWnd,hMenu);
}
void AddControls(HWND hWnd)
{
hCurrentPath = CreateWindowW(L"Static",NULL,WS_CHILD|WS_VISIBLE|WS_BORDER,750,2,200,20,hWnd,NULL,NULL,NULL);
hEdit = CreateWindowW(L"Edit",NULL,WS_CHILD|WS_VISIBLE|WS_BORDER|WS_VSCROLL|ES_MULTILINE,5,25,980,550,hWnd,NULL,NULL,NULL);
}
我试着用find()
函数找到要替换的单词的起始位置,然后用replace()
函数用新单词替换旧单词,但得到的都是错误。
void replacer()
{
char oword[100];
char nword[100];
wchar_t data[100000];
GetWindowText(hOldWord,oword,100);
GetWindowText(hNewWord,nword,100);
GetWindowText(hEdit,data,100000);
size_t startpos = data.find(oword);
data.replace(startpos,oword.length(),nword);
}
1条答案
按热度按时间0yg35tkg1#
我修改了代码,它运行良好,如下所示: