Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
14 / 14 / 8
Регистрация: 26.09.2007
Сообщений: 919

Производный контрол для окна WinAPI

07.06.2020, 16:36. Показов 1570. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет народ. У меня вопрос заключается в следующем: например если надо для элемента управления CEdit в MFC какие то доп. функции мы порождаем класс производный от этого CEdit и добавляем свои функции в производный класс. Но в WinAPI классами для элементов управления не пользуются так как это делается в MFC- поэтому вопрос- как переопределить контрол тот или иной в WinAPI аналогично как я описал это делается в MFС.

Заранее спасибо.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.06.2020, 16:36
Ответы с готовыми решениями:

Какой WinApi контрол используется?
Здравствуйте. Какой winapi контрол используется в этом примере? edit?

Контрол для добавления кнопок в заголовк окна.
Приветствую. Помню, где-то видел, но вот где - не помню, может вы подскажете. Здесь в форуме тоже не нашел... Нужен контрол для...

Замена WinApi для C# (создавать окна и функционал самостоятельно)
Здравствуйте. Заранее приношу свои извинения, если вопрос кривоват. Я пока не очень точно разбираюсь в технологиях Windows. Мне хотелось бы...

3
Заблокирован
07.06.2020, 16:45
Наследование - MFC.
Тебе нужно WinApi - это SetWindowLong() - установка КелБака со своей начинкой.
1
 Аватар для GoodWeather
886 / 588 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
07.06.2020, 17:05
Цитирую:
Сабклассинг (subclassing) - контроль сообщений окон путем модификации оконной процедуры последних. Сабклассинг подразумевает использование изменённой оконной процедуры до оригинальной (а её можно вовсе и не использовать), позволяя нам создать сколь угодно заготовок оконных процедур для данного объекта. Хотя на практике обычно используется только одна.
Сабклассинг особенно удобен, когда дело касается изменения одного окна, класс которого не совпадает с другими окнами, подлежащими сабклассированию. А что, если нам нужно засабклассировать сотню Edit'ов? Сабклассинг здесь будет громоздким. Решением этой проблемы является суперклассинг (superclassing) - создание и регистрация нового класса окна в системе. После чего этот класс окна готов к использованию.
1
Заблокирован
07.06.2020, 18:34
Лучший ответ Сообщение было отмечено kurlyak как решение

Решение

kurlyak, вот пример, пожалуйста:
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
////////////////////////////////////////////////////////////////////////////////
// WinMain.cpp
//
// Made Ибн by Хотабыч
 
#include <windows.h>
 
TCHAR GWndname[]=TEXT("wnd_app");
TCHAR GAppname[]=TEXT("Appname");
 
#define IDC_BUTTON1 100
 
LRESULT CALLBACK CatchButtonProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    WNDPROC Wndproc=(WNDPROC)(LONG)GetWindowLong(hWnd,GWL_USERDATA);
    if(Wndproc)
    {
        switch(uMsg)
        {
        case WM_ERASEBKGND:
        {
            RECT rect;
            GetClientRect(hWnd,&rect);
            FillRect((HDC)wParam,&rect,CreateSolidBrush(RGB(0,0,255)));
        }
        return TRUE;
 
        case WM_RBUTTONDOWN:
        MessageBox(hWnd, TEXT("WM_RBUTTONDOWN"), TEXT("Правая кнопка"),
            MB_OK|MB_ICONINFORMATION|MB_SETFOREGROUND|MB_SYSTEMMODAL);
        break;
 
        case WM_NCDESTROY:
            SetWindowLong(hWnd,GWL_WNDPROC,(LONG)Wndproc);
            SetWindowLong(hWnd,GWL_USERDATA,0);
            break;
        }
        return CallWindowProc(Wndproc,hWnd,uMsg,wParam,lParam);
    }
    return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
 
//
// OnCreate
//
BOOL OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    HWND hWnd=lpCreateStruct->hwndParent;
    HINSTANCE hInstance=lpCreateStruct->hInstance;
 
    HWND hwndBt=CreateWindowEx(0,TEXT("button"),TEXT("Пуск"),
        BS_PUSHBUTTON|BS_TEXT|WS_CHILD|WS_TABSTOP|WS_VISIBLE,
        10,10,100,30,hWnd,(HMENU)(UINT_PTR)IDC_BUTTON1,hInstance,NULL);
 
    if(!hwndBt)
    {
        MessageBox(hWnd,TEXT("Кнопку создать не удалось"),GAppname,MB_OK|MB_ICONSTOP|MB_SETFOREGROUND|MB_SYSTEMMODAL);
        return -1;
    }
 
    // Установить подпрограмму для кнопки
    SetWindowLong(hwndBt,GWL_USERDATA,GetWindowLong(hwndBt,GWL_WNDPROC));
    SetWindowLong(hwndBt,GWL_WNDPROC,(LONG)CatchButtonProc);
 
    return 0;
}
 
