Первая рабочая версия каркаса окна.
- Добавлены клавиатурные сокращения. - Все сообщения выдаются на русском языке.
This commit is contained in:
parent
871ea8e728
commit
8d6f2fa865
Binary file not shown.
131
src/Main.cpp
Normal file
131
src/Main.cpp
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
#include <windows.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <commctrl.h>
|
||||||
|
#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);
|
||||||
|
}
|
||||||
|
}
|
@ -1,8 +1,8 @@
|
|||||||
#include "Window.h"
|
#include "Window.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Конструктор.
|
* Конструктор.
|
||||||
* Задаёт стиль и размеры окна по умочанию.
|
* Задаёт стиль и размеры окна по умочанию.
|
||||||
*/
|
*/
|
||||||
Window::Window() {
|
Window::Window() {
|
||||||
x = CW_USEDEFAULT;
|
x = CW_USEDEFAULT;
|
||||||
@ -13,21 +13,21 @@ Window::Window() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Установка класса окна.
|
* Установка класса окна.
|
||||||
*/
|
*/
|
||||||
void Window::setClassName(LPCWSTR className) {
|
void Window::setClassName(LPCWSTR className) {
|
||||||
this->className = className;
|
this->className = className;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Получение класса окна.
|
* Получение класса окна.
|
||||||
*/
|
*/
|
||||||
LPCWSTR Window::getClassName() {
|
LPCWSTR Window::getClassName() {
|
||||||
return className;
|
return className;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Установка размера и положения окна.
|
* Установка размера и положения окна.
|
||||||
*/
|
*/
|
||||||
void Window::setBounds(int x, int y, int w, int h) {
|
void Window::setBounds(int x, int y, int w, int h) {
|
||||||
this->x = x;
|
this->x = x;
|
||||||
@ -37,30 +37,30 @@ void Window::setBounds(int x, int y, int w, int h) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Установка дескриптора приложения.
|
* Установка дескриптора приложения.
|
||||||
*/
|
*/
|
||||||
void Window::setInstance(HINSTANCE hInstance) {
|
void Window::setInstance(HINSTANCE hInstance) {
|
||||||
this->hInstance = hInstance;
|
this->hInstance = hInstance;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Установка стиля окна.
|
* Установка стиля окна.
|
||||||
*/
|
*/
|
||||||
void Window::setStyle(int style) {
|
void Window::setStyle(int style) {
|
||||||
this->style = style;
|
this->style = style;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Задание заголовка окна.
|
* Задание заголовка окна.
|
||||||
*/
|
*/
|
||||||
void Window::setTitle(LPCWSTR title) {
|
void Window::setTitle(LPCWSTR title) {
|
||||||
this->title = title;
|
this->title = title;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Создание окна.
|
* Создание окна.
|
||||||
* Вызывается после задания параметров.
|
* Вызывается после задания параметров.
|
||||||
* return true - окно успешно создано, false - произошла ошибка.
|
* return true - окно успешно создано, false - произошла ошибка.
|
||||||
*/
|
*/
|
||||||
bool Window::createWindow() {
|
bool Window::createWindow() {
|
||||||
hWnd = CreateWindow(
|
hWnd = CreateWindow(
|
||||||
@ -71,14 +71,14 @@ bool Window::createWindow() {
|
|||||||
);
|
);
|
||||||
|
|
||||||
if(!hWnd) {
|
if(!hWnd) {
|
||||||
MessageBox(NULL, L"Cannot create window", L"Error", MB_OK);
|
MessageBox(NULL, L"Невозможно создать окно", L"Ошибка", MB_OK);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Получение дескриптора окна.
|
* Получение дескриптора окна.
|
||||||
*/
|
*/
|
||||||
HWND Window::getWindow() {
|
HWND Window::getWindow() {
|
||||||
return this->hWnd;
|
return this->hWnd;
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
#include "WindowClass.h"
|
#include "WindowClass.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Класс создания окна
|
* Класс создания окна
|
||||||
* @author aNNiMON
|
* @author aNNiMON
|
||||||
*/
|
*/
|
||||||
class Window {
|
class Window {
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
#include "WindowClass.h"
|
#include "WindowClass.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Конструктор.
|
* Конструктор.
|
||||||
* Задаёт параметры по умочанию.
|
* Задаёт параметры по умочанию.
|
||||||
*/
|
*/
|
||||||
WindowClass::WindowClass() {
|
WindowClass::WindowClass() {
|
||||||
WndClass.cbClsExtra = 0;
|
WndClass.cbClsExtra = 0;
|
||||||
@ -11,100 +11,100 @@ WindowClass::WindowClass() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Регистрация класса окна.
|
* Регистрация класса окна.
|
||||||
* return true - класс зарегистрирован, false - произошла ошибка.
|
* return true - класс зарегистрирован, false - произошла ошибка.
|
||||||
*/
|
*/
|
||||||
bool WindowClass::registerClass() {
|
bool WindowClass::registerClass() {
|
||||||
if(!RegisterClass(&WndClass)) {
|
if(!RegisterClass(&WndClass)) {
|
||||||
MessageBox(NULL, L"Cannot register class", L"Error", MB_OK);
|
MessageBox(NULL, L"Невозможно зарегистрировать класс", L"Ошибка", MB_OK);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Задать параметры по умочанию.
|
* Задать параметры по умочанию.
|
||||||
*/
|
*/
|
||||||
void WindowClass::setToDefault() {
|
void WindowClass::setToDefault() {
|
||||||
setStyle( CS_HREDRAW | CS_VREDRAW );
|
setStyle( CS_HREDRAW | CS_VREDRAW );
|
||||||
setIconType(IDI_APPLICATION);
|
setIconType(IDI_APPLICATION);
|
||||||
setCursorType(IDC_ARROW);
|
setCursorType(IDC_ARROW);
|
||||||
setBackgroundBrushColor(WHITE_BRUSH);
|
setBackgroundBrushColor(WHITE_BRUSH);
|
||||||
setMenuName(L"MyMenu");
|
setMenuName(L"MainMenu");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Установка цвета кисти для фона окна.
|
* Установка цвета кисти для фона окна.
|
||||||
*/
|
*/
|
||||||
void WindowClass::setBackgroundBrushColor(int color) {
|
void WindowClass::setBackgroundBrushColor(int color) {
|
||||||
WndClass.hbrBackground = (HBRUSH) GetStockObject(color);
|
WndClass.hbrBackground = (HBRUSH) GetStockObject(color);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Установка имени класса.
|
* Установка имени класса.
|
||||||
*/
|
*/
|
||||||
void WindowClass::setClassName(LPCWSTR className) {
|
void WindowClass::setClassName(LPCWSTR className) {
|
||||||
WndClass.lpszClassName = className;
|
WndClass.lpszClassName = className;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Установка курсора.
|
* Установка курсора.
|
||||||
*/
|
*/
|
||||||
void WindowClass::setCursor(HCURSOR hCursor) {
|
void WindowClass::setCursor(HCURSOR hCursor) {
|
||||||
WndClass.hCursor = hCursor;
|
WndClass.hCursor = hCursor;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Загрузка и установка курсора по его типу.
|
* Загрузка и установка курсора по его типу.
|
||||||
*/
|
*/
|
||||||
void WindowClass::setCursorType(LPCWSTR cursorType) {
|
void WindowClass::setCursorType(LPCWSTR cursorType) {
|
||||||
setCursor( LoadCursor(NULL, cursorType) );
|
setCursor( LoadCursor(NULL, cursorType) );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Установка иконки.
|
* Установка иконки.
|
||||||
*/
|
*/
|
||||||
void WindowClass::setIcon(HICON hIcon) {
|
void WindowClass::setIcon(HICON hIcon) {
|
||||||
WndClass.hIcon = hIcon;
|
WndClass.hIcon = hIcon;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Загрузка и установка иконки по её типу.
|
* Загрузка и установка иконки по её типу.
|
||||||
*/
|
*/
|
||||||
void WindowClass::setIconType(LPCWSTR iconType) {
|
void WindowClass::setIconType(LPCWSTR iconType) {
|
||||||
setIcon( LoadIcon(NULL, iconType) );
|
setIcon( LoadIcon(NULL, iconType) );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Установка дескриптора приложения.
|
* Установка дескриптора приложения.
|
||||||
*/
|
*/
|
||||||
void WindowClass::setInstance(HINSTANCE hInstance) {
|
void WindowClass::setInstance(HINSTANCE hInstance) {
|
||||||
WndClass.hInstance = hInstance;
|
WndClass.hInstance = hInstance;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Задать имя меню.
|
* Задать имя меню.
|
||||||
*/
|
*/
|
||||||
void WindowClass::setMenuName(LPCWSTR menuName) {
|
void WindowClass::setMenuName(LPCWSTR menuName) {
|
||||||
WndClass.lpszMenuName = menuName;
|
WndClass.lpszMenuName = menuName;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Установка стиля.
|
* Установка стиля.
|
||||||
*/
|
*/
|
||||||
void WindowClass::setStyle(int style) {
|
void WindowClass::setStyle(int style) {
|
||||||
WndClass.style = style;
|
WndClass.style = style;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Задание оконной процедуры.
|
* Задание оконной процедуры.
|
||||||
*/
|
*/
|
||||||
void WindowClass::setWindowProcedure(WNDPROC procedure) {
|
void WindowClass::setWindowProcedure(WNDPROC procedure) {
|
||||||
WndClass.lpfnWndProc = procedure;
|
WndClass.lpfnWndProc = procedure;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Получить имя класса.
|
* Получить имя класса.
|
||||||
*/
|
*/
|
||||||
LPCWSTR WindowClass::getClassName() {
|
LPCWSTR WindowClass::getClassName() {
|
||||||
return WndClass.lpszClassName;
|
return WndClass.lpszClassName;
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Класс регистрации WNDCLASS
|
* Класс регистрации WNDCLASS
|
||||||
* @author aNNiMON
|
* @author aNNiMON
|
||||||
*/
|
*/
|
||||||
class WindowClass {
|
class WindowClass {
|
||||||
|
BIN
src/resource.h
BIN
src/resource.h
Binary file not shown.
Loading…
Reference in New Issue
Block a user