Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/22: Рейтинг темы: голосов - 22, средняя оценка - 4.82
Студент :)
895 / 328 / 12
Регистрация: 29.01.2011
Сообщений: 1,679

Как сделать такое окно

25.06.2012, 21:26. Показов 4252. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток!У меня есть вопрос.Как можно сделать такое окно(смотртите прикрепление)?
Есть достоверная информация,что это приложение написано на Microsoft Visual C++ 6.0.Хочу в своем проекте использовать аналогичное окно.
UPD:Красная рамка - неподвижная область,зеленая - можно прокручивать вверх,вниз.
Если ошибся разделом,прошу перенести тему.
Миниатюры
Как сделать такое окно  
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.06.2012, 21:26
Ответы с готовыми решениями:

Как сделать окно (окно домика) в пространстве, как на изображении?
Здравствуйте, как сделать окно в пространстве, как на изображении? сделал крышу и "фундамент": for (int i = 0, x = 9; i...

Как такое сделать?
//Суть такая: вводишь число,и после этого в каждой строчке должно появляться значок «*» на один больше Пример: вводим 4 и на...

как такое сделать ...
Используя рекурсию, ввести группу данных и вывести их в обратном порядке, не объявляя массива.

10
Студент :)
895 / 328 / 12
Регистрация: 29.01.2011
Сообщений: 1,679
26.06.2012, 00:37  [ТС]
т.е я понимаю,что нужно через API.Но по виду то оно консольное.И как там цвет "цветной" выведен,итп.?
0
 Аватар для T2skler
50 / 50 / 6
Регистрация: 16.05.2012
Сообщений: 232
26.06.2012, 00:40
Цитата Сообщение от nanshakov Посмотреть сообщение
Всем доброго времени суток!У меня есть вопрос.Как можно сделать такое окно(смотртите прикрепление)?
Есть достоверная информация,что это приложение написано на Microsoft Visual C++ 6.0.Хочу в своем проекте использовать аналогичное окно.
UPD:Красная рамка - неподвижная область,зеленая - можно прокручивать вверх,вниз.
Если ошибся разделом,прошу перенести тему.
Создаёте консольное приложение, осваиваете Console API http://vsokovikov.narod.ru/New... con_fn.htm и вперёд
1
387 / 214 / 102
Регистрация: 09.04.2012
Сообщений: 635
26.06.2012, 06:16
Лучший ответ Сообщение было отмечено как решение

Решение

Это не консольное приложение, а имитация консоли в чистом окне, то есть консоль, написанная с нуля. Видите, где выведено Server port , на скриншоте шрифт обрезан. Структура TEXTMETRIC задает параметры шрифта. CreateFont создает шрифт. Если установить параметры TEXTMETRIC некоторым образом, то шрифт будет обрезан таким образом.

Приложение создается с помощью WinMain. В программе он обернут в класс Game. Структура WNDCLASS предназначена для заполнения информации о классе, причем в окне скриншота заливка черной кистью (объект BRUSH). Затем регистрируется класс функцией RegisterClass. Создается окно функцией CreateWindow. Запуск оконной процедуры ( WNDPROC) и очереди сообщений GetMessage, TranslateMessage, PeekMessage.
Получение HDC окна функцией GetDC или BeginPaint. В окне рисуется текст таким образом, что имитируется консоль. Окно делится на 2 части. Первая часть обводится линиями: функции MoveToEx, LineTo. Цвет линии описывается переменной типа COLORREF, представляющую из себя DWORD значения. Для преобразования есть макрос RGB( R, G, B). Вывод с помощью TextOut. Для хранения строк можно использовать структуру в виде двусвязного списка. Один из параметров управляет цветом шрифта. При исполнении программы создается лог и выводится на экран. Скорее всего сделан специальный класс, имитирующий консоль.
Сделан специальный класс для работы с файловой системой ( Initializing File System), который занимается считыванием и записью файлов из архивов. Создан специальный формат файлов ltx. Сделан редактор файлов ltx.
Сделан класс 3д движка ( Initializing Engine), причем используется Direct3D
Сделан класс работы с сетью.
Сделан класс работы с устройствами ввода ( Starting Input Device)
Функции движка прописаны в динамических библиотеках: xRender_R2, xRender_R3, xRender_R1
Сделан класс обертка над WINAPI под названием Game - в ней располагается функции работы с оконом и его создания. Есть методы для чтения реестра: RegCreateKey, RegEnumKey, RegEnumValue, RegQueryValueEx и др.
Сделан класс для управления памятью, который выводит информацию об использовании памяти и ее выделении из кучи ( heap).

