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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
mat_for_c
143 / 138 / 29
Регистрация: 26.04.2013
Сообщений: 670
Завершенные тесты: 2
#1

Пиксель экрана - C++

01.03.2014, 23:51. Просмотров 781. Ответов 18
Метки нет (Все метки)

а можно написать код, который смог бы сделать так, чтобы определенный пиксель экрана был, скажем, зеленого цвета? идеи сделать его битым не принимаются
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.03.2014, 23:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Пиксель экрана (C++):

Проверка закрашен ли пиксель - C++
Необходимо приобразовать черно-белую картинку в массив, каждый черный пиксель в массиве 1 каждый белый 0. Подскажите плз в какую сторону...

Как на SDL 2 нарисовать пиксель? - C++
Делаю урок, но он для SDL 1.2, а во второй версии нету функции SDL_SetVideoMode(), и хоть я создаю окно, как переделать этот урок под...

Как ложно выводить на монитор битый пиксель? - C++
Здравствуйте!!! Сам я чайник ещё в программировании, но задался таким вопросом, с целью узнать, можно ли как нибудь, может программно...

Проверить, попал ли пиксель RGB-цвета в диапазон нужных цветов - C++
Есть программа, которая смотрит в координаты и сверяет цвет пикселя в этих координатах с диапазон цветов указанных в коде и если цвет...

Что-то не так с OpenGL или головой, ошибка в один пиксель - C++
Отрисовываю точку и прямоугольник в старой версии OpenGL через GLFW - прямоугольник получается ниже на пиксель. Вот код: В начале , я...

Написать игру. В верхней части экрана летят 3 «звездочки»(***). В нижнем правом углу экрана находиться буква «О» - C++
Написать игру. В верхней части экрана летят 3 «звездочки»(***). В нижнем правом углу экрана находиться буква «О». После нажатия любой...

18
FreeMan108
121 / 121 / 6
Регистрация: 04.03.2013
Сообщений: 370
01.03.2014, 23:52 #2
Можно.
0
mat_for_c
143 / 138 / 29
Регистрация: 26.04.2013
Сообщений: 670
Завершенные тесты: 2
01.03.2014, 23:53  [ТС] #3
а как???
0
FreeMan108
121 / 121 / 6
Регистрация: 04.03.2013
Сообщений: 370
01.03.2014, 23:58 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Ладно... Смотри

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
#define WINVER 0x0500
#include <windows.h>
 
#define ID_TIMER_UP 100
 
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
 
char szClassName[ ] = "WindowsApp";
HINSTANCE hInst;
int cxScreen, cyScreen;
 
int WINAPI WinMain (HINSTANCE hInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)
 
{
    HWND hwnd;
    MSG msg;
    WNDCLASSEX wincl;
 
    wincl.hInstance = hInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WndProc;
    wincl.style = CS_DBLCLKS | CS_VREDRAW | CS_HREDRAW;
    wincl.cbSize = sizeof (WNDCLASSEX);
 
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;
    wincl.cbClsExtra = 0;
    wincl.cbWndExtra = 0;
 
    wincl.hbrBackground = (HBRUSH) CreateSolidBrush (RGB (255,0,255));
 
    if (!RegisterClassEx (&wincl))
        return 0;
    
    hInst = hInstance;
    cxScreen = GetSystemMetrics (SM_CXSCREEN);
    cyScreen = GetSystemMetrics (SM_CYSCREEN);
 
    hwnd = CreateWindowEx (
           WS_EX_LAYERED | WS_EX_TOPMOST | WS_EX_TRANSPARENT |
           WS_EX_NOACTIVATE | WS_EX_TOOLWINDOW,
           szClassName,
           "",
           WS_POPUP,
           0,
           0,
           cxScreen,
           cyScreen,
           HWND_DESKTOP,
           NULL,
           hInstance,
           NULL
           );
    SetTimer (hwnd, ID_TIMER_UP, 100, NULL);
    SetLayeredWindowAttributes (hwnd, RGB (255,0,255), 255, LWA_ALPHA | LWA_COLORKEY);
 
    ShowWindow (hwnd, nFunsterStil);
 
    while (GetMessage (&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    
    KillTimer (hwnd, ID_TIMER_UP);
    
    return msg.wParam;
}
 
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        HDC hPaintDC;
        PAINTSTRUCT ps;
    switch (message)
    {
        case WM_CREATE:
             break;
        case WM_PAINT:
             hPaintDC = BeginPaint (hwnd, &ps);
             SetPixel (hPaintDC, 100, 100, RGB (0, 255, 0));
             EndPaint (hwnd, &ps);
             break;
        case WM_TIMER:
             switch (wParam)
             {
                    case ID_TIMER_UP:
                         SetWindowPos (hwnd, HWND_TOP, NULL, NULL, NULL, NULL, SWP_NOMOVE | SWP_NOSIZE);
                         break;
                    }
             break;
        case WM_DESTROY:
             DeleteObject ( (HGDIOBJ)SetClassLong (hwnd, GCL_HBRBACKGROUND, (LONG)GetStockObject (WHITE_BRUSH)) );
            PostQuitMessage (0);
            break;
        default:
            return DefWindowProc (hwnd, message, wParam, lParam);
    }
 
    return 0;
}
Добавлено через 3 минуты
Можно конечно проще, но тогда после обновления экрана сотрется.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <windows.h>
 
 
int WINAPI WinMain (HINSTANCE hInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)
 
{
     hDC = GetDC (0);
     SetPixel (hDC, 100, 100, RGB (0, 255, 0));
     ReleaseDC (0, hDC);
}
1
mat_for_c
143 / 138 / 29
Регистрация: 26.04.2013
Сообщений: 670
Завершенные тесты: 2
02.03.2014, 00:02  [ТС] #5
FreeMan108, пишет, что не может char* перевести в LPCWSTR

C++
1
wincl.lpszClassName = szClassName;
Добавлено через 1 минуту
C++
1
hDC = GetDC (0);
какой тип то указывать?
0
FreeMan108
121 / 121 / 6
Регистрация: 04.03.2013
Сообщений: 370
02.03.2014, 00:07 #6
Ах да UNICODE
Исправь

C++
1
wchar_t szClassName[ ] = L"WindowsApp";
И в CreateWindow тоже перед кавычками поставь L

Добавлено через 3 минуты
Тип

C++
1
HDC hDC = GetDC (0);
0
mat_for_c
143 / 138 / 29
Регистрация: 26.04.2013
Сообщений: 670
Завершенные тесты: 2
02.03.2014, 00:17  [ТС] #7
а сколько она по времени то работает?
0
FreeMan108
121 / 121 / 6
Регистрация: 04.03.2013
Сообщений: 370
02.03.2014, 00:23 #8
Она все время работает
Надо через диспетчер задач останавливать

Добавлено через 3 минуты
Вот лучше вариант

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
#define WINVER 0x0500
#include <windows.h>
 
#define ID_TIMER_UP 100
 
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
 
wchar_t szClassName[ ] = L"WindowsApp";
HINSTANCE hInst;
int cxScreen, cyScreen;
 
int WINAPI WinMain (HINSTANCE hInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)
 
{
    HWND hwnd;
    MSG msg;
    WNDCLASSEX wincl;
 
    wincl.hInstance = hInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WndProc;
    wincl.style = CS_DBLCLKS | CS_VREDRAW | CS_HREDRAW;
    wincl.cbSize = sizeof (WNDCLASSEX);
 
    wincl.hIcon = LoadIcon (NULL, IDI_HAND);
    wincl.hIconSm = LoadIcon (NULL, IDI_HAND);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;
    wincl.cbClsExtra = 0;
    wincl.cbWndExtra = 0;
 
    wincl.hbrBackground = (HBRUSH) CreateSolidBrush (RGB (255,0,255));
 
    if (!RegisterClassEx (&wincl))
        return 0;
    
    hInst = hInstance;
    cxScreen = GetSystemMetrics (SM_CXSCREEN);
    cyScreen = GetSystemMetrics (SM_CYSCREEN);
 
    hwnd = CreateWindowEx (
           WS_EX_LAYERED | WS_EX_TOPMOST | WS_EX_TRANSPARENT,
           szClassName,
           L"",
           WS_POPUP,
           0,
           0,
           cxScreen,
           cyScreen,
           HWND_DESKTOP,
           NULL,
           hInstance,
           NULL
           );
    SetTimer (hwnd, ID_TIMER_UP, 100, NULL);
    SetLayeredWindowAttributes (hwnd, RGB (255,0,255), 255, LWA_ALPHA | LWA_COLORKEY);
 
    ShowWindow (hwnd, nFunsterStil);
 
    while (GetMessage (&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    
    KillTimer (hwnd, ID_TIMER_UP);
    
    return msg.wParam;
}
 
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static HBRUSH hBrush;
    HGDIOBJ hOld;
    
        HDC hPaintDC;
        PAINTSTRUCT ps;
    switch (message)
    {
        case WM_CREATE:
            hBrush = CreateSolidBrush (RGB (0, 255, 0));
             break;
        case WM_PAINT:
             hPaintDC = BeginPaint (hwnd, &ps);
             hOld = SelectObject (hPaintDC, hBrush);
             Ellipse (hPaintDC, 100, 100, 200, 200);
             SelectObject (hPaintDC, hOld);
             EndPaint (hwnd, &ps);
             break;
        case WM_TIMER:
             switch (wParam)
             {
                    case ID_TIMER_UP:
                         SetWindowPos (hwnd, HWND_TOP, NULL, NULL, NULL, NULL, SWP_NOMOVE | SWP_NOSIZE);
                         break;
                    }
             break;
        case WM_DESTROY:
            DeleteObject (hBrush);
             DeleteObject ( (HGDIOBJ)SetClassLong (hwnd, GCL_HBRBACKGROUND, (LONG)GetStockObject (WHITE_BRUSH)) );
            PostQuitMessage (0);
            break;
        default:
            return DefWindowProc (hwnd, message, wParam, lParam);
    }
 
    return 0;
}
1
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
02.03.2014, 00:26 #9
FreeMan108, а можно мне тоже зеленый пиксель? Только мне нужно не 1, а 90000 зеленых пикселей отдаленных друг от друга на 1-3 пикселя по всему экрану. Сможете?
0
FreeMan108
121 / 121 / 6
Регистрация: 04.03.2013
Сообщений: 370
02.03.2014, 00:43 #10
Цитата Сообщение от programina Посмотреть сообщение
FreeMan108, а можно мне тоже зеленый пиксель? Только мне нужно не 1, а 90000 зеленых пикселей отдаленных друг от друга на 1-3 пикселя по всему экрану. Сможете?
Зеленый пиксель конечно можно, но из-за их количества уж наверное лучше иметь готовую картинку (bmp) с нужной сеткой. Так эффективнее.

Примерно то, что нужно.

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
#define WINVER 0x0500
#define UNICODE
#define _UNICODE
#include <windows.h>
 
#define ID_TIMER_UP 100
 
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
 
wchar_t szClassName[ ] = L"WindowsApp";
HINSTANCE hInst;
int cxScreen, cyScreen;
 
int WINAPI WinMain (HINSTANCE hInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)
 
{
    HWND hwnd;
    MSG msg;
    WNDCLASSEX wincl;
 
    wincl.hInstance = hInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WndProc;
    wincl.style = CS_DBLCLKS | CS_VREDRAW | CS_HREDRAW;
    wincl.cbSize = sizeof (WNDCLASSEX);
 
    wincl.hIcon = LoadIcon (NULL, IDI_HAND);
    wincl.hIconSm = LoadIcon (NULL, IDI_HAND);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;
    wincl.cbClsExtra = 0;
    wincl.cbWndExtra = 0;
 
    wincl.hbrBackground = (HBRUSH) CreateSolidBrush (RGB (255,0,255));
 
    if (!RegisterClassEx (&wincl))
        return 0;
    
    hInst = hInstance;
    cxScreen = GetSystemMetrics (SM_CXSCREEN);
    cyScreen = GetSystemMetrics (SM_CYSCREEN);
 
    hwnd = CreateWindowEx (
           WS_EX_LAYERED | WS_EX_TOPMOST | WS_EX_TRANSPARENT
           //| WS_EX_NOACTIVATE | WS_EX_TOOLWINDOW
           ,
           szClassName,
           L"",
           WS_POPUP,
           0,
           0,
           cxScreen,
           cyScreen,
           HWND_DESKTOP,
           NULL,
           hInstance,
           NULL
           );
    SetTimer (hwnd, ID_TIMER_UP, 100, NULL);
    SetLayeredWindowAttributes (hwnd, RGB (255,0,255), 255, LWA_ALPHA | LWA_COLORKEY);
 
    ShowWindow (hwnd, nFunsterStil);
 
    while (GetMessage (&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    
    KillTimer (hwnd, ID_TIMER_UP);
    
    return msg.wParam;
}
 
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        static HBITMAP hScreen;
        static BITMAP bmpScreen;
        
        static HBRUSH hClassBrush;
        
        static RECT rcWnd;
        
        HDC hPaintDC, hDC, hMemDC;
        PAINTSTRUCT ps;
        HGDIOBJ hOld;
        
    switch (message)
    {
        case WM_CREATE:
             GetWindowRect (hwnd, &rcWnd);
             
             hClassBrush = (HBRUSH)GetClassLong (hwnd, GCL_HBRBACKGROUND);
             
             hDC = CreateIC (L"DISPLAY", NULL, NULL, NULL);
             hScreen = CreateCompatibleBitmap (hDC, cxScreen, cyScreen);
             hMemDC = CreateCompatibleDC (hDC);
             hOld = SelectObject (hMemDC, hScreen);
             FillRect (hMemDC, &rcWnd, (HBRUSH)hClassBrush);
             for (int x = 0; x < cxScreen; x+=3)
                for (int y = 0; y < cyScreen; y+=3)
                    SetPixel (hMemDC, x, y, RGB (0, 255, 0));
             SelectObject (hMemDC, hOld);
             DeleteDC (hMemDC);
             DeleteDC (hDC);
             
             GetObject (hScreen, sizeof (BITMAP), &bmpScreen);
             break;
        case WM_PAINT:
             hPaintDC = BeginPaint (hwnd, &ps);
             hMemDC = CreateCompatibleDC (hPaintDC);
             hOld = SelectObject (hMemDC, hScreen);
             
             BitBlt (
             hPaintDC,
             0, 0,
             bmpScreen.bmWidth, bmpScreen.bmHeight,
             hMemDC,
             0, 0,
             SRCCOPY );
             
             SelectObject (hMemDC, hOld);
             DeleteDC (hMemDC);
             EndPaint (hwnd, &ps);
             break;
        case WM_TIMER:
             switch (wParam)
             {
                    case ID_TIMER_UP:
                         SetWindowPos (hwnd, HWND_TOP, NULL, NULL, NULL, NULL, SWP_NOMOVE | SWP_NOSIZE);
                         break;
                    }
             break;
        case WM_DESTROY:
             DeleteObject (hScreen);
             DeleteObject ( (HGDIOBJ)SetClassLong (hwnd, GCL_HBRBACKGROUND, (LONG)GetStockObject (WHITE_BRUSH)) );
            PostQuitMessage (0);
            break;
        default:
            return DefWindowProc (hwnd, message, wParam, lParam);
    }
 
    return 0;
}
2
mat_for_c
143 / 138 / 29
Регистрация: 26.04.2013
Сообщений: 670
Завершенные тесты: 2
02.03.2014, 00:46  [ТС] #11
а вот чтоб в игре его было видно можно так сделать?
0
FreeMan108
121 / 121 / 6
Регистрация: 04.03.2013
Сообщений: 370
02.03.2014, 00:52 #12
Этот пиксель будет видно в играх, но не во всех. Причиной тому является то, что некоторые игры делают так называемый "захват экрана", а чтобы туда еще свой пиксель припаять нужен прямой доступ к видеопамяти, а это уже надо какими-то фокусами делать.
1
DarkMasterW
4 / 4 / 0
Регистрация: 25.10.2013
Сообщений: 230
02.03.2014, 00:58 #13
Это делается обычно через Overlay видеокарты. Надо DirectX ковырять. У самого мечта подобным образом логи вывести. Фишка оверлея в том, что в видеопамять изображение не загружается, а формируется непосредственно перед конвертированием в сигнал на монитор, но ПОСЛЕ формирования стандартного вывода. Т.е. вы в прямом смысле накладываете поверх выходного изображения свое, какое пожелаете.

Добавлено через 2 минуты
Кстати точно тот же самый процесс использует OverlayMixer в плеерах.
1
FreeMan108
121 / 121 / 6
Регистрация: 04.03.2013
Сообщений: 370
02.03.2014, 01:08 #14
Цитата Сообщение от DarkMasterW Посмотреть сообщение
Т.е. вы в прямом смысле накладываете поверх выходного изображения свое, какое пожелаете.
Вот если бы еще где-то примерчик глянуть.
0
DarkMasterW
4 / 4 / 0
Регистрация: 25.10.2013
Сообщений: 230
02.03.2014, 01:36 #15
Сам искал когда-то... Мне кидали пример... для делфика... Это на рабочий стол пламя выводит кажется.

Добавлено через 17 минут
Тьфу. А ссылку то не вставил. http://file.qip.ru/arch/Z4e0Z0LK/desktoponfire.html
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.03.2014, 01:36
Привет! Вот еще темы с ответами:

Очистка экрана - C++
скажите как в плюсах чистить экран консоли? system(&quot;cls&quot;) не предлагать, мой препод сказал что cout и system(&quot;cls&quot;) не совместимы (почему...

Отчистка экрана - C++
Народ, есть ли какая-нить общая функция, которая чистит экран, типа system(&quot;CLS&quot;); но для Windows и Linux сразу?

очистка экрана в C - C++
не получается очистить экран( вроде библиотеку подключил (conio.h) использовал &quot;clrscr();&quot; что не так?

Скриншот экрана - C++
Всем привет как в visual studio мне сделать скриншот экрана, а потом смотреть цвет пикселей в указанных координатах на фотографии? Или как...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
02.03.2014, 01:36
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru