Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.06.2014, 17:53   #1
exchange
 
Регистрация: 29.06.2014
Сообщений: 4
По умолчанию Рисование в окне, Windows API, разделение программы на функции

Здравствуйте, помогите пожалуйста разобраться. Мне надо написать программку, в которой в зависимости от нажатой на клавиатуре клавиши рисуется определенная фигура, причем для рисования каждой фигуры должен быть свой .cpp файл, а в каждом таком отдельном файле должен быть свой перехват нажатой клавиши. То есть в каждом отдельном .cpp файле проекта должна быть своя процедура рисования фигуры и распознавания нажатой клавиши.
Вот мой код:
Код:
#include<windows.h>

int key=0;

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
char szProgName[]="Имя программы";

void print_icon (HDC hdc, RECT r, int icon [676], int x, int y, int k);
void main_menu();

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{
    HWND hWnd;
    MSG lpMsg;
    WNDCLASS w;

    w.lpszClassName=szProgName; //имя программы - объявлено выше
    w.hInstance=hInstance; //идентификатор текущего приложения
    w.lpfnWndProc=WndProc; //указатель на функцию окна
    w.hCursor=LoadCursor(NULL, IDC_ARROW); //загружаем курсор
    w.hIcon=0;
    w.lpszMenuName=0;
    w.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); //цвет фона окна
    w.style=CS_HREDRAW|CS_VREDRAW;
    w.cbClsExtra=0;
    w.cbWndExtra=0;

//Если не удалось зарегистрировать класс окна - выходим
    if(!RegisterClass(&w))
        return 0;

//Создадим окно в памяти, заполнив аргументы CreateWindow
    hWnd=CreateWindow(szProgName, //Имя программы
                      "Заголовок окна", //Заголовок окна
                      WS_OVERLAPPEDWINDOW, //Стиль окна - перекрывающееся
                      0, //положение окна на экране по х
                      0, //положение по у
                      350, //ширина
                      350, //высота
                      (HWND)NULL, //идентификатор родительского окна
                      (HMENU)NULL, //идентификатор меню
                      (HINSTANCE)hInstance, //идентификатор экземпляра программы
                      (HINSTANCE)NULL); //отсутствие дополнительных параметров
//Выводим окно из памяти на экран
    ShowWindow(hWnd, nCmdShow);
    //Обновим содержимое окна
    UpdateWindow(hWnd);

