![](/img/trans.png)
[英]Implementing Globalization / Multilingual feature in win32 API application
[英]Is there a better way to implement a word replacement feature in the Win32 API?
我正在創建一個記事本應用程序,我已經完成了基本的工作(打開文件、保存文件、寫入文件)。 我現在正在嘗試添加一個單詞替換功能,就像 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()
function 找到要替換的單詞的起始 position,然后使用replace()
function 將舊單詞替換為新單詞,但得到的都是錯誤。 下面是替換器的塊。
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);
}
void replacer(HWND hWnd)
{
char nword[100];
std::string data;
std::string oword;
GetWindowText(hOldWord, (LPSTR)oword.c_str(), 100);
GetWindowText(hNewWord, nword, 100);
GetWindowText(hEdit, (LPSTR)data.c_str(), 100000);
size_t startpos = data.find(oword);
data.replace(startpos, oword.length(), nword);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.