diff --git a/src/DonNUEdgeDetector.rc b/src/DonNUEdgeDetector.rc index 9363c8f..d8cdd2d 100644 Binary files a/src/DonNUEdgeDetector.rc and b/src/DonNUEdgeDetector.rc differ diff --git a/src/Main.cpp b/src/Main.cpp new file mode 100644 index 0000000..7994daa --- /dev/null +++ b/src/Main.cpp @@ -0,0 +1,131 @@ +#include +#include +#include +#include "WindowClass.h" +#include "Window.h" +#include "resource.h" +#pragma comment(lib,"comctl32.lib") + + +// прототипы +LRESULT CALLBACK mainWindowProcedure(HWND, UINT, UINT, LONG); +void menuCommandSelected(HWND hWnd, UINT wParam); +void setOperatorType(HWND hWnd, UINT type); +void setEffectTypes(HWND hWnd); + +/** Состояния эффектов (включен / выключен) */ +bool effectsEnabled[EFFECTS_END - EFFECTS_START + 1]; + + +int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow) { + // Регистрация класса окна + WindowClass wClass = WindowClass(); + wClass.setToDefault(); + wClass.setInstance(hInstance); + wClass.setClassName(L"DonNUEdgeDetector"); + wClass.setMenuName(MAKEINTRESOURCE(IDR_MAINMENU)); + wClass.setWindowProcedure(mainWindowProcedure); + if (!wClass.registerClass()) return 0; + + // Создание нового окна + Window wnd = Window(); + wnd.setClassName(wClass.getClassName()); + wnd.setInstance(hInstance); + wnd.setTitle(wClass.getClassName()); + if (!wnd.createWindow()) return 0; + + // Загрузка таблицы акселераторов + HACCEL hAccel = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDR_MAINACCELERATOR)); + + // Отображение окна + ShowWindow(wnd.getWindow(), nCmdShow); + UpdateWindow(wnd.getWindow()); + DrawMenuBar(wnd.getWindow()); + + MSG msg; + while(GetMessage(&msg, NULL, 0, 0)) { + if(!TranslateAccelerator(wnd.getWindow(), hAccel, &msg)) { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + return msg.wParam; +} + +/** + * Оконная процедура. + */ +LRESULT CALLBACK mainWindowProcedure(HWND hWnd, UINT message, UINT wParam, LONG lParam) { + switch(message) { + + case WM_CREATE: + setOperatorType(hWnd, ID_OP_ROBERTS); + setEffectTypes(hWnd); + break; + + //case WM_PAINT: + // break; + + case WM_COMMAND: + menuCommandSelected(hWnd, wParam); + break; + + case WM_DESTROY: + PostQuitMessage(0); + break; + + default: + return DefWindowProc(hWnd, message, wParam, lParam); + } + return 0; +} + +/** + * Обработка события выбранного пункта меню. + */ +void menuCommandSelected(HWND hWnd, UINT wParam) { + UINT command = LOWORD(wParam); + switch(command) { + + case ID_OP_ROBERTS: + case ID_OP_PREWITT: + case ID_OP_SOBEL: + setOperatorType(hWnd, command); + break; + + case ID_SNAPSHOT: + break; + + case ID_EF_ORIGINAL: + case ID_EF_GRAYSCALE: + case ID_EF_INVERSE: + effectsEnabled[EFFECTS_END - command] = !effectsEnabled[EFFECTS_END - command]; + setEffectTypes(hWnd); + break; + + case ID_EXIT: + SendMessage(hWnd, WM_CLOSE, NULL, NULL); + break; + } +} + + +/** + * Установить тип оператора (ID_OP_ROBERTS, ID_OP_SOBEL, ID_OP_PREWITT); + */ +void setOperatorType(HWND hWnd, UINT type) { + HMENU viewMenu = GetSubMenu(GetMenu(hWnd), 1); + CheckMenuRadioItem( viewMenu, OPERATORS_START, OPERATORS_END, + type, MF_BYCOMMAND ); +} + +/** + * Установить тип эффекта (ID_EF_ORIGINAL, ID_EF_GRAYSCALE, ID_EF_INVERSE) + */ +void setEffectTypes(HWND hWnd) { + HMENU viewMenu = GetSubMenu(GetMenu(hWnd), 1); + for(int i = EFFECTS_START; i <= EFFECTS_END; i++) { + ULONG check = effectsEnabled[EFFECTS_END - i] ? MF_CHECKED : MF_UNCHECKED; + CheckMenuItem( viewMenu, i, check); + } +} \ No newline at end of file diff --git a/src/Window.cpp b/src/Window.cpp index 5b07f69..bb0f01e 100644 --- a/src/Window.cpp +++ b/src/Window.cpp @@ -1,8 +1,8 @@ #include "Window.h" /** - * Конструктор. - * Задаёт стиль Рё размеры РѕРєРЅР° РїРѕ умочанию. + * Конструктор. + * Задаёт стиль и размеры окна по умочанию. */ Window::Window() { x = CW_USEDEFAULT; @@ -13,21 +13,21 @@ Window::Window() { } /** - * Установка класса РѕРєРЅР°. + * Установка класса окна. */ void Window::setClassName(LPCWSTR className) { this->className = className; } /** - * Получение класса РѕРєРЅР°. + * Получение класса окна. */ LPCWSTR Window::getClassName() { return className; } /** - * Установка размера Рё положения РѕРєРЅР°. + * Установка размера и положения окна. */ void Window::setBounds(int x, int y, int w, int h) { this->x = x; @@ -37,30 +37,30 @@ void Window::setBounds(int x, int y, int w, int h) { } /** - * Установка дескриптора приложения. + * Установка дескриптора приложения. */ void Window::setInstance(HINSTANCE hInstance) { this->hInstance = hInstance; } /** - * Установка стиля РѕРєРЅР°. + * Установка стиля окна. */ void Window::setStyle(int style) { this->style = style; } /** - * Задание заголовка РѕРєРЅР°. + * Задание заголовка окна. */ void Window::setTitle(LPCWSTR title) { this->title = title; } /** - * Создание РѕРєРЅР°. - * Вызывается после задания параметров. - * return true - РѕРєРЅРѕ успешно создано, false - произошла ошибка. + * Создание окна. + * Вызывается после задания параметров. + * return true - окно успешно создано, false - произошла ошибка. */ bool Window::createWindow() { hWnd = CreateWindow( @@ -71,14 +71,14 @@ bool Window::createWindow() { ); if(!hWnd) { - MessageBox(NULL, L"Cannot create window", L"Error", MB_OK); + MessageBox(NULL, L"Невозможно создать окно", L"Ошибка", MB_OK); return false; } return true; } /** - * Получение дескриптора РѕРєРЅР°. + * Получение дескриптора окна. */ HWND Window::getWindow() { return this->hWnd; diff --git a/src/Window.h b/src/Window.h index 51cb4d6..dfac1b8 100644 --- a/src/Window.h +++ b/src/Window.h @@ -4,7 +4,7 @@ #include "WindowClass.h" /** - * Класс создания РѕРєРЅР° + * Класс создания окна * @author aNNiMON */ class Window { diff --git a/src/WindowClass.cpp b/src/WindowClass.cpp index e8b21e9..bc38dfc 100644 --- a/src/WindowClass.cpp +++ b/src/WindowClass.cpp @@ -1,8 +1,8 @@ #include "WindowClass.h" /** - * Конструктор. - * Задаёт параметры РїРѕ умочанию. + * Конструктор. + * Задаёт параметры по умочанию. */ WindowClass::WindowClass() { WndClass.cbClsExtra = 0; @@ -11,100 +11,100 @@ WindowClass::WindowClass() { } /** - * Регистрация класса РѕРєРЅР°. - * return true - класс зарегистрирован, false - произошла ошибка. + * Регистрация класса окна. + * return true - класс зарегистрирован, false - произошла ошибка. */ bool WindowClass::registerClass() { if(!RegisterClass(&WndClass)) { - MessageBox(NULL, L"Cannot register class", L"Error", MB_OK); + MessageBox(NULL, L"Невозможно зарегистрировать класс", L"Ошибка", MB_OK); return false; } return true; } /** - * Задать параметры РїРѕ умочанию. + * Задать параметры по умочанию. */ void WindowClass::setToDefault() { setStyle( CS_HREDRAW | CS_VREDRAW ); setIconType(IDI_APPLICATION); setCursorType(IDC_ARROW); setBackgroundBrushColor(WHITE_BRUSH); - setMenuName(L"MyMenu"); + setMenuName(L"MainMenu"); } /** - * Установка цвета кисти для фона РѕРєРЅР°. + * Установка цвета кисти для фона окна. */ void WindowClass::setBackgroundBrushColor(int color) { WndClass.hbrBackground = (HBRUSH) GetStockObject(color); } /** - * Установка имени класса. + * Установка имени класса. */ void WindowClass::setClassName(LPCWSTR className) { WndClass.lpszClassName = className; } /** - * Установка РєСѓСЂСЃРѕСЂР°. + * Установка курсора. */ void WindowClass::setCursor(HCURSOR hCursor) { WndClass.hCursor = hCursor; } /** - * Загрузка Рё установка РєСѓСЂСЃРѕСЂР° РїРѕ его типу. + * Загрузка и установка курсора по его типу. */ void WindowClass::setCursorType(LPCWSTR cursorType) { setCursor( LoadCursor(NULL, cursorType) ); } /** - * Установка РёРєРѕРЅРєРё. + * Установка иконки. */ void WindowClass::setIcon(HICON hIcon) { WndClass.hIcon = hIcon; } /** - * Загрузка Рё установка РёРєРѕРЅРєРё РїРѕ её типу. + * Загрузка и установка иконки по её типу. */ void WindowClass::setIconType(LPCWSTR iconType) { setIcon( LoadIcon(NULL, iconType) ); } /** - * Установка дескриптора приложения. + * Установка дескриптора приложения. */ void WindowClass::setInstance(HINSTANCE hInstance) { WndClass.hInstance = hInstance; } /** - * Задать РёРјСЏ меню. + * Задать имя меню. */ void WindowClass::setMenuName(LPCWSTR menuName) { WndClass.lpszMenuName = menuName; } /** - * Установка стиля. + * Установка стиля. */ void WindowClass::setStyle(int style) { WndClass.style = style; } /** - * Задание РѕРєРѕРЅРЅРѕР№ процедуры. + * Задание оконной процедуры. */ void WindowClass::setWindowProcedure(WNDPROC procedure) { WndClass.lpfnWndProc = procedure; } /** - * Получить РёРјСЏ класса. + * Получить имя класса. */ LPCWSTR WindowClass::getClassName() { return WndClass.lpszClassName; diff --git a/src/WindowClass.h b/src/WindowClass.h index e4044b9..648c25b 100644 --- a/src/WindowClass.h +++ b/src/WindowClass.h @@ -3,7 +3,7 @@ #include /** - * Класс регистрации WNDCLASS + * Класс регистрации WNDCLASS * @author aNNiMON */ class WindowClass { diff --git a/src/resource.h b/src/resource.h index 8e8d45b..10c454e 100644 Binary files a/src/resource.h and b/src/resource.h differ