Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
1 / 1 / 1
Регистрация: 04.04.2010
Сообщений: 81

Обработка сообщений в win32 api

27.06.2010, 13:02. Показов 2882. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написал программу которая после ввода в поле edit текста exit и нажатия на кнопку выходит из программы, но почему то не работает.
Вот код:
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
#include "windows.h"
#define IDB_BUTTON 200
#define IDB_EDIT 201
int RegClass(WNDPROC Proc, LPCTSTR szName);
 
LRESULT CALLBACK _export WndProc(HWND, UINT, WPARAM, LPARAM);
 
HINSTANCE hInstance;
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    MSG msg;
    HWND hwnd;
    if(!RegClass(WndProc, "AppClass")) return FALSE;
    hwnd = CreateWindow("AppClass", "Programm", WS_OVERLAPPEDWINDOW|WS_VISIBLE, 
         CW_USEDEFAULT, CW_USEDEFAULT, 1280, 1024, NULL, NULL, hInstance, NULL);
    
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return (int) msg.wParam;
    
}
 
int RegClass(WNDPROC Proc, LPCTSTR szName)
{
    WNDCLASS wc;
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.cbClsExtra = wc.cbWndExtra = 0;
    wc.lpfnWndProc = Proc;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor= LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wc.lpszMenuName = (LPCTSTR)NULL;
    wc.lpszClassName = szName;
    return RegisterClass(&wc);
}
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        HWND hButton;
        HWND hEdit;
        CHAR *word;
        switch(message)
        {
        case WM_COMMAND:
             switch(LOWORD(wParam))
             {
             case IDB_BUTTON:
               GetWindowText(hEdit, word, 100);
                  if(word=="exit") PostQuitMessage(0);
             }
             
        case WM_CREATE:
             {
        hButton = CreateWindow("BUTTON","OK", WS_CHILD|WS_VISIBLE,
        790,500,70,25,hWnd,(HMENU)IDB_BUTTON,hInstance,NULL);
        hEdit = CreateWindow("EDIT", NULL, WS_CHILD|WS_VISIBLE|WS_BORDER,
        485,503,300,20,hWnd,(HMENU)IDB_EDIT,hInstance,NULL);
                 return 0;
            
            }
        case WM_DESTROY:{PostQuitMessage(0); return 0;}}
        return DefWindowProc(hWnd, message, wParam, lParam);               
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.06.2010, 13:02
Ответы с готовыми решениями:

Почему Microsoft больше не публикует книги по Win32 API? В частности, разработка графического интерфейса с Win32
Кто-нибудь знает, почему Microsoft перестала публиковать книги по программированию Win32 GUI? Я использую электронную книгу...

Разбор работы системы сообщений в Win32 проекте
Здравствуйте, я, вообщем-то, желаю разобраться как работает цикл обработки сообщений в проекте Win32. Как взаимодействуют между собой...

Win32 API
Хочу научиться пользоваться функциями API. Подскажите с чего начать.

2
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
27.06.2010, 14:56
1) GetWindowText пишет в то, куда указывает word, а указывает он неизвестно куда.
2) hEdit - локальная переменная, при нажатии на кнопку он уже равен неизвестно чему. (Можно сделать его static, но это не слишком хорошо, потому что если создать несколько окон с этим классом и общей WndProc, то будут проблемы.)
3) В word == "exit" сравниваются указатели, для сравнения самих строк - strcmp.
4) В конце case WM_COMMAND надо бы break, а то дальше пойдёт выполняться.
1
Brainsbreaker
 Аватар для Digit@ll
899 / 374 / 54
Регистрация: 01.02.2011
Сообщений: 1,608
12.02.2011, 00:48
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"
 
#define IDB_BUTTON 200
#define IDB_EDIT 201
 
int RegClass(WNDPROC Proc, LPCTSTR szName);
 
LRESULT CALLBACK _export WndProc(HWND, UINT, WPARAM, LPARAM);// непонятки какие-то с _export ((( так и не вьехал 
 
HINSTANCE hInstance;
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    MSG msg;
    HWND hwnd;
    
    if(!RegClass(WndProc, "AppClass"))
        
        return FALSE;
    
    hwnd = CreateWindow ("AppClass", "Programm", WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                         0, 0, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
 
    
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return (int) msg.wParam;
    
}
 
int RegClass(WNDPROC Proc, LPCTSTR szName)
{
    WNDCLASS wc;
    wc.style         = CS_HREDRAW | CS_VREDRAW;
    wc.cbClsExtra    = wc.cbWndExtra = 0;
    wc.lpfnWndProc   = Proc;
    wc.hInstance     = hInstance;
    wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wc.lpszMenuName  = (LPCTSTR)NULL;
    wc.lpszClassName = szName;
    return RegisterClass(&wc);
}
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static  HWND hButton;//ВАЖНО!!! чтоб окна не терялись
    static  HWND hEdit;
 
    TCHAR word[MAX_PATH];
    
    switch(message)// приоритет соблюдаем
    {
        case WM_CREATE:// сначала "рисуем"
            
            hButton = CreateWindow ("BUTTON","OK", WS_CHILD|WS_VISIBLE,
                                    790,500,70,25,hWnd,(HMENU)IDB_BUTTON,hInstance,NULL);
 
              hEdit = CreateWindow ("EDIT", NULL, WS_CHILD|WS_VISIBLE|WS_BORDER,
                                    485,503,300,20,hWnd,(HMENU)IDB_EDIT,hInstance,NULL);
            break;
        
        case WM_COMMAND:// потом управляем, а не на оборот )))
            
            switch(LOWORD(wParam))
            {
            case IDB_BUTTON:
 
                GetWindowText (hEdit, word, MAX_PATH);
                if (lstrcmpi (word, "exit") ==0)// и все будет работать
                    PostQuitMessage(0);
            }
            break;
        
        case WM_DESTROY:
            {
                PostQuitMessage(0);
            }
            return 0;
    }
    return DefWindowProc(hWnd, message, wParam, lParam);
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.02.2011, 00:48
Помогаю со студенческими работами здесь

С++ Win32 API
Подскажите книгу с самым доступным объяснением по данной теме. Что-то в роде "С++ за 21 день" только по Win32. Для чайников так...

Qt + Win32 API
Использую Qt как среду разработки по Windows. Опыта, к сожалению, пока нет никакого. Собственно вопрос: какие библиотеки нужны и как их...

win32 api таблица
у меня вопросик. можно с помощью только тишь api создать элемент как таблица? есть ли готовый класс для етого? не используя MFC. дайте...

C# и работа с Win32 API
Добрый день. Делаю задание на дом, где нужно создать две программы — в одной вводиться имя, фамилия, и затем выводятся в консоль. Это...

Практикум по Win32 API
Нигде не могу найти самостоятельные задания по винапи, подкиньте книги или дайте ссылочку, пожалуйста, на различные задания. Хочется руку...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru