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

- Добавлены клавиатурные сокращения.
 - Все сообщения выдаются на русском языке.
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" #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;

View File

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

View File

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

View File

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

Binary file not shown.