Вторник, Май 26, 2020

Дочернее окно Win32

#include<Windows.h>
#define BTN1 1
#define BTN2 2
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParan,LPARAM lParam);
LRESULT CALLBACK WndProc1(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam );
BOOL InitApplication(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE hInstance,int nCmdShow);
LPCSTR szClassName="MainWin";
LPCSTR szTitle="Изучаю Windows";
HINSTANCE hInst;
// Дескриптор главного окна Windows
HWND hWnd;
HWND hWndButton1;
HWND hWndButton2;

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstanece,LPSTR lpCmdLine,int nCmdShow)
{
    hInst=hInstance;
    if(!hPrevInstanece)
    {
        if(!InitApplication(hInstance))
            return FALSE;
    }
    if(!InitInstance(hInstance,nCmdShow))
        return FALSE;
    MSG msg;
    while(GetMessage(&msg,NULL,0,0))
    {
        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  = NULL;
    wc.lpszClassName = szClassName;
    if ( !RegisterClass( &wc ) )
        return FALSE;
    // Заполняем структуру класса дочернего окна
    wc.style         = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc   = static_cast< WNDPROC >( WndProc1 );
    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  = NULL;
    wc.lpszClassName = "WndAPI";

    // Регистрируем класс дочернего окна
    return RegisterClass( &wc );

    // !!! Класс окна для кнопок ("BUTTON") является стандартным и
    //   не требует специальной регистрации !!!
}
BOOL InitInstance(HINSTANCE hInstance,int nCmdShow)
{
    hWnd=CreateWindow(szClassName,szTitle,WS_VISIBLE|WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,
        CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
    if(!hWnd)
        return FALSE;
    hWndButton1=CreateWindow("BUTTON","Новое",WS_VISIBLE|WS_CHILD,
        210,20,80,20,hWnd,reinterpret_cast<HMENU>(BTN1),hInstance,NULL);
    if(!hWndButton1)
    {
        MessageBox(NULL,"Кнопка не создана","Ошибка 1",MB_OK);
        exit(1);
    }
    // Создание кнопки "Выход"
    hWndButton2 = CreateWindow("BUTTON","Выход",WS_VISIBLE | WS_CHILD,210,
        50,80,20,hWnd,reinterpret_cast< HMENU >( BTN2 ),hInstance,NULL );
    if ( !hWndButton2 )
    {
        MessageBox( NULL, "Кнопка \"Выход\"не создана", "Ошибка 2",MB_OK );
        exit( 2 );
    }
    return TRUE;
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
    HDC hDC;
    PAINTSTRUCT ps;
    switch(message)
    {
    case WM_PAINT:
        hDC=BeginPaint(hwnd,&ps);
        if(!hDC)
        {
            MessageBox(NULL,"Контекст не получен","Ошибка",MB_OK);
            exit(2);
        }
        if ( !TextOut( hDC, 0, 0, "Пример вывода текста в окно",27 ) )
        {
            MessageBox( NULL, "Неверное использование TextOut","Ошибка 4", MB_OK );
            exit( 4 );
        }

        if ( !EndPaint( hwnd, &ps ) )
        {
            MessageBox( NULL, "Контекст устройства не освобожден","Ошибка 13", MB_OK );
            exit( 13 );
        }
        break;
    case WM_KEYDOWN :
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    case WM_COMMAND:
        switch(LOWORD(wParam))
        {
        case BTN1:
            if ( !MessageBeep( MB_OK ) )
            {
                MessageBox( NULL, "Ошибка MessageBeep","Ошибка 6", MB_OK );
                exit( 6 );
            }
            // Дескриптор дочернего окна
            HWND    hWnd3;
            // Создание дочернего окна
            hWnd3 = CreateWindow("WndAPI","Дочернее окно",WS_VISIBLE | WS_OVERLAPPEDWINDOW,
                CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
                hWnd,NULL,hInst, NULL );
            if ( !hWnd3 )
            {
                MessageBox( NULL, "Дочернее окно не создано","Ошибка 7", MB_OK );
                exit( 7 );
            }
            break;
        case BTN2:
            PostQuitMessage( 0 );
            break;
        }
        break;


    default:
        return DefWindowProc(hwnd,message,wParam,lParam);
    }
    return 0;
}
// ****************************************************************
// Оконная процедура дочернего окна.// Получает очередное сообщение и индивидуально обрабатывает его
LRESULT CALLBACK WndProc1(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam )
{
    switch( message )
    {
    case WM_PAINT:
        HDC             hDC;
        PAINTSTRUCT     ps;
        hDC = BeginPaint( hwnd, &ps );
        if ( !hDC )
        {
            MessageBox( NULL, "Контекст устройства не получен","Ошибка 8", MB_OK );
            exit( 8 );
        }
        if ( !TextOut( hDC, 130, 0,"Обработка сообщения WM_PAINT в дочернем окне", 44 ) )
        {
            MessageBox( NULL, "Неверное использование TextOut","Ошибка 9", MB_OK );
            exit( 9 );
        }
        if ( !EndPaint( hwnd, &ps ) )
        {
            MessageBox( NULL, "Контекст устройства не освобожден","Ошибка 10", MB_OK );
            exit( 10 );
        }
        break;
    default:
        // Обработка сообщения по умолчанию
        return DefWindowProc( hwnd, message, wParam, lParam );
    }
    return 0;
}



 

НАЗАД                                                                         ДАЛЬШЕ


Back to Top