//Цикл обработки сообщений

    while(GetMessage(&lpMsg, NULL, 0, 0))
    {
        TranslateMessage(&lpMsg);
        DispatchMessage(&lpMsg);
    }
    return(lpMsg.wParam);
}
//Функция окна
LRESULT CALLBACK WndProc(HWND hWnd, UINT messg, WPARAM wParam, LPARAM lParam)
{
    HDC hdc; //создаём контекст устройства
    PAINTSTRUCT ps; //создаём экземпляр структуры графического вывода
    LOGFONT lf;
    HFONT hFont;
    RECT r;
    HBRUSH hBrush;
    HPEN hPen;
//Цикл обработки сообщений

    switch(messg)
    {
    case WM_KEYDOWN:
        key = wParam;
        InvalidateRect(hWnd, NULL, TRUE);
        break;
//сообщение рисования
    case WM_PAINT:
        hdc=BeginPaint(hWnd, &ps);
        //закрашиваемфон
        r.top=0;
        r.left=0;
        r.right=350;
        r.bottom=350;
        FillRect(hdc, &r, HBRUSH(CreateSolidBrush(RGB(0,0,0))));
        switch(key)
        case 13:
    {
//Создаём свой шрифт
        strcpy(lf.lfFaceName,"Arial"); //копируем в строку название шрифта
        lf.lfHeight=10;
        lf.lfItalic=0;
        lf.lfStrikeOut=0;
        lf.lfUnderline=0;
        lf.lfWidth=5;
        lf.lfWeight=70;
        lf.lfCharSet=DEFAULT_CHARSET; //значение по умолчанию
        lf.lfEscapement=0;
        SetBkMode(hdc, TRANSPARENT); //фон шрифта, задаем прозрачный
        hFont = CreateFontIndirect(&lf);
        SelectObject(hdc, hFont);
        SetTextColor(hdc, RGB(255,255,255));
        TextOut(hdc, 2,0, "Рисунок 1: Прямоугольник", 24);
//рисуем красный прямоугольник
        r.top=50;
        r.left=50;
        r.right=300;
        r.bottom=300;
        FillRect(hdc, &r, HBRUSH(CreateSolidBrush(RGB(255,0,55))));
        }
        ValidateRect(hWnd, NULL);
        EndPaint(hWnd, &ps);
        break;
//сообщение выхода - разрушение окна
    case WM_DESTROY:
        PostQuitMessage(0); //Посылаем сообщение выхода с кодом 0 - нормальное завершение
        DeleteObject(hPen);
        DeleteObject(hBrush);
        break;

    default:
        return(DefWindowProc(hWnd, messg, wParam, lParam)); //освобождаем очередь приложения от нераспознаных
    }
    return 0;
}
Эта программка при нажатии клавиши Enter рисует красный квадрат. Мне надо отрисовку этого квадрата и перехват клавиши вынести в отдельный файл, и далее по аналогии написать остальные процедуры. Подскажите, какую часть программы вынести в отдельный файл? С какой по какую строку? Начиная с switch(messg) до его конца? Получается слишком много передаваемых параметров(

Последний раз редактировалось Stilet; 29.06.2014 в 18:16.
exchange вне форума Ответить с цитированием
Старый 29.06.2014, 18:19   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Мдя...
Ну попробуй опиши все что между
Код:
hdc=BeginPaint(hWnd, &ps);
...
EndPaint(hWnd, &ps);
в отдельную функцию, а ее в отдельный файл.
Но какой в этом смысл?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.07.2014, 10:40   #3
exchange
 
Регистрация: 29.06.2014
Сообщений: 4
По умолчанию

Да, неудобно получается.. А можно как-нибудь перехват нажатия клавиши осуществить внутри
hdc=BeginPaint(hWnd, &ps);
...
EndPaint(hWnd, &ps);
и приостановить выполнение цикла до нажатия определенной клавиши?
exchange вне форума Ответить с цитированием
Старый 03.07.2014, 10:51   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Нет, так не получится.
Код рисования может вызывться много раз, например когда меняется размер окна.
waleri вне форума Ответить с цитированием
Старый 03.07.2014, 11:07   #5
exchange
 
Регистрация: 29.06.2014
Сообщений: 4
По умолчанию

Спасибо за ответ. Не посоветуете какую-нибудь простую библиотеку для рисования графических примитивов?
exchange вне форума Ответить с цитированием
Старый 03.07.2014, 12:46   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Не в курсе, но с другой стороны, если речь идет о рисовании еллипсов, прямоугольников и треугольников, WIN API должно быть выше крыши.
waleri вне форума Ответить с цитированием
Старый 04.07.2014, 19:40   #7
Zenon
Пользователь
 
Регистрация: 03.07.2014
Сообщений: 32
По умолчанию

Вместо switch-а что-то типа:

Код:
if (keyKvadrat(key))
   paintKvadrat(hdc);
else if (keyKrug(key))
   paintKrug(hdc);
else if...
Zenon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рисование на PaintBox в другом окне Zaura Общие вопросы Delphi 11 23.04.2014 18:54
Рисование на окне игры (?) Johnson Win Api 3 20.08.2012 18:51
рисование в чужом окне или на рабочем столе FanRa3 Общие вопросы Delphi 1 01.01.2012 11:16
Из программы 1.exe создаем пустой файл 2.exe. Как из программы 1 внести API функции в программу 2? X-LEV-X Общие вопросы Delphi 7 09.03.2010 08:33
Рисование в диалоговом окне (Си++) molo4nik Помощь студентам 1 06.05.2008 18:27