Тема: WinAPI
Показать сообщение отдельно
Старый 17.06.2016, 01:46   #1 (permalink)
maleke
Новичок
 
Регистрация: 17.06.2016
Сообщений: 1
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию WinAPI

Здравствуйте! Необходимо реализовать изменение цвета текста "Введите число" и "Квадрат числа" таким образом, чтобы изначально они были рандомного цвета, а при вычислении квадрата числа (нажатии на кнопку) менялись на черный.

Код:
#include <windows.h> 
#include <stdio.h>
#include <math.h> 

static UINT ID_button = 1; // кнопка выхода из приложения
static HWND hWndButton; //
static UINT ID_edit = 3; // редактор для ввода числа
static HWND hWndEdit; //
static UINT ID_button2 = 5; // кнопка команды для вычисления квадрата числа
static HWND hWndButton2; //
static HWND hWndEdit_2; // редактор для вывода квадрата числа
static HWND hWndEdit_3;
static UINT ID_edit_2 = 4; //
static UINT ID_edit_3 = 10; //
static UINT ID_STATIC = 6;
static UINT ID_STATIC2 = 7;
static UINT ID_STATIC3 = 8;

int num=0;

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); 
LRESULT CALLBACK EditProc(HWND, UINT, WPARAM, LPARAM); 

HINSTANCE hInstance;
HWND hEdit;
WNDPROC wndEditProc;


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR IpCmdLine, int nCmdShow) 
{ 
    HWND hMainWnd; 
    HFONT hFont=CreateFont (15, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE, ANSI_CHARSET, \
          OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, \
          DEFAULT_PITCH | FF_SWISS, NULL); 
    char szClassName[] = "MyClass"; 
    MSG msg; 
    WNDCLASSEX wc;

    // Заполняем структуру класса окна 
    wc.cbSize = sizeof(wc); 
    wc.style = CS_HREDRAW|CS_VREDRAW; 
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0; 
    wc.cbWndExtra = 0; 
    wc.hInstance = hInstance; 
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); 
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    //wc.hCursor = GetCursor();
    wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
    wc.lpszMenuName = NULL; 
    wc.lpszClassName = szClassName; 
    wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); 

    // Регистрируем класс окна 
    if (!RegisterClassEx(&wc)) { 
        MessageBox(NULL, "Не удалось зарегистрировать класс окна", "Ошибка", 0); 
        return 0; 
    }

    // Создаем основное окно приложения 
    hMainWnd = CreateWindow(szClassName, "Использование элементов управления", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, 500, 400, (HWND)NULL, (HMENU)NULL, (HINSTANCE)hInstance, NULL ); 
    if (!hMainWnd) { 
        MessageBox(NULL, "Не удалось создать окно приложения", "Ошибка", 0); 
        return 0; 
    }

    // Показываем наше окно 
    ShowWindow(hMainWnd, nCmdShow); 

    // Выполняем цикл обработки сообщений до закрытия приложения 
    while (GetMessage(&msg, NULL, 0, 0)) { 
        TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    }

    return msg.wParam; 
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 

    /*HDC hDC; 
    RECT rect; 
    PAINTSTRUCT ps;
    */
    switch (uMsg) 
    {
            case WM_CTLCOLORSTATIC:
            SetTextColor((HDC)wParam, (RGB(rand()%256, rand()%256, rand()%256)));
            SetBkMode((HDC)wParam, TRANSPARENT);
            return (LONG)CreateSolidBrush(GetSysColor(COLOR_3DFACE));
    
        case WM_CREATE:
            CreateWindow(TEXT("static"), "Введите число: ", WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|ES_LEFT,
                30, 22, 110, 25,
                hWnd, (HMENU)ID_STATIC, hInstance, NULL);

            CreateWindow(TEXT("static"), "Квадрат числа= ", WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|ES_LEFT,
                30, 182, 110, 25,
                hWnd, (HMENU)ID_STATIC2, hInstance, NULL);
                
            hWndEdit = CreateWindow("edit", NULL, WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_BORDER|ES_LEFT,
                150, 20, 50, 25,
                hWnd, (HMENU)ID_edit, hInstance, NULL);

            hWndEdit_2 = CreateWindow("edit", NULL, WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_BORDER|ES_LEFT,
                150, 182, 150, 25,
                hWnd, (HMENU)ID_edit_2, hInstance, NULL);

            hWndButton2 = CreateWindow("button", "Найти квадрат числа", WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|BS_PUSHBUTTON,
                100, 100, 300, 25,
                hWnd, (HMENU)ID_button2, hInstance, NULL);

            hWndButton = CreateWindow("button", "Exit", WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|BS_PUSHBUTTON,
                100, 280, 50, 25,
                hWnd, (HMENU)ID_button, hInstance, NULL);

            wndEditProc = (WNDPROC)GetWindowLongPtr(hWndEdit, GWLP_WNDPROC);
            SetWindowLongPtr(hWndEdit, GWLP_WNDPROC, (LPARAM)EditProc);
            break;


        case WM_CLOSE: 
            DestroyWindow(hWnd); 
            break; 

        case WM_DESTROY: 
            PostQuitMessage(0); 
            break;

        case WM_MOVE:
            SetWindowText(hWndEdit, "");
            SetWindowText(hWndEdit_2, "");
            break;

        case WM_COMMAND:
        {      

            UINT idCtl=LOWORD(wParam); // идентификатор дочернего окна
            UINT code=HIWORD(wParam);  // код уведомления
            HWND hChild=(HWND)lParam;  // дескриптор дочернего окна
    
            if(idCtl==ID_button&&code==BN_CLICKED)
            {

                // кнопка была нажата
                CloseWindow(hWnd); // закрыть окно-родителя
                PostQuitMessage(0);  // закрыть приложение
            }
            // кнопка была нажата
            if(ID_button&&code==BN_CLICKED)
            {
                //count=1;
                InvalidateRect(NULL,NULL,TRUE);
                // кнопка была нажата
                char* str_a = new char[10];
                SetWindowText(hWndEdit_2, "");
                if (GetWindowText(hWndEdit, str_a, 5)) // получить в переменную str_a текст из редактора с дескриптором  hWndEdit
                { 
                    double a = atof(str_a); // функция преобразования текстовой строки в целое число
                    double a2 = a * a; // функция преобразования текстовой строки в целое число
                    double a3=sqrt(a2);
                    char* str_a2 = new char[30]; //
                    char *str_a3= new char[30];
                    sprintf(str_a2, "%.10g", a2); // перевести число a2 в строку str_a2
                    sprintf(str_a3, "%.3f", a3); // перевести число a2 в строку str_a2
                    SetWindowText(hWndEdit_2, str_a2); //вывести строку str5 в редакторе hWndEdit_x1     
                    SetWindowText(hWndEdit_3, str_a3); //вывести строку str5 в редакторе hWndEdit_x1 
                }
                else MessageBox(hWnd, "Вы не ввели число", "Ошибка", MB_ICONERROR);
            }
               }; return 0;



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

    return 0; 
}

LRESULT CALLBACK EditProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    UINT idCtl=LOWORD(wParam);
    switch(msg)
    {
    case WM_KEYDOWN:
    {
            if (wParam==VK_LEFT){
            num--;
            if (num<=0) num = 0;
            return CallWindowProc(wndEditProc, hWnd, msg, wParam, lParam);
            }
            if (wParam==VK_RIGHT){
            num++;
            return CallWindowProc(wndEditProc, hWnd, msg, wParam, lParam);
            }
            else return 0;
    }
    case WM_CHAR:
        if (wParam > 47 && wParam < 58)
        {
        num++;
        return CallWindowProc(wndEditProc, hWnd, msg, wParam, lParam);
        }
        else if (wParam==45 && num==0){
        num++;
        return CallWindowProc(wndEditProc, hWnd, msg, wParam, lParam);
        }
        else if (wParam==VK_BACK){
        num--;
        if (num<=0) num = 0;
        return CallWindowProc(wndEditProc, hWnd, msg, wParam, lParam);
        }
        else return 0;
        
}
     return CallWindowProc(wndEditProc, hWnd, msg, wParam, lParam);
}
maleke вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070