Server Name это параметр типа char*
Map это параметр типа char*
Players это два параметра типа int
Game Version это параметр типа int
1
Студент :)
895 / 328 / 12
Регистрация: 29.01.2011
Сообщений: 1,679
26.06.2012, 09:42  [ТС]
Огромное списибо всем,кто ответил.Здесь даже больше информации,чем нужно!
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
26.06.2012, 12:55
nanshakov, помотри сюда,
Форматирование текста и изменение цвета текста в консоли цветной шрифт
Как рисовать элементарные геометрические фигуры? рисование графических примитивов

Да по наличию системного меню можно с уверенностью сказать приложение либо Win32Api либо MFC (SDI либо dialog based), но в консольке это всё даже проще написать
1
Студент :)
895 / 328 / 12
Регистрация: 29.01.2011
Сообщений: 1,679
26.06.2012, 22:23  [ТС]
Только сейчас увидел,что в дисскусию закралась ошибка.На оригинальном окне нет красной\зеленой рамки.Это я их обвел,что бы показать,что верхняя часть статична,а нижняя(ограниченная рамкой)Двигается кнопками PGUP и PGDN.Разобрался с созданием она ,и выводом сообщений.Но
хотел узнать,что значит это
C++
1
2
// Forward declarations of functions included in this code module:
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
и
C++
1
2
3
4
5
6
7
case WM_DESTROY:
        PostQuitMessage(0);
        break;
[B]    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
        break;[/B]
    }
Добавлено через 2 часа 29 минут:Исправил,т.к в вопросе сам разобрался,чуть подправил пост.
0
Студент :)
895 / 328 / 12
Регистрация: 29.01.2011
Сообщений: 1,679
27.06.2012, 19:34  [ТС]
Так,дело идет.Получилось сделать вывод текста.Но есть вопросы по коду.Может где то можно улучшить.оптимизировать,переписать?
Как лучше резервировать сообщения?Сейчас это просто
C++
1
2
3
4
5
6
7
//Описание сообщений
        TCHAR test[] = _T("Тестовое сообщение.");
        TCHAR Error[] = _T("Ошибка!");
        TCHAR VersionCore[] = _T("Версия ядра :");
        TCHAR VersionLua[] = _T("Версия Lua :");
        TCHAR FuncNotFound[] = _T("Функция не найдена!");
        TCHAR NotFound[] = _T("NotFound!");
Вывод на экран осуществляется через TextOut.Для вывода 3х сообщений приходиться городить достаточно много кода.Можно ли сделать так.что бы 1 строка - 1 вывод сообщения,сразу с цветом и смещением(которое приходиться прописывать руками?)Что сейчас:
C++
1
2
3
4
5
6
7
SetBkMode(hdc,TRANSPARENT);
        SetTextColor(hdc,RGB(0, 255, 0));
        TextOut(hdc, X, Y, test, _tcslen(test));
        SetTextColor(hdc,RGB(255, 0, 0));
        TextOut(hdc, X, Y+15, Error, _tcslen(Error));
        SetTextColor(hdc,RGB(0, 0, 255));
        TextOut(hdc, X, Y+15+15, VersionCore, _tcslen(VersionCore));
И весь код.
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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
// Console.cpp
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <tchar.h>
#include "Console.h"
#define COLOR_WINDOWTEXT        8
#define COLOR_BACKGROUND        1
#define COLOR_WINDOW            5
#define COLOR_WINDOWFRAME       6
#define X            5
#define Y            5
#ifndef WM_MOUSEWHEEL
#define WM_MOUSEWHEEL 0x020A
#endif
// Глобальные переменные
 
// Имя класса окна.
static TCHAR szWindowClass[] = _T("ConsoleAPI");
 
// Строка, которая появляется в строке заголовка приложения.
static TCHAR szTitle[] = _T("Console");
 
HINSTANCE hInst;
 
