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

Как сделать такое окно - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
nanshakov
Студент :)
890 / 323 / 10
Регистрация: 29.01.2011
Сообщений: 1,680
25.06.2012, 21:26     Как сделать такое окно #1
Всем доброго времени суток!У меня есть вопрос.Как можно сделать такое окно(смотртите прикрепление)?
Есть достоверная информация,что это приложение написано на Microsoft Visual C++ 6.0.Хочу в своем проекте использовать аналогичное окно.
UPD:Красная рамка - неподвижная область,зеленая - можно прокручивать вверх,вниз.
Если ошибся разделом,прошу перенести тему.
Миниатюры
Как сделать такое окно  
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nanshakov
Студент :)
890 / 323 / 10
Регистрация: 29.01.2011
Сообщений: 1,680
26.06.2012, 00:37  [ТС]     Как сделать такое окно #2
т.е я понимаю,что нужно через API.Но по виду то оно консольное.И как там цвет "цветной" выведен,итп.?
T2skler
 Аватар для T2skler
50 / 50 / 1
Регистрация: 16.05.2012
Сообщений: 231
26.06.2012, 00:40     Как сделать такое окно #3
Цитата Сообщение от nanshakov Посмотреть сообщение
Всем доброго времени суток!У меня есть вопрос.Как можно сделать такое окно(смотртите прикрепление)?
Есть достоверная информация,что это приложение написано на Microsoft Visual C++ 6.0.Хочу в своем проекте использовать аналогичное окно.
UPD:Красная рамка - неподвижная область,зеленая - можно прокручивать вверх,вниз.
Если ошибся разделом,прошу перенести тему.
Создаёте консольное приложение, осваиваете Console API http://vsokovikov.narod.ru/New_MSDN_...ole/con_fn.htm и вперёд
asidorchenko
379 / 205 / 25
Регистрация: 09.04.2012
Сообщений: 635
26.06.2012, 06:16     Как сделать такое окно #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Это не консольное приложение, а имитация консоли в чистом окне, то есть консоль, написанная с нуля. Видите, где выведено 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
nanshakov
Студент :)
890 / 323 / 10
Регистрация: 29.01.2011
Сообщений: 1,680
26.06.2012, 09:42  [ТС]     Как сделать такое окно #5
Огромное списибо всем,кто ответил.Здесь даже больше информации,чем нужно!
-=ЮрА=-
Заблокирован
Автор FAQ
26.06.2012, 12:55     Как сделать такое окно #6
nanshakov, помотри сюда,
Форматирование текста и изменение цвета текста в консоли цветной шрифт
Как рисовать элементарные геометрические фигуры? рисование графических примитивов

Да по наличию системного меню можно с уверенностью сказать приложение либо Win32Api либо MFC (SDI либо dialog based), но в консольке это всё даже проще написать
nanshakov
Студент :)
890 / 323 / 10
Регистрация: 29.01.2011
Сообщений: 1,680
26.06.2012, 22:23  [ТС]     Как сделать такое окно #7
Только сейчас увидел,что в дисскусию закралась ошибка.На оригинальном окне нет красной\зеленой рамки.Это я их обвел,что бы показать,что верхняя часть статична,а нижняя(ограниченная рамкой)Двигается кнопками 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 минут:Исправил,т.к в вопросе сам разобрался,чуть подправил пост.
nanshakov
Студент :)
890 / 323 / 10
Регистрация: 29.01.2011
Сообщений: 1,680
27.06.2012, 19:34  [ТС]     Как сделать такое окно #8
Так,дело идет.Получилось сделать вывод текста.Но есть вопросы по коду.Может где то можно улучшить.оптимизировать,переписать?
Как лучше резервировать сообщения?Сейчас это просто
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;
}
Миниатюры
Как сделать такое окно  
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
27.06.2012, 21:19     Как сделать такое окно #9
Все эти потуги с WinAPI имеют смысл только если цель - поковырятся в этом API. Если же цель написать что-нибудь работающее, то лучше воспользоватся гуевыми библиотеками.
nanshakov
Студент :)
890 / 323 / 10
Регистрация: 29.01.2011
Сообщений: 1,680
27.06.2012, 22:42  [ТС]     Как сделать такое окно #10
DU, Цель - покопаться.А какие GUI библиотеки вы посоветуйте?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.06.2012, 23:50     Как сделать такое окно
Еще ссылки по теме:

C++ как сделать что бы окно выполнения сразу не закрывалось?
C++ Как сделать, чтобы не закрывалось окно командной строки?
Как сделать что бы не показывало консольное окно, а сразу графическое? C++

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

Или воспользуйтесь поиском по форуму:
asidorchenko
379 / 205 / 25
Регистрация: 09.04.2012
Сообщений: 635
27.06.2012, 23:50     Как сделать такое окно #11
Можно ли сделать так.что бы 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;
}
Yandex
Объявления
27.06.2012, 23:50     Как сделать такое окно
Ответ Создать тему
Опции темы

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