С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Для чего const после phone() http://www.cyberforum.ru/cpp-beginners/thread613878.html
const char* phone()const {return phone_;} Для чего const после phone()?
C++ Вложенный цикл for помогите пожалуйста решить задачу с помощью вложеного цикла for только без масивов пожалуйста пользователь вводит числа, необходимо вводить числа до тех пор, пока сумма чётных или нечётных... http://www.cyberforum.ru/cpp-beginners/thread613862.html
Разработать структуру с именем NOTE C++
Задание 1: Подсчитать количество прописных букв в строке. Задание 2: Разработать структуру с именем NOTE, содержащую поля: • Фамилия, имя; • Номер телефона; • Дата рождения (массив их трёх чисел...
Строки и файлы C++
Нужно написать программу которая считывает текст из файла и выводит на экран сначала предложения,начинающиеся с однобуквенных слов,а затем все остальное. Полазил по форуму нашел сходную прогу,но...
C++ Работа с диагоналями в массиве http://www.cyberforum.ru/cpp-beginners/thread613841.html
ребят помогите найти манимальный элемент и максимальный . вот условие: Задан двумерный динамический массив размером NxM. Найти минимальный среди элементов. лежащих выше побочной оси, и...
C++ Двумерный массив заполняется слева направо и сверху вниз Напишите программу, в которой двумерный массив 5х5 заполняется слева направо и сверху вниз возрастающими нечетными числами от 1 до 49. Результат вывести на экран в виде таблицы. подробнее

Показать сообщение отдельно
nanshakov
Студент :)
891 / 324 / 10
Регистрация: 29.01.2011
Сообщений: 1,680
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
Миниатюры
Как сделать такое окно  
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.