70 / 70 / 13
Регистрация: 21.12.2011
Сообщений: 188
1

Проблема с RichEdit'ом и кнопкой

21.12.2011, 14:22. Показов 3125. Ответов 8
Метки нет (Все метки)

Здравствуйте. Пишу небольшой текстовый редактор. Только начал учить winapi. MSDN читал. Не понял в чем проблема, по этому и спрашиваю здесь. Не хочет создаваться RichEdit и не обрабатывается нажатие кнопки. После нажатия программа зависает.

CreateWindow.h
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
88
89
90
91
92
93
94
#include <Windows.h>
#include "WinProc.h"
 
#define btnClck1 101
 
//Точка входа в программу
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
    //Создаем класс окна
    WNDCLASS WindowClass;
 
    //Заполняем структуру 
    WindowClass.style           = 0;
    WindowClass.lpfnWndProc     = (WNDPROC)WndProc;
    WindowClass.cbClsExtra      = 0;
    WindowClass.cbWndExtra      = 0;
    WindowClass.hInstance       = hInstance;
    WindowClass.hIcon       = LoadIcon(hInstance,
                      (LPCTSTR)IDI_APPLICATION);
    WindowClass.hCursor     = LoadCursor(NULL, IDC_ARROW);
    WindowClass.hbrBackground   = (HBRUSH)(COLOR_WINDOW+1);
    WindowClass.lpszMenuName    = 0;
    WindowClass.lpszClassName   = TEXT("Class");
 
    //Зарегистируем класс окна
    RegisterClass(&WindowClass);
 
    //Создаем переменную, в которой поместим идентификатор окна
    HWND hWnd;
    HWND hWnd_button;
    HWND hWnd_richEdit;
    hWnd = CreateWindow(TEXT("Class"), TEXT("Текстовый редактор"),
        WS_OVERLAPPEDWINDOW, 0, 0, 800, 600, NULL, NULL, hInstance, NULL); 
    
    //Создание кнопки
    hWnd_button = CreateWindow(TEXT("button"), TEXT("Открыть файл"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
        10, 10, 180, 30, hWnd, (HMENU)btnClck1, hInstance, NULL);
    
    //Создание Текст. поля
    hWnd_richEdit = CreateWindow(TEXT("RichEdit"), TEXT("blabla"), WS_CHILD | WS_VISIBLE | ES_MULTILINE | WS_VSCROLL |LBS_MULTIPLESEL |
        ES_AUTOVSCROLL | ES_READONLY,  10, 10, 200, 300, hWnd, (HMENU)20000, hInstance, NULL);
 
    //Создание меню
    HMENU main_menu = CreateMenu();
    HMENU menu_help = CreatePopupMenu();
    HMENU menu_view = CreatePopupMenu();
    AppendMenu(main_menu, MF_STRING | MF_POPUP, (UINT)menu_view, TEXT("&Файл"));
    AppendMenu(main_menu, MF_STRING | MF_POPUP, (UINT)menu_help, TEXT("&Справка"));
    //AppendMenu(menu_help, MF_STRING, 1001, TEXT("&О программе..."));
    AppendMenu(menu_view, MF_STRING, 1002, TEXT("О&ткрыть"));
    AppendMenu(menu_view, MF_STRING, 1003, TEXT("&Создать"));
    AppendMenu(menu_view, MF_STRING, 1004, TEXT("&Выход"));
    SetMenu(hWnd, main_menu);
    DestroyMenu(main_menu);
    
    
    //показать окно
    ShowWindow(hWnd, nCmdShow);
 
    //обновить содержимое окна
    UpdateWindow(hWnd);
 
    //Создадим переменную для храненния сообщений
    MSG msg;
 
    //Создадим цикл обработки сообщений
    while(GetMessage(&msg, NULL,0 ,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    LRESULT CALLBACK buttonEvent (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    switch (message){
    case WM_COMMAND:
           switch(LOWORD(wParam))
           {
               case ID_START:
                   MessageBox(hWnd, TEXT("Кнопка нажата"), TEXT("sdf"), 0);
                   break;
           }  
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        return 0;
    }
 
 
    return 0;
}
WinProc.h
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
#include <Windows.h>
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
    case WM_COMMAND: 
        case btnClck1:
                {
                    MessageBox(hWnd,TEXT("Menu Click"),TEXT("Info"),MB_OK);
                    return 0;
                }
    case WM_CREATE:
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    case WM_PAINT:
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
И скажите, пожалуйста, что в данном коде означает 101? По примеру делал, а объяснений не нашел.
C++
1
#define btnClck1 101
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.12.2011, 14:22
Ответы с готовыми решениями:

проблема с кнопкой
есть такая форма ...&lt;script type=&quot;text/javascript&quot; src=&quot;jquery.js&quot;&gt;&lt;/script&gt; &lt;script...

Проблема с кнопкой.
Подскажите пожалуста. Мне нужен код, который по нажатию на кнопку выводит форму №2 - Form2.frm ...

Проблема с кнопкой
У меня ещё проблема, при сооздании красивых кнопок, при помощи Image , работа получается не...

Опять проблема с растягиваемой кнопкой
«Есть таблица из двух столбцов: в первом - многострочный тест, во втором - кнопка...

8
Brainsbreaker
896 / 372 / 52
Регистрация: 01.02.2011
Сообщений: 1,592
21.12.2011, 20:45 2
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
#define btnClck1 101// просто числовая константа
 
LRESULT CALLBACK WndProc (HWND hWnd, UINT msg, WPARAM wparam, LPARAM lparam);
 
HINSTANCE hInst;
 
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    //Создаем класс окна
    WNDCLASS WindowClass;
    HWND hWnd, hWnd_button, hWnd_richEdit;
    MSG msg;
 
    //Заполняем структуру 
    WindowClass.style               = 0;
    WindowClass.lpfnWndProc         = (WNDPROC)WndProc;
    WindowClass.cbClsExtra          = 0;
    WindowClass.cbWndExtra          = 0;
    WindowClass.hInstance           = hInstance;
    WindowClass.hIcon               = LoadIcon(hInstance,(LPCTSTR)IDI_APPLICATION);
    WindowClass.hCursor             = LoadCursor(NULL, IDC_ARROW);
    WindowClass.hbrBackground       = (HBRUSH)(COLOR_WINDOW+1);
    WindowClass.lpszMenuName        = 0;
    WindowClass.lpszClassName       = TEXT("Class");
 
    //Зарегистируем класс окна    
    if (!RegisterClass(&WindowClass))
        return 0;
    if (!(hWnd = CreateWindow(TEXT("Class"), TEXT("Текстовый редактор"),
        WS_OVERLAPPEDWINDOW, 0, 0, 800, 600, NULL, NULL, hInstance, NULL)))
        return (0);
    //Создание кнопки
    hWnd_button = CreateWindow(TEXT("button"), TEXT("Открыть файл"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
        220, 10, 180, 30, hWnd, (HMENU)btnClck1, hInstance, NULL);
    //Создание Текст. поля
    hWnd_richEdit = CreateWindow(TEXT("EDIT"), TEXT("blabla"), WS_CHILD | WS_VISIBLE | ES_MULTILINE | WS_VSCROLL |LBS_MULTIPLESEL |
        ES_AUTOVSCROLL | ES_READONLY,  10, 10, 200, 300, hWnd, (HMENU)20000, hInstance, NULL);
    //Создание меню
    HMENU main_menu = CreateMenu();
    HMENU menu_help = CreatePopupMenu();
    HMENU menu_view = CreatePopupMenu();
    AppendMenu(main_menu, MF_STRING | MF_POPUP, (UINT)menu_view, TEXT("&Файл"));
    AppendMenu(main_menu, MF_STRING | MF_POPUP, (UINT)menu_help, TEXT("&Справка"));
    //AppendMenu(menu_help, MF_STRING, 1001, TEXT("&О программе..."));
    AppendMenu(menu_view, MF_STRING, 1002, TEXT("О&ткрыть"));
    AppendMenu(menu_view, MF_STRING, 1003, TEXT("&Создать"));
    AppendMenu(menu_view, MF_STRING, 1004, TEXT("&Выход"));
    SetMenu(hWnd, main_menu);
    DestroyMenu(main_menu);
 
    ShowWindow(hWnd, SW_SHOWDEFAULT);
    UpdateWindow(hWnd);
 
    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (msg.wParam);
}
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{   
    switch(message)
    {
    case WM_COMMAND:
        switch (LOWORD(wParam))
        {
        case btnClck1:
            MessageBox(hWnd,TEXT("Menu Click"),TEXT("Info"),MB_OK);
            break;
        }
        break;
 
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    }
    return (DefWindowProc(hWnd, message, wParam, lParam));
}
Цитата Сообщение от pobedinsky Посмотреть сообщение
По примеру делал
Откуда такой пример, что вся программа в заголовках?
0
16 / 9 / 0
Регистрация: 20.12.2011
Сообщений: 20
21.12.2011, 20:49 3
Во первых, все виснет потому что нельзя вот так просто писать:
C++
1
2
case WM_PAINT:
break;
Это сообщение для отрисовки клиентской области окна. Если Вам оно не нужно просто уберите его. Или же сделайте вот так:
C++
1
2
3
4
5
6
case WM_PAINT:
HDC hDC;
PAINTSTRUCT ps;
hDC=BeginPaint(hWnd,&ps);
EndPaint(hWnd,&ps);
break;
Во вторых, для того чтобы создать richedit необходимо подключить спец. библиотеку:
C++
1
 #include <richedit.h>
а также загрузить длл:
C++
1
LoadLibrary("RICHED32.DLL");
В третьих, btnClck1 это просто индентификатор элемента. Он необходим для того чтобы правильно определять для какого контрола( разных элементов управления может быть много, а WM_COMMAND один) в WM_COMMAND пришло сообщение. По поводу 101 - там можно поставить любое число лишь бы оно не совпадало с идентификаторами меню др. контролов и мы могли бы одназначно идентифицировать нашу кнопку.
Я немного подправил Ваш код, чтоб все работало как Вы и хотели.Выкладываю:
CreateWindow.cpp
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
#include <Windows.h>
#include "WinProc.h"
#include <richedit.h>
 
 
//Точка входа в программу
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
    
    LoadLibrary("RICHED32.DLL");
        //Создаем класс окна
        WNDCLASS WindowClass;
 
        //Заполняем структуру 
        WindowClass.style                       = 0;
        WindowClass.lpfnWndProc         = (WNDPROC)WndProc;
        WindowClass.cbClsExtra          = 0;
        WindowClass.cbWndExtra          = 0;
        WindowClass.hInstance           = hInstance;
        WindowClass.hIcon               = LoadIcon(hInstance,
                                          (LPCTSTR)IDI_APPLICATION);
        WindowClass.hCursor             = LoadCursor(NULL, IDC_ARROW);
        WindowClass.hbrBackground       = (HBRUSH)(COLOR_WINDOW+1);
        WindowClass.lpszMenuName        = 0;
        WindowClass.lpszClassName       = TEXT("Class");
 
        //Зарегистируем класс окна
        RegisterClass(&WindowClass);
 
        //Создаем переменную, в которой поместим идентификатор окна
        HWND hWnd;
        HWND hWnd_button;
        HWND hWnd_richEdit;
        hWnd = CreateWindow(TEXT("Class"), TEXT("Текстовый редактор"),
                WS_OVERLAPPEDWINDOW, 0, 0, 800, 600, NULL, NULL, hInstance, NULL); 
        
        //Создание кнопки
        hWnd_button = CreateWindow(TEXT("button"), TEXT("Открыть файл"), WS_CHILD |WS_VISIBLE | BS_PUSHBUTTON,
                300, 100, 180, 30, hWnd, (HMENU)btnClck1, hInstance, NULL);
        
        //Создание Текст. поля
        hWnd_richEdit = CreateWindow(TEXT("RichEdit"), TEXT("blabla"), WS_CHILD |WS_BORDER| WS_VISIBLE | ES_MULTILINE | WS_VSCROLL |LBS_MULTIPLESEL |
                ES_AUTOVSCROLL | ES_READONLY,  10, 10, 200, 300, hWnd, 0, hInstance, NULL);
 
        //Создание меню
        HMENU main_menu = CreateMenu();
        HMENU menu_help = CreatePopupMenu();
        HMENU menu_view = CreatePopupMenu();
        AppendMenu(main_menu, MF_STRING | MF_POPUP, (UINT)menu_view, TEXT("&Файл"));
        AppendMenu(main_menu, MF_STRING | MF_POPUP, (UINT)menu_help, TEXT("&Справка"));
        //AppendMenu(menu_help, MF_STRING, 1001, TEXT("&О программе..."));
        AppendMenu(menu_view, MF_STRING, 1002, TEXT("О&ткрыть"));
        AppendMenu(menu_view, MF_STRING, 1003, TEXT("&Создать"));
        AppendMenu(menu_view, MF_STRING, 1004, TEXT("&Выход"));
        SetMenu(hWnd, main_menu);
        DestroyMenu(main_menu);
          
        //показать окно
        ShowWindow(hWnd, nCmdShow);
 InvalidateRect(hWnd,NULL,true);
        //обновить содержимое окна
        UpdateWindow(hWnd);
 
        //Создадим переменную для храненния сообщений
        MSG msg;
 
        //Создадим цикл обработки сообщений
        while(GetMessage(&msg, NULL,0 ,0))
        {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
        }
        return 0;
}
WinProc.h
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
#define btnClck1 101
 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        switch(message)
        {
        case WM_COMMAND: 
            {
                switch (LOWORD(wParam)) 
                { 
                    case btnClck1:
                    {
                        MessageBox(hWnd,TEXT("Menu Click"),TEXT("Info"),MB_OK);
                    }
                    break;
                }
 
            }break;
        case WM_CREATE:
                break;
        case WM_DESTROY:
                PostQuitMessage(0);
                break;
       case WM_PAINT:
            HDC hDC;
        PAINTSTRUCT ps;
        hDC=BeginPaint(hWnd,&ps);
        EndPaint(hWnd,&ps);
                break;
        default:
                return DefWindowProc(hWnd, message, wParam, lParam);
        }
        return 0;
}
PS. Обратите внимание, как правильно обрабатывать сообщение WM_COMMAND - у Вас было неправильно!
1
70 / 70 / 13
Регистрация: 21.12.2011
Сообщений: 188
21.12.2011, 23:52  [ТС] 4
Спасибо, в общем понято, но есть пара вопросов.
Все идентификаторы элементов я должен описать в define и это значение указывать в HMENU в CreateWindow ?
Далее по теме мне следует сделать загрузку текст файла в richEdit. Это все делается тоже по средствам сообщений и в какую сторону капать?
Если я описываю WndProc для окна с дескриптором hWnd, то все, что описано в этом WM_COMMAND будет относиться и к элементам расположенным на этом окне? Так если окна 2, то и WM_COMMAND должно быть 2?
0
Исследователь
317 / 316 / 24
Регистрация: 06.04.2011
Сообщений: 872
22.12.2011, 07:38 5
Цитата Сообщение от pobedinsky Посмотреть сообщение
Все идентификаторы элементов я должен описать в define и это значение указывать в HMENU в CreateWindow ?
Нет, вы должны их указывать только там, где требуется определить с каким конкретно элементом нужно работать. Это касается, например, обработки WM_COMMAND, WM_NOTIFY и т.д.
Цитата Сообщение от pobedinsky Посмотреть сообщение
Если я описываю WndProc для окна с дескриптором hWnd, то все, что описано в этом WM_COMMAND будет относиться и к элементам расположенным на этом окне?
Верно, это справедливо для всех дочерних окон и меню, которые поддерживают обработку этого сообщения.
Цитата Сообщение от pobedinsky Посмотреть сообщение
Так если окна 2, то и WM_COMMAND должно быть 2?
Да, для двух разных окон должны быть две обработки сообщения WM_COMMAND в разных функциях WindowProc. Но это не касается элементов пользовательского интерфейса типа кнопка/поле ввода/список и т.п. Кроме, конечно, случаев, когда вы стандартные элементы переделываете под свои задачи.
1
70 / 70 / 13
Регистрация: 21.12.2011
Сообщений: 188
22.12.2011, 09:26  [ТС] 6
Цитата Сообщение от GrayWolf Посмотреть сообщение
Нет, вы должны их указывать только там, где требуется определить с каким конкретно элементом нужно работать. Это касается, например, обработки WM_COMMAND, WM_NOTIFY и т.д.
Запутался. Так, а где кнопке присваивать какой-то идентификатор, чтобы WM_COMMAND узнала, что именно на эту кнопку посылать сообщения?
0
16 / 9 / 0
Регистрация: 20.12.2011
Сообщений: 20
22.12.2011, 11:19 7
а где кнопке присваивать какой-то идентификатор, чтобы WM_COMMAND узнала, что именно на эту кнопку посылать сообщения?
WM_COMMAND - ничего не посылает кнопке. Поймите, пользователь программы что-то делает с кнопкой (допустим нажимает). После этого действия тому окну, в котором создана кнопка посылается спец сообщение WM_COMMAND. Это сообщение нужно для нас, чтобы определять что сделал пользователь и какой код написать в ответ на это действие. Вместе с каждым сообщением передается два параметра LPARAM и WPARAM. В них и находятся все что нам нужно. В частности WPARAM содержит идентификатор меню кнопки (HMENU). А LPARAM содержит дескриптор элемента управления (HWND). А дальше мы сами решаем - что делать или не делать. У нас стояла простая выдача сообщения MessageBox. Чтобы что-нибудь делать с нашей кнопкой - можно написать так:
C++
1
2
3
4
5
6
7
8
9
switch (LOWORD(wParam)) 
                                { 
                                        case btnClck1:
                                        {
                                                HWND HwndButton = (HWND) lParam; 
                                                EnableWindow(HwndButton,false);//заблокируем ее
                                        }
                                        break;
                                }
То есть для любых дальнейших действий с кнопкой используем ее дескриптор HwndButton.
1
70 / 70 / 13
Регистрация: 21.12.2011
Сообщений: 188
22.12.2011, 11:39  [ТС] 8
Понял. Спасибо.
0
6 / 6 / 0
Регистрация: 13.05.2012
Сообщений: 592
20.10.2017, 01:40 9
А что такое RichEdit?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.10.2017, 01:40
Помогаю со студенческими работами здесь

Проблема с задачей на параллельные процессы: система, управляющая пассажирским лифтом, с одной кнопкой вызова.
Доброго Времени Суток! В общем я пытаюсь на Ruby смоделировать через параллельные процессы работу...

Запрограммировать светофор, который включается кнопкой "Старт" и выключается кнопкой "Стоп"
Разместите на форме три виджеты QRadioButton (с надписями Red, Orange, Green) и две кнопки....

проблема при работе с китайским J-LINK 8 или же проблема с с
Всем привет. Решил Сам собрать себе дисковери кит на базе at91sam7s64-ek. Подарили мне китайский...

Работа с кнопкой
На форме есть 2 элемента RadioButton (подписаны, как ДА и НЕТ) и кнопка. Есть таблица с колонками...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru