Code:
#include "resource.h"
#include <commctrl.h>
char szClassName[] = "Editor Class";
bool LoadFile(HWND hEdit, LPSTR szFileName)
{
HANDLE hFile;
bool bSuccess = false;
hFile = CreateFile(szFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, 0, 0);
if (hFile != INVALID_HANDLE_VALUE)
{
DWORD dwFileSize;
dwFileSize = GetFileSize(hFile, NULL);
if (dwFileSize != 0xFFFFFFFF)
{
LPSTR szFileText;
szFileText = (LPSTR)GlobalAlloc(GPTR, dwFileSize + 1);
if (szFileText != NULL)
{
DWORD dwRead;
if (ReadFile(hFile, szFileText, dwFileSize, &dwRead, NULL))
{
szFileText[dwFileSize] = 0;
if(SetWindowText(hEdit, szFileText))
bSuccess = TRUE;
}
GlobalFree(szFileText);
}
}
CloseHandle(hFile);
}
return bSuccess;
}
BOOL SaveFile(HWND hEdit, LPSTR pszFileName)
{
HANDLE hFile;
BOOL bSuccess = FALSE;
hFile = CreateFile(pszFileName, GENERIC_WRITE, 0, 0,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if(hFile != INVALID_HANDLE_VALUE)
{
DWORD dwTextLength;
dwTextLength = GetWindowTextLength(hEdit);
if(dwTextLength > 0)
{
LPSTR pszText;
pszText = (LPSTR)GlobalAlloc(GPTR, dwTextLength + 1);
if(pszText != NULL)
{
if(GetWindowText(hEdit, pszText, dwTextLength + 1))
{
DWORD dwWritten;
if(WriteFile(hFile, pszText, dwTextLength, &dwWritten, NULL))
bSuccess = TRUE;
}
GlobalFree(pszText);
}
}
CloseHandle(hFile);
}
return bSuccess;
}
BOOL DoFileOpenSave(HWND hwnd, BOOL bSave)
{
OPENFILENAME ofn;
char szFileName[MAX_PATH];
ZeroMemory(&ofn, sizeof(ofn));
szFileName[0] = 0;
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hwnd;
ofn.lpstrFilter = "Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0\0";
ofn.lpstrFile = szFileName;
ofn.nMaxFile = MAX_PATH;
ofn.lpstrDefExt = "txt";
if(bSave)
{
ofn.Flags = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY |
OFN_OVERWRITEPROMPT;
if(GetSaveFileName(&ofn))
{
if(!SaveFile(GetDlgItem(hwnd, IDC_EDIT_MAIN), szFileName))
{
MessageBox(hwnd, "Save file failed.", "Error",
MB_OK | MB_ICONEXCLAMATION);
return FALSE;
}
}
}
else
{
ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
if(GetOpenFileName(&ofn))
{
if(!LoadFile(GetDlgItem(hwnd, IDC_EDIT_MAIN), szFileName))
{
MessageBox(hwnd, "Load of file failed.", "Error",
MB_OK | MB_ICONEXCLAMATION);
return FALSE;
}
}
}
return TRUE;
}
LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_CREATE:
/////////////////////////////////////////////////////////////////////////////////////////////////////
//Edit Box
HFONT hfDefault;
HWND hEdit;
hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "",
WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL,
0, 0, 100, 100, hwnd, (HMENU)IDC_EDIT_MAIN, GetModuleHandle(NULL), NULL);
if(hEdit == NULL)
MessageBox(hwnd, "Could not create edit box.", "Error", MB_OK | MB_ICONERROR);
DefaultFont(IDC_EDIT_MAIN, hwnd);
/////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////
//ToolBar
HWND hToolBar;
hToolBar = CreateControl(TOOLBARCLASSNAME, NULL, 0, 0, 0, 0, IDC_TOOLBAR, hwnd);
SendMessage(hToolBar, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
///////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
//Toolbar Buttons
TBBUTTON tbb[3];
TBADDBITMAP tbab;
tbab.hInst = HINST_COMMCTRL;
tbab.nID = IDB_STD_SMALL_COLOR;
SendMessage (hToolBar, TB_ADDBITMAP, 0, (LPARAM)&tbab);
ZeroMemory(tbb, sizeof(tbb));
tbb[0].iBitmap = STD_FILENEW;
tbb[0].fsState = TBSTATE_ENABLED;
tbb[0].fsStyle = TBSTYLE_BUTTON;
tbb[0].idCommand = ID_FILE_NEW;
tbb[1].iBitmap = STD_FILEOPEN;
tbb[1].fsState = TBSTATE_ENABLED;
tbb[1].fsStyle = TBSTYLE_BUTTON;
tbb[1].idCommand = ID_FILE_OPEN;
tbb[2].iBitmap = STD_FILESAVE;
tbb[2].fsState = TBSTATE_ENABLED;
tbb[2].fsStyle = TBSTYLE_BUTTON;
tbb[2].idCommand = ID_FILE_SAVE;
SendMessage(hToolBar, TB_ADDBUTTONS, sizeof(tbb)/sizeof(TBBUTTON), (LPARAM)&tbb);
/////////////////////////////////////////////////////////////////////////////////
break;
case WM_SIZE:
RECT rcClient;
GetClientRect(hwnd, &rcClient);
hToolBar = GetDlgItem(hwnd, IDC_TOOLBAR);
SetWindowPos(hToolBar, NULL, 0, 0, rcClient.right, 0, SWP_NOZORDER);
hEdit = GetDlgItem(hwnd, IDC_EDIT_MAIN);
SetWindowPos(hEdit, NULL, 0, 27, rcClient.right, rcClient.bottom - 27, SWP_NOZORDER);
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case ID_FILE_OPEN:
DoFileOpenSave(hwnd, FALSE);
break;
case ID_FILE_SAVE:
DoFileOpenSave(hwnd, TRUE);
break;
case ID_FILE_EXIT:
PostMessage(hwnd, WM_CLOSE, 0, 0);
break;
}
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil)
{
HWND hwnd;
MSG msg;
WNDCLASSEX txtclass;
txtclass.hInstance = hInstance;
txtclass.lpszClassName = szClassName;
txtclass.lpfnWndProc = WindowProcedure;
txtclass.style = CS_DBLCLKS;
txtclass.cbSize = sizeof(WNDCLASSEX);
txtclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
txtclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
txtclass.hCursor = LoadCursor(NULL, IDC_ARROW);
txtclass.lpszMenuName = MAKEINTRESOURCE(IDR_MENU);
txtclass.cbClsExtra = 0;
txtclass.cbWndExtra = 0;
txtclass.hbrBackground = (HBRUSH) (COLOR_WINDOW+11);
if (!RegisterClassEx(&txtclass))
{
MessageBox(NULL, "Window's Registration Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK);
return 0;
}
hwnd = CreateWindowEx(
0,
szClassName,
"Dan's Text Editor",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
500,
400,
HWND_DESKTOP,
NULL,
hInstance,
NULL
);
ShowWindow(hwnd, nFunsterStil);
UpdateWindow(hwnd);
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}