Четверг, Сентябрь 24, 2020

Меню Акселератор Win32

#include<Windows.h>
#include "resource.h"               // Идентификаторы ресурсов
// Прототипы используемых функций
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam );
BOOL InitApplication(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow);
// Указатель на имя регистрируемого класса
LPCSTR szClassName = "UsgMenuAPI";        
// Указатель на заголовок окна приложения
LPCSTR szTitle = "Win32API: меню, акселераторы и управление стилем карандаша";

// Параметры карандаша
// Толщина
int PenWidth = 1;
// RGB-цвет
COLORREF PenRGB = RGB( 255, 0, 0 );
// Стиль - сплошной
int PenStyle = PS_SOLID;

// Дескриптор главного окна
HWND hWnd;
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow )                
{
    if ( !InitApplication( hInstance ) )
        return FALSE;
    if ( !InitInstance( hInstance, nCmdShow ) )
        return FALSE;  
 
    // Загрузка акселераторов
    HACCEL              hAccelTable;
    hAccelTable = LoadAccelerators(hInstance,reinterpret_cast< LPCTSTR >(IDR_MAINFRAME));
    MSG msg;        // Для очередного сообщения
    // Стандартный цикл обработки сообщений
    while ( GetMessage( &msg, NULL, 0, 0 ) )
    {
        // TranslateAccelerator( ) нужна только при использовании акселераторов
        if (!TranslateAccelerator( msg.hwnd, hAccelTable, &msg ))
        {
            TranslateMessage( &msg );
            DispatchMessage( &msg );
        }
    }
    return static_cast< int >( msg.wParam );
}

    
// ****************************************************************
// Регистрация класса главного окна
BOOL InitApplication(HINSTANCE hInstance )
{
    WNDCLASS wc;

    // Заполняем структуру класса главного окна
    wc.style         = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc   = static_cast< WNDPROC >(WndProc);
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = hInstance;
    wc.hIcon         = LoadIcon(NULL, IDI_ASTERISK);
    wc.hCursor       = LoadCursor(NULL, IDC_CROSS);
    wc.hbrBackground = reinterpret_cast< HBRUSH >(COLOR_WINDOW+1);
    wc.lpszMenuName  = MAKEINTRESOURCE(IDR_MAINFRAME);
    wc.lpszClassName = szClassName;
    return RegisterClass( &wc );
}

// ****************************************************************
// Создание главного окна приложения с графикой и меню
BOOL InitInstance(HINSTANCE hInstance,int nCmdShow)
{
    // Создание главного окна
    hWnd=CreateWindow(szClassName,szTitle,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,
        CW_USEDEFAULT,CW_USEDEFAULT, NULL,NULL,hInstance,NULL );
    if ( !hWnd )
        return FALSE;
    if ( ShowWindow( hWnd, nCmdShow ) )
        return FALSE;
    if ( !UpdateWindow( hWnd ) )
        return FALSE;
    return TRUE;
}

// ****************************************************************
// Оконная процедура главного окна
// Получает очередное сообщение и индивидуально обрабатывает его
LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam )
{
    // Дескриптор контекста устройства
    HDC                 hDC;
    PAINTSTRUCT         ps;
    
    // Обработчик сообщения - в данном случае приложение явно
    //   отвечает только на сообщения WM_DESTROY, WM_PAINT и
    //   WM_COMMAND при выборе команд меню, все остальные сообщения
    //   передаются в DefWindowProc( ) - функцию, управляющую
    //   поведением окна по умолчанию. Обработка сообщений
    //   WM_DESTROY и WM_PAINT подробно рассмотрена в проекте
    //   FrameWnd
    switch( message )
    {
    // Вывод в окно
    case WM_PAINT:
        // Получение контекста устройства
        hDC = BeginPaint( hWnd, &ps );
        if ( !hDC )
        {
            MessageBox( NULL, "Контекст устройства не получен","Ошибка 1", MB_OK );
            exit( 1 );
        }
        // Дескриптор нового карандаша
        HPEN hPen;
        // Создание нового карандаша
        hPen = CreatePen( PenStyle, PenWidth, PenRGB );
        if ( !hPen )
        {
            MessageBox( NULL, "Неверное использование CreatePen", "Ошибка 2", MB_OK );
            exit( 2 );
        }
        // Дескриптор старого карандаша
        HPEN hOldPen;
        // Включение его в контекст
        hOldPen = static_cast< HPEN >( SelectObject( hDC, hPen ) );
        if ( !hOldPen )
        {
            MessageBox( NULL, "Неверное использование SelectObject", "Ошибка 3", MB_OK );
            exit( 3 );
        }
        // Рисование двух линий
        if ( !MoveToEx( hDC, 30, 30, NULL ) )
        {
            MessageBox( NULL, "Неверное использование MoveToEx","Ошибка 4", MB_OK );
            exit( 4 );
        }
        if ( !LineTo( hDC, 30, 300 ) )
        {
            MessageBox( NULL, "Неверное использование LineTo","Ошибка 5", MB_OK );
            exit( 5 );
        }
         if ( !LineTo( hDC, 450, 300 ) )
        {
            MessageBox( NULL, "Неверное использование LineTo","Ошибка 6", MB_OK );
            exit( 6 );
        }
        // Удаление нового карандаша
        if ( !DeleteObject( hPen ) )
        {
            MessageBox( NULL, "Неверное использование DeleteObject", "Ошибка 7", MB_OK );
            exit( 7 );
        }
        // Восстанавление старого карандаша
        if ( !SelectObject( hDC, hOldPen ) )
        {
            MessageBox( NULL, "Неверное использование SelectObject", "Ошибка 8", MB_OK );
            exit( 8 );
        }
        // Освобождение контекста устройства
        if ( !EndPaint( hWnd, &ps ) )
        {
            MessageBox( NULL, "Контекст устройства не освобожден","Ошибка 8", MB_OK );
            exit( 8 );
        }
        break;
    // Обработка команд меню
    case WM_COMMAND:
        {
            switch( LOWORD( wParam ) )
            {
                
            case ID_FILE_EXIT:        // Выбрана команда "Файл-Выход"

                // Указывает системе, что сделан запрос о
                //   завершении приложения: 0 - код завершения.
                //   Вызов этой функции обычно используется в ответ
                //   на поступившее сообщение WM_DESTROY
                PostQuitMessage( 0 );        
                // Звуковой сигнал
                MessageBeep( MB_OK );                            
                break;
/*
            // Выбрана команда "Стиль карандаша-Сплошной"
            case ID_PENSTYLE_SOLID:
                PenStyle = PS_SOLID;
                // Перерисовка клиентской области окна
                InvalidateRect( hWnd, 0, 0 );
                break;
            // Выбрана команда "Стиль карандаша-Пунктир"
            case ID_PENSTYLE_DASH:
                PenStyle = PS_DASH;
                // Перерисовка клиентской области окна
                InvalidateRect( hWnd, 0, 0 );
                break;
            // Выбрана команда "Стиль карандаша-Точечный"                            
            case ID_PENSTYLE_DOT:
                PenStyle = PS_DOT;
                // Перерисовка клиентской области окна
                InvalidateRect( hWnd, 0, 0 );
                break;
                */
            }
        }
        break;

    case WM_DESTROY:
        PostQuitMessage( 0 );        
        break;

    default:
        return DefWindowProc( hWnd, message, wParam, lParam );
    }
    return 0;
}



 

НАЗАД                                                                         ДАЛЬШЕ


Back to Top