// Forward declarations of functions included in this code module:
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_WINDOW+2);
    wcex.lpszMenuName   = NULL;
    // название класса
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
    if (!RegisterClassEx(&wcex))
    {
        MessageBox(NULL,
            _T("Ошибка регестрации окна!"),
            _T("Win32 Guided Tour"),
            NULL);
 
        return 1;
    }
 
    hInst = hInstance;
    HWND hWnd = CreateWindow(
        szWindowClass,
        szTitle,
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT,
        800, 600,
        NULL,
        NULL,
        hInstance,
        NULL
    );
 
    if (!hWnd)
    {
        MessageBox(NULL,
            _T("Ошибка вызова CreateWindow."),
            _T("Win32 Guided Tour"),
            NULL);
 
        return 1;
    }
 
    // Параметры ShowWindow обьяснение:
    // hWnd: Значение, возвращаемое CreateWindow
    // nCmdShow: Четвертый параметр из WinMain
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
 
    // Главный цикл обработки сообщений:
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return (int) msg.wParam;
}
 
//
//  ФУНКЦИИ: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  ЦЕЛИ:  Processes messages for the main window.
//
//  WM_PAINT    - Отрисовка в окне
//  WM_DESTROY  - post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    PAINTSTRUCT ps;
    //Параметры шрифта.
    LOGFONT font;
    font.lfHeight =  15 ;// Устанавливает высоту шрифта или символа
    font.lfWidth =  0;// Устанавливает среднюю ширину символов в шрифте
    font.lfEscapement = 0;// Устанавливает угол, между вектором наклона и осью X устройства
    font.lfOrientation = 0;// Устанавливает угол, между основной линией каждого символа и осью X устройства
    font.lfWeight = 300;// Устанавливает толщину шрифта в диапазоне от 0 до 1000
    font.lfItalic = 0;// Устанавливает курсивный шрифт
    font.lfUnderline = 0;// Устанавливает подчеркнутый шрифт
    font.lfStrikeOut = 0;// Устанавливает зачеркнутый шрифт
    font.lfCharSet = RUSSIAN_CHARSET;// Устанавливает набор символов
    font.lfOutPrecision = 0;// Устанавливает точность вывода
    font.lfClipPrecision = 0;// Устанавливает точность отсечения
    font.lfQuality = 0;// Устанавливает качество вывода
    font.lfPitchAndFamily = 0;// Устанавливает ширину символов и семейство шрифта
    //strcpy(font.lfFaceName , "VERDANA");//  устанавливает название шрифта
    //Отключил.
 
    HFONT hfont;
    hfont = ::CreateFontIndirect(&font);
    HDC hdc; /* ссылка на контекст устройства
   Будьте внимательны! Этот контекст устройства мы получаем только на момент вызовов
   BeginPaint и EndPaint, после чего он освобождается (после обработки WM_PAINT).
   Контекст устройства в WinMain освобождается только перед завершением программы.
   Обе переменные ссылаются на один и тот же контекст устройства окна и носят одинаковое
   имя, но фактически это разные контексты устройства.*/
   static HPEN pen = NULL;
   static HBRUSH brush = NULL;
   static RECT rect = {0L};
   SCROLLINFO sinfo;
   PAINTSTRUCT paint;
   HGDIOBJ old1, old2;
   int off, tmp;
    //Описание сообщений
        TCHAR test[] = _T("Тестовое сообщение.");
        TCHAR Error[] = _T("Ошибка!");
        TCHAR VersionCore[] = _T("Версия ядра :");
        TCHAR VersionLua[] = _T("Версия Lua :");
        TCHAR FuncNotFound[] = _T("Функция не найдена!");
        TCHAR NotFound[] = _T("NotFound!");
    
    
    // обрабатываем сообщения
         // выборка и обработка сообщений
    switch (message)
    {
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        old1 = SelectObject(hdc, pen);
        old2 = SelectObject(hdc, brush);
        SelectObject(ps.hdc,hfont);
        SetBkMode(hdc,TRANSPARENT);
        SetTextColor(hdc,RGB(0, 255, 0));
        TextOut(hdc, X, Y, test, _tcslen(test));
        SetTextColor(hdc,RGB(255, 0, 0));
        TextOut(hdc, X, Y+15, Error, _tcslen(Error));
        SetTextColor(hdc,RGB(0, 0, 255));
        TextOut(hdc, X, Y+15+15, VersionCore, _tcslen(VersionCore));
        EndPaint(hWnd, &ps);
        break;
        off = GetScrollPos(hWnd, SB_VERT);
           // вот этот примитив будет подчинятся верт-скроллу
           RoundRect(hdc, rect.left, rect.top - off, rect.right, rect.bottom - off, 180, 180);
 
           SelectObject(hdc, old1);
           SelectObject(hdc, old2);
           EndPaint(hWnd, &paint);
           break;
      case WM_VSCROLL:
           sinfo.cbSize = sizeof(SCROLLINFO);
           sinfo.fMask = SIF_ALL;
           GetScrollInfo(hWnd, SB_VERT, &sinfo);
           off = sinfo.nPos;
           sinfo.fMask = SIF_POS;
 
           switch(LOWORD(wParam)) {
                case SB_THUMBTRACK:
                    sinfo.nPos = sinfo.nTrackPos;
                    break;
                case SB_LINEUP:
                    sinfo.nPos -= 2;
                    break;
                case SB_LINEDOWN:
                    sinfo.nPos += 2;
                    break;
           }
           SetScrollInfo(hWnd, SB_VERT, &sinfo, TRUE);
           tmp = GetScrollPos(hWnd, SB_VERT);
           if(off != tmp) {
                ScrollWindow(hWnd, 0, off - tmp, NULL, NULL);
                UpdateWindow(hWnd);
           }
           break;
      case WM_MOUSEWHEEL: // прокручивание-скролла колёсиком-мышки
           tmp = off = GetScrollPos(hWnd, SB_VERT);
           off = (HIWORD(wParam) == 0x78) ? off-8 : off+8;
           SetScrollPos(hWnd, SB_VERT, off, TRUE);
           off = GetScrollPos(hWnd, SB_VERT);
           if(tmp != off) {
                ScrollWindow(hWnd, 0, tmp - off, NULL, NULL);
                UpdateWindow(hWnd);
           }
           break;
      case WM_SIZE: 
           sinfo.cbSize = sizeof(SCROLLINFO); 
           sinfo.fMask = SIF_RANGE | SIF_PAGE; 
           sinfo.nMin = 0; 
           sinfo.nMax = rect.bottom;
           sinfo.nPage = HIWORD(lParam); 
           SetScrollInfo(hWnd, SB_VERT, &sinfo, TRUE); 
           break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        // обработка сообщений "по умолчанию"
        return DefWindowProc(hWnd, message, wParam, lParam);
        break;
    }
    return 0;
}
Миниатюры
Как сделать такое окно  
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
27.06.2012, 21:19
Все эти потуги с WinAPI имеют смысл только если цель - поковырятся в этом API. Если же цель написать что-нибудь работающее, то лучше воспользоватся гуевыми библиотеками.
1
Студент :)
895 / 328 / 12
Регистрация: 29.01.2011
Сообщений: 1,679
27.06.2012, 22:42  [ТС]
DU, Цель - покопаться.А какие GUI библиотеки вы посоветуйте?
0
387 / 214 / 102
Регистрация: 09.04.2012
Сообщений: 635
27.06.2012, 23:50
Можно ли сделать так.что бы 1 строка - 1 вывод сообщения,сразу с цветом и смещением(которое приходиться прописывать руками?)
Для этого нужно использовать ООП, обернув строку в класс.

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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
// Console.cpp
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <tchar.h>
#define COLOR_WINDOWTEXT        8
#define COLOR_BACKGROUND        1
#define COLOR_WINDOW            5
#define COLOR_WINDOWFRAME       6
#define X            5
#define Y            5
#ifndef WM_MOUSEWHEEL
#define WM_MOUSEWHEEL 0x020A
#endif
 
class SText
{
public:
TCHAR* str;
 
SText(HDC hdc, DWORD rgb, int x, int y, TCHAR* a)
{
str = a;
Draw(hdc, rgb, x, y);
}
 
void Draw(HDC hdc, DWORD rgb, int x, int y)
{
SetBkMode(hdc,TRANSPARENT);
SetTextColor(hdc,rgb);
TextOut(hdc, x, y, str, _tcslen(str));
}
};
 
// Глобальные переменные
 
 
// Имя класса окна.
static TCHAR szWindowClass[] = _T("ConsoleAPI");
 
// Строка, которая появляется в строке заголовка приложения.
static TCHAR szTitle[] = _T("Console");
 
HINSTANCE hInst;
 
// Forward declarations of functions included in this code module:
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_WINDOW+2);
    wcex.lpszMenuName   = NULL;
    // название класса
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE
 
(IDI_APPLICATION));
    if (!RegisterClassEx(&wcex))
    {
        MessageBox(NULL,
            _T("Ошибка регестрации окна!"),
            _T("Win32 Guided Tour"),
            NULL);
 
        return 1;
    }
 
    hInst = hInstance;
    HWND hWnd = CreateWindow(
        szWindowClass,
        szTitle,
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT,
        800, 600,
        NULL,
        NULL,
        hInstance,
        NULL
    );
 
    if (!hWnd)
    {
        MessageBox(NULL,
            _T("Ошибка вызова CreateWindow."),
            _T("Win32 Guided Tour"),
            NULL);
 
        return 1;
    }
 
    // Параметры ShowWindow обьяснение:
    // hWnd: Значение, возвращаемое CreateWindow
    // nCmdShow: Четвертый параметр из WinMain
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
 
    // Главный цикл обработки сообщений:
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return (int) msg.wParam;
}
 
//
//  ФУНКЦИИ: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  ЦЕЛИ:  Processes messages for the main window.
//
//  WM_PAINT    - Отрисовка в окне
//  WM_DESTROY  - post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM 
 
lParam)
{
    PAINTSTRUCT ps;
    //Параметры шрифта.
    LOGFONT font;
    font.lfHeight =  15 ;// Устанавливает высоту шрифта или символа
    font.lfWidth =  0;// Устанавливает среднюю ширину символов в шрифте
    font.lfEscapement = 0;// Устанавливает угол, между вектором наклона 
 
и осью X устройства
    font.lfOrientation = 0;// Устанавливает угол, между основной линией 
 
каждого символа и осью X устройства
    font.lfWeight = 300;// Устанавливает толщину шрифта в диапазоне от 
 
0 до 1000
    font.lfItalic = 0;// Устанавливает курсивный шрифт
    font.lfUnderline = 0;// Устанавливает подчеркнутый шрифт
    font.lfStrikeOut = 0;// Устанавливает зачеркнутый шрифт
    font.lfCharSet = RUSSIAN_CHARSET;// Устанавливает набор символов
    font.lfOutPrecision = 0;// Устанавливает точность вывода
    font.lfClipPrecision = 0;// Устанавливает точность отсечения
    font.lfQuality = 0;// Устанавливает качество вывода
    font.lfPitchAndFamily = 0;// Устанавливает ширину символов и 
 
семейство шрифта
    //strcpy(font.lfFaceName , "VERDANA");//  устанавливает название 
 
шрифта
    //Отключил.
 
    HFONT hfont;
    hfont = ::CreateFontIndirect(&font);
    HDC hdc; /* ссылка на контекст устройства
   Будьте внимательны! Этот контекст устройства мы получаем только на 
 
момент вызовов
   BeginPaint и EndPaint, после чего он освобождается (после обработки 
 
WM_PAINT).
   Контекст устройства в WinMain освобождается только перед завершением 
 
программы.
   Обе переменные ссылаются на один и тот же контекст устройства окна и 
 
носят одинаковое
   имя, но фактически это разные контексты устройства.*/
   static HPEN pen = NULL;
   static HBRUSH brush = NULL;
   static RECT rect = {0L};
   SCROLLINFO sinfo;
   PAINTSTRUCT paint;
   HGDIOBJ old1, old2;
   int off, tmp;
    //Описание сообщений
        TCHAR test[] = _T("Тестовое сообщение.");
        TCHAR Error[] = _T("Ошибка!");
        TCHAR VersionCore[] = _T("Версия ядра :");
        TCHAR VersionLua[] = _T("Версия Lua :");
        TCHAR FuncNotFound[] = _T("Функция не найдена!");
        TCHAR NotFound[] = _T("NotFound!");
    
    
    // обрабатываем сообщения
         // выборка и обработка сообщений
    switch (message)
    {
    case WM_PAINT:
 
        hdc = BeginPaint(hWnd, &ps);
        old1 = SelectObject(hdc, pen);
        old2 = SelectObject(hdc, brush);
        SelectObject(ps.hdc,hfont);
    {
        SText a(hdc, RGB(0, 255, 0), X, Y+200, "SText test");
    }
        SetBkMode(hdc,TRANSPARENT);
        SetTextColor(hdc,RGB(0, 255, 0));
        TextOut(hdc, X, Y, test, _tcslen(test));
        SetTextColor(hdc,RGB(255, 0, 0));
        TextOut(hdc, X, Y+15, Error, _tcslen(Error));
        SetTextColor(hdc,RGB(0, 0, 255));
        TextOut(hdc, X, Y+15+15, VersionCore, _tcslen(VersionCore));
        EndPaint(hWnd, &ps);
        break;
        off = GetScrollPos(hWnd, SB_VERT);
           // вот этот примитив будет подчинятся верт-скроллу
           RoundRect(hdc, rect.left, rect.top - off, rect.right, 
 
rect.bottom - off, 180, 180);
 
           SelectObject(hdc, old1);
           SelectObject(hdc, old2);
           EndPaint(hWnd, &paint);
           break;
      case WM_VSCROLL:
           sinfo.cbSize = sizeof(SCROLLINFO);
           sinfo.fMask = SIF_ALL;
           GetScrollInfo(hWnd, SB_VERT, &sinfo);
           off = sinfo.nPos;
           sinfo.fMask = SIF_POS;
 
           switch(LOWORD(wParam)) {
                case SB_THUMBTRACK:
                    sinfo.nPos = sinfo.nTrackPos;
                    break;
                case SB_LINEUP:
                    sinfo.nPos -= 2;
                    break;
                case SB_LINEDOWN:
                    sinfo.nPos += 2;
                    break;
           }
           SetScrollInfo(hWnd, SB_VERT, &sinfo, TRUE);
           tmp = GetScrollPos(hWnd, SB_VERT);
           if(off != tmp) {
                ScrollWindow(hWnd, 0, off - tmp, NULL, NULL);
                UpdateWindow(hWnd);
           }
           break;
      case WM_MOUSEWHEEL: // прокручивание-скролла колёсиком-мышки
           tmp = off = GetScrollPos(hWnd, SB_VERT);
           off = (HIWORD(wParam) == 0x78) ? off-8 : off+8;
           SetScrollPos(hWnd, SB_VERT, off, TRUE);
           off = GetScrollPos(hWnd, SB_VERT);
           if(tmp != off) {
                ScrollWindow(hWnd, 0, tmp - off, NULL, NULL);
                UpdateWindow(hWnd);
           }
           break;
      case WM_SIZE: 
           sinfo.cbSize = sizeof(SCROLLINFO); 
           sinfo.fMask = SIF_RANGE | SIF_PAGE; 
           sinfo.nMin = 0; 
           sinfo.nMax = rect.bottom;
           sinfo.nPage = HIWORD(lParam); 
           SetScrollInfo(hWnd, SB_VERT, &sinfo, TRUE); 
           break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        // обработка сообщений "по умолчанию"
        return DefWindowProc(hWnd, message, wParam, lParam);
        break;
    }
    return 0;
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.06.2012, 23:50
Помогаю со студенческими работами здесь

Что такое нейросеть и как ее сделать?
Здравствуйте! Я давно хотел где-нибудь спросить, как можно на C++ создать программу, которую называют &quot;нейросеть&quot; (хотя, к...

Как сделать такое задание методом рекурсивной функции?
Есть интересное задание, дана последовательность: x(x + 1)(x + 1 + 1/2)(x + 1 + 1/2 +...+ 1/n). Нужно это решить методом рекурсивной...

Как сделать виндоусовское окно?
как можно в си сделать виндоусовское окно? и можно какую-нибудь программу, например а + б, только в окне

Я хочу сделать программу - чат. Что б обмениваться сообщениями. Как такое сделать? Какой код?
Если можно то с объяснениями пожалуйста. На языке с ++

MessageBox: Как сделать так, чтобы если окно модальное, при клике на родительское окно MessageBox мигал?
Здравия всем! Никак не найду нужный MB_*, как можно сделать так, чтобы если сделать MessageBox модальным, при клике по родительскому...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru