Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
cilin
1 / 1 / 0
Регистрация: 02.02.2011
Сообщений: 26
#1

WIN API - C++

30.03.2011, 19:15. Просмотров 1439. Ответов 8
Метки нет (Все метки)

Доброе время суток. Учусь в институте и дали сделать такую хрень:
Реализовать приложения Win32API:
1. Окно в центре экрана с фоном цвета трехмерных элементов содержит переключатели, имитирующие работу светофора. Названия цветов светофора расположены слева от переключателей. При нажатии на переключатель сообщит название его цвета.
2. Нарисовать светофор, в котором цвет «зажигается» при нажатии на эту лампу левой клавишей мыши. Одновременно может гореть только один цвет. Реализовать приложение, используя динамически подключаемую библиотеку.
В контрольной работе представить код разработанных приложений на язык C, используя только функции WinAPI.
Скачал Microsoft Visual C++ 2008 Express Edition. Но если честно ничего не понял. Помогите пожалуйста пошагово создать Win32API типа (Здравствуй мир), я не могу понять где сам этот Win32API. Большая просьба не отправлять в google я думаю кто учится тот меня поймет.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
bigredcat
364 / 311 / 3
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
31.03.2011, 08:30     WIN API #2
А что преподаватели вам ничего не подсказывают? И учебных пособий не выдают?
Потратив 10 мин вы найдете и здесь все что требуется, если вам так google не нравится. Могу подсказать ключевые слова winapi литература. Далее ищите в названиях что-нибудь типа для начинающих.
easybudda
Эксперт С++
9412 / 5435 / 917
Регистрация: 25.07.2009
Сообщений: 10,428
31.03.2011, 08:36     WIN API #3
вот
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <windows.h>
    
LRESULT CALLBACK HelloWorldWndProc(HWND, UINT, UINT, LONG);
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow) {
    HWND hWnd;
    WNDCLASS WndClass;
    MSG Msg;
    char szClassName[] = "HelloWorld";
    
    WndClass.style = CS_HREDRAW | CS_VREDRAW;
    WndClass.lpfnWndProc = HelloWorldWndProc;
    WndClass.cbClsExtra = 0;
    WndClass.cbWndExtra = 0;
    WndClass.hInstance = hInstance;
    WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
    WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    WndClass.lpszMenuName = NULL;
    WndClass.lpszClassName = szClassName;
    
    if ( ! RegisterClass(&WndClass) ){
        MessageBox(NULL, "Can't register class", "Error", MB_OK);
        return 0;
    }
    
    hWnd = CreateWindow(szClassName, "Hello World application", WS_OVERLAPPEDWINDOW, 
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
    if ( ! hWnd ){
        MessageBox(NULL, "Can't create window", "Error", MB_OK);
        return 0;
    }
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
    
    while ( GetMessage(&Msg, NULL, 0, 0) ){
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
    
    return Msg.wParam;
}
 
LRESULT CALLBACK HelloWorldWndProc(HWND hWnd, UINT Message, UINT wParam, LONG lParam) {
    HDC hDC;
    PAINTSTRUCT PaintStruct;
    RECT Rect;
    
    switch ( Message ){
        case WM_PAINT : 
            hDC = BeginPaint(hWnd, &PaintStruct);
            GetClientRect(hWnd, &Rect);
            DrawText(hDC, "Hello World!", -1, &Rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
            EndPaint(hWnd, &PaintStruct);
            return 0;
        case WM_DESTROY :
            PostQuitMessage(0);
            return 0;
    }
    return DefWindowProc(hWnd, Message, wParam, lParam);
}
разбирайтесь.
IrineK
Заблокирован
31.03.2011, 11:43     WIN API #4
MSVS сильно ругается на "чистые" char.
Нужно ипользовать TCHAR.
Минималистский "Hello" выглядит как-то так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <windows.h>
#include <tchar.h>
 
static TCHAR szWindowClass[] = _T("win32app");
static TCHAR szTitle[] = _T("My first");
 
HINSTANCE hInst;
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
 
int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,
                   int nCmdShow)
{
    WNDCLASSEX wcex;
 
    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_HIGHLIGHT+1);
    wcex.lpszMenuName   = NULL;
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
 
    if (!RegisterClassEx(&wcex))
    {   MessageBox(NULL,_T("Call to RegisterClassEx failed!"),_T("My first"),NULL);
        return 1;
    }
 
    hInst = hInstance; 
    HWND hWnd = CreateWindow(
        szWindowClass,
        szTitle,
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT,
        500, 100,
        NULL,
        NULL,
        hInstance,
        NULL
    );
 
    if (!hWnd)
    {   MessageBox(NULL,_T("Call to CreateWindow failed!"),_T("My first"), NULL);
        return 1;
    }
 
    ShowWindow(hWnd,nCmdShow);
    UpdateWindow(hWnd);
 
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {  TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int) msg.wParam;
}
 
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    PAINTSTRUCT ps;
    HDC hdc;
    TCHAR greeting[] = _T("Здравствуй, МИР");
 
    switch (message)
    {
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        SetTextColor(hdc, RGB(255, 55, 5));
        TextOut(hdc,180, 20, greeting, _tcslen(greeting));
        EndPaint(hWnd, &ps);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
        break;
    }
    return 0;
}
fasked
Эксперт C++
4932 / 2512 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
31.03.2011, 14:08     WIN API #5
Цитата Сообщение от IrineK Посмотреть сообщение
MSVS сильно ругается на "чистые" char.
Ничего она не ругается, если настроить нормально В свойствах проекта можно выбрать Unicode, MB или неопределенную (что-то в этом духе). Так что все нормально и с "чистыми" char.
Kastaneda
Форумчанин
Эксперт С++
4261 / 2793 / 219
Регистрация: 12.12.2009
Сообщений: 7,122
Записей в блоге: 1
Завершенные тесты: 1
31.03.2011, 14:52     WIN API #6
Цитата Сообщение от IrineK Посмотреть сообщение
Минималистский "Hello" выглядит как-то так:
тогда уж строка
C
1
UpdateWindow(hWnd);
лишняя, т.к. ShowWindow() и так посылает WM_PAINT, и строка:
C
1
TranslateMessage(&msg);
в данном случае тоже лишняя.
afiskon
65 / 53 / 3
Регистрация: 06.09.2010
Сообщений: 254
31.03.2011, 15:48     WIN API #7
http://msdn.microsoft.com/ - тут описание всех API. Главное - внимательно прочитать, какие аргементы нужно передать для получения определенного результата. Если не получается найти нужную функцию - спроси либо на этом же форуме, либо у знакомого по аське.
fasked
Эксперт C++
4932 / 2512 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
31.03.2011, 18:22     WIN API #8
Kastaneda, UpdateWindow советуют посылать все равно, не знаю зачем уж, но читал
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.03.2011, 19:09     WIN API
Еще ссылки по теме:

C++ DrawText win api - Мистика =)
C++ win API:найти информацию о логических дисках.
C++ Глобальное считывание комбинаций win api
C++ Win api GetDlgItemInt что за второй параметр
Много ли времени нужно для изучения win api? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Kastaneda
Форумчанин
Эксперт С++
4261 / 2793 / 219
Регистрация: 12.12.2009
Сообщений: 7,122
Записей в блоге: 1
Завершенные тесты: 1
31.03.2011, 19:09     WIN API #9
fasked, ну вроде как раз затем, чтобы отрисовать окно.
Yandex
Объявления
31.03.2011, 19:09     WIN API
Ответ Создать тему
Опции темы

Текущее время: 07:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru