Первая рабочая версия каркаса окна.

- Добавлены клавиатурные сокращения.
 - Все сообщения выдаются на русском языке.
This commit is contained in:
Victor 2012-04-04 19:53:48 +03:00
parent 871ea8e728
commit 8d6f2fa865
7 changed files with 164 additions and 33 deletions

Binary file not shown.

131
src/Main.cpp Normal file
View 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);
}
}

View File

@ -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;

View File

@ -4,7 +4,7 @@
#include "WindowClass.h"
/**
* Класс создания окна
* Класс создания окна
* @author aNNiMON
*/
class Window {

View File

@ -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;

View File

@ -3,7 +3,7 @@
#include <windows.h>
/**
* Класс регистрации WNDCLASS
* Класс регистрации WNDCLASS
* @author aNNiMON
*/
class WindowClass {

Binary file not shown.