//
// WndProc
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    LRESULT retval=0;
    LPCREATESTRUCT lpCreateStruct;
 
    switch(uMsg)
    {
        case WM_CREATE:
        {
            lpCreateStruct=reinterpret_cast<LPCREATESTRUCT>(lParam);
            lpCreateStruct->hwndParent=hWnd;
        }
        return OnCreate(lpCreateStruct);
 
        case WM_CLOSE:
            DestroyWindow(hWnd);
            break;
 
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
 
        default:
            retval=DefWindowProc(hWnd,uMsg,wParam,lParam);
    }
    return retval;
}
 
//
// Entry point
//
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    WNDCLASSEX wcex;
    wcex.style      = CS_HREDRAW | CS_VREDRAW;
    wcex.cbSize     = sizeof(WNDCLASSEX);
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.lpfnWndProc        = (WNDPROC)WndProc;
    wcex.hCursor        = LoadCursor(NULL,IDC_ARROW);
    wcex.hIcon      = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_APPLICATION));
    wcex.hIconSm        = (HICON)LoadImage(hInstance,MAKEINTRESOURCE(IDI_APPLICATION),IMAGE_ICON,16,16,0);
    wcex.lpszMenuName   = NULL;
    wcex.hbrBackground  = (HBRUSH)(COLOR_BTNFACE+1);
    wcex.lpszClassName  = GWndname;
 
    ATOM Atom=RegisterClassEx(&wcex);
    if(!Atom)
    {
        Atom=RegisterClass((LPWNDCLASS)&wcex.style);
        if(!Atom)
        {
            MessageBox(HWND_DESKTOP,TEXT("Класс не удалось зарегистрировать"),GAppname,MB_OK|MB_ICONWARNING|MB_SETFOREGROUND|MB_SYSTEMMODAL);
            return 0;
        }
    }
 
    HWND hWnd=CreateWindowEx(WS_EX_CLIENTEDGE,MAKEINTATOM(Atom),GAppname,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,0,CW_USEDEFAULT,0,HWND_DESKTOP,NULL,hInstance,NULL);
 
    if(!hWnd)
    {
        MessageBox(HWND_DESKTOP,TEXT("Окно создать не удалось"),GAppname,MB_OK|MB_ICONWARNING|MB_SETFOREGROUND|MB_SYSTEMMODAL);
        return 0;
    }
 
    ShowWindow(hWnd,nCmdShow);
    UpdateWindow(hWnd);
 
    MSG msg;
    while(GetMessage(&msg,NULL,0,0)>0) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return (int)msg.wParam;
}
 
////////////////////////////////////////////////////////////////////////////////
// <<eof>> WinMain.cpp
////////////////////////////////////////////////////////////////////////////////
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.06.2020, 18:34
Помогаю со студенческими работами здесь

Создал/Нарисовал свой контрол на WinAPi. Дайте совет
Я создал свой контрол сделал его в стиле как в контакте поля ввода &quot;Ваше имя&quot;, получился довольно красивый Edit и с вертикальным...

Как избавится от родительского консольного окна при создание WinAPI окна
добрый день. использую DEV-C++, но так понимаю разницы нет, какая у нас IDE. создаём просто файл или пустой проект методом...

Контрол перемещается при изменении окна
Есть контролы (узлы графа). Хотя их положение я меняю через Margin, они привязываются к размеру окна. Почему черт знает, поэтому пишу сюда....

Как закодировать контрол бокс окна самостоятельно?
Народ привет! Возник вопрос, хочу создать форму с свойствами бордер стайл NONE без контролбокса и полосы для перетаскивания, для того...

Как обновить контрол Form1 при закрытии диалогового окна Form2?
На Form1 есть dataGridView, вызывается Форм2 шоуДайлогом(), через которую добавляется информация в базу. И вот, при закрытии диалоговой...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью в КА2. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа в КА2. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru