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

Вывод черных и белых пиксилей на экран - C++

Восстановить пароль Регистрация
 
 
tatarrr
0 / 0 / 0
Регистрация: 14.02.2013
Сообщений: 101
05.04.2014, 10:16     Вывод черных и белых пиксилей на экран #1
Помогите написать программу, выводящую черные и белые полосы по горизонтали и вертикали по заданному разрешению. Например вписываю 800х600, то мне и выводит 800 вертикальных и 600 горизонтальных полос.

Пока что в примере у меня есть такой код
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
#include <vga.h>
#include <unistd.h>
#include <stdio.h>
 
int main(int argc, char* argv[])
{
  int i, k;
  printf ("Starting...Ctrl-C out when done calibrating.\n");
  sleep (4);
  vga_init ();
  vga_setmode (G800x600x256);
  
  for (i=0; i<800; i++)
  {
    for (k=0; k<600; k++)
    {
      vga_setcolor (0);
      vga_drawpixel (i,k);
    }
  }
  vga_setcolor(15);
  vga_drawpixel(799,599);
  sleep (100000);
  return(0);
}
Но как я понял, при помощи этого кода программа связывается с подключенным оборудованием, которое и задает значения для программы.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.04.2014, 10:16     Вывод черных и белых пиксилей на экран
Посмотрите здесь:

вывод на экран C++
C++ Вывод значений на экран
C++ вывод на экран
С++ вывод на экран C++
C++ Вывод на экран
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IrineK
Заблокирован
05.04.2014, 10:18     Вывод черных и белых пиксилей на экран #2
Цитата Сообщение от tatarrr Посмотреть сообщение
800 вертикальных и 600 горизонтальных полос.
Одновременно или по отдельности?
tatarrr
0 / 0 / 0
Регистрация: 14.02.2013
Сообщений: 101
05.04.2014, 10:20  [ТС]     Вывод черных и белых пиксилей на экран #3
IrineK
Одновременно
IrineK
Заблокирован
05.04.2014, 11:36     Вывод черных и белых пиксилей на экран #4
Попробуйте в циклах:
C++
1
2
3
for (i=0; i<800; i += 2)
  {
    for (k=0; k<600; k += 2)
tatarrr
0 / 0 / 0
Регистрация: 14.02.2013
Сообщений: 101
05.04.2014, 12:33  [ТС]     Вывод черных и белых пиксилей на экран #5
IrineK
Я даже не представляю как начать писать программу, как задать цвет этим линиям. Программировать почти не умею)
IrineK
Заблокирован
05.04.2014, 12:40     Вывод черных и белых пиксилей на экран #6
Цитата Сообщение от tatarrr Посмотреть сообщение
в примере у меня есть такой код
Если это пример, и он рабочий, всё, что вам осталось написать:
в строке 13: for (i=0; i<800; i += 2)
в строке 15: for (k=0; k<600; k += 2)

Всё.
tatarrr
0 / 0 / 0
Регистрация: 14.02.2013
Сообщений: 101
05.04.2014, 12:45  [ТС]     Вывод черных и белых пиксилей на экран #7
IrineK
Не, я этот код не могу запустить, выдает ошибку в этом месте vga_setmode (G800x600x256);
И как я понял, он подключает другие файлы, не помню за что отвечающие. Мне же просто надо написать программу для вывода полос.
И у меня еще такой вопрос, мне для реализации создавать консольный проект или windows application?
IrineK
Заблокирован
05.04.2014, 13:14     Вывод черных и белых пиксилей на экран #8
Цитата Сообщение от tatarrr Посмотреть сообщение
Мне же просто надо написать программу для вывода полос.
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
#include <iostream>
#include <Windows.h>
using std::cout;
using std::cin;
 
int main()
{   HWND hW = GetConsoleWindow();
    HDC hDC = GetDC(hW);
    int width, height, i, j;
    POINT start = {0, 0};
 
    cout << "Set the screen\n\twidth:\t";
    cin >> width;
    cout << "\theight:\t";
    cin >> height;
    system("cls");
    
    SetWindowPos(hW, HWND_TOP, 0, 0, width, height, SWP_SHOWWINDOW);
    
    HPEN whitePen = CreatePen(PS_SOLID, 1, RGB(255, 255, 255)); 
    SelectObject(hDC, whitePen); 
 
    for (i = 1; i<width; i += 2)
    {   GetCurrentPositionEx (hDC, &start);
        MoveToEx (hDC, i, 0, &start);
        LineTo (hDC, i, height-1);
    }
 
    for (i = 1; i<height; i += 2)
    {   GetCurrentPositionEx (hDC, &start);
        MoveToEx (hDC, 0, i, &start);
        LineTo (hDC, width-1, i);
    }
 
    DeleteObject(whitePen);
    
    cin.sync(); cin.get();
    return 0;
}
Добавлено через 32 секунды
Консоль.

Добавлено через 7 минут
Можно еще проще:

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
#include <iostream>
#include <Windows.h>
using std::cout;
using std::cin;
 
int main()
{   HWND hW = GetConsoleWindow();
    HDC hDC = GetDC(hW);
    int width, height, i, j;
    cout << "Set the screen\n\twidth:\t";
    cin >> width;
    cout << "\theight:\t";
    cin >> height;
    system("cls");
    
    SetWindowPos(hW, HWND_TOP, 0, 0, width, height, SWP_SHOWWINDOW);
    
    for (i = 0; i<width; i += 2)
        for (j = 0; j<height; j += 2)
            SetPixel(hDC, i, j, RGB(255,255,255));
    
    cin.sync(); cin.get();
    return 0;
}
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,154
Завершенные тесты: 1
05.04.2014, 13:33     Вывод черных и белых пиксилей на экран #9
IrineK, Небольшие поправки
1. DeleteObject(whitePen); не сработает если не вернуть старое перо.
2. Поскольку окно отображается не сразу, то часть линий пропадает,
нужна некоторая задержка перед циклом вывода
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
include <iostream>
#include <Windows.h>
using std::cout;
using std::cin;
 
int main()
{   HWND hW = GetConsoleWindow();
    HDC hDC = GetDC(hW);
    int width=800, height=600, i;
    POINT start;
 
    //cout << "Set the screen\n\twidth:\t";
    //cin >> width;
    //cout << "\theight:\t";
    //cin >> height;
    system("cls");
    Sleep(1000);
    SetWindowPos(hW, HWND_TOP, 0, 0, width, height, SWP_SHOWWINDOW);
    
    HPEN whitePen = CreatePen(PS_SOLID, 1, RGB(255, 255, 255)); 
    HPEN PenOld=(HPEN)SelectObject(hDC, whitePen); 
 
    for (i = 0; i<width; i += 10)
    {   //GetCurrentPositionEx (hDC, &start);
        MoveToEx (hDC, i, 0, &start);
        LineTo (hDC, i, height-1);
    }
 
    for (i = 0; i<height; i += 10)
    {   //GetCurrentPositionEx (hDC, &start);
        MoveToEx (hDC, 0, i, &start);
        LineTo (hDC, width-1, i);
    }
    SelectObject(hDC, PenOld);
    DeleteObject(whitePen);
    
    cin.sync(); cin.get();
    return 0;
}
А во втором варианте, чтобы были сплошные линии надо так
C++
1
2
3
4
5
6
     for (i = 0; i<width; i++)
        for (int j = 0; j<height; j += 10)
            SetPixel(hDC, i, j, RGB(255,255,255));
     for (i = 0; i<width; i += 10)
        for (int j = 0; j<height; j++)
            SetPixel(hDC, i, j, RGB(255,255,255));
IrineK
Заблокирован
05.04.2014, 13:37     Вывод черных и белых пиксилей на экран #10
zss,
Со Sleep понятно - спасибо.
А вот с PenOld чего-то не очень. Зачем это?
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,154
Завершенные тесты: 1
05.04.2014, 13:38     Вывод черных и белых пиксилей на экран #11
Цитата Сообщение от IrineK Посмотреть сообщение
PenOld чего-то не очень. Зачем это?
Пока перо находится в контексте устройства, его удалить нельзя.
Поэтому восстанавливаем старое и только после этого удаляем.
IrineK
Заблокирован
05.04.2014, 13:58     Вывод черных и белых пиксилей на экран #12
zss,
Получается так:

whitePen и PenOld - указатели на одну область памяти, где хранится объект.
DeleteObject эту область памяти почистит и указатель whitePen убьет.
А указатель PenOld умрет по выходе из функции.

Правильно?
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,154
Завершенные тесты: 1
05.04.2014, 14:07     Вывод черных и белых пиксилей на экран #13
Не так
SelectObject возвращает старое (предыдущее) значение объекта, а не того, который мы устанавливаем.
IrineK
Заблокирован
05.04.2014, 14:10     Вывод черных и белых пиксилей на экран #14
C++
1
HPEN PenOld=(HPEN)SelectObject(hDC, whitePen);
Указывает на whitePen.
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,154
Завершенные тесты: 1
05.04.2014, 14:13     Вывод черных и белых пиксилей на экран #15
Цитирую
Return Value
A pointer to the object being replaced. This is a pointer to an object of one of the classes derived from CGdiObject, such as CPen, depending on which version of the function is used. The return value is NULL
if there is an error.
У меня они точно получаются разные:
0D300FA8 и 01B00017 соответственно.
IrineK
Заблокирован
05.04.2014, 14:28     Вывод черных и белых пиксилей на экран #16
Цитата Сообщение от zss Посмотреть сообщение
У меня они точно получаются разные
Доказательства в студию.
Поскольку у меня - таки одинаковые

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
HWND hW = GetConsoleWindow();
    HDC hDC = GetDC(hW);
    
    HPEN whitePen = CreatePen(PS_SOLID, 1, RGB(255, 255, 255)); 
    SelectObject(hDC, whitePen); 
 
    HPEN PenOld = (HPEN)SelectObject(hDC, whitePen);
 
    if (!PenOld)
        cout << "NULL";
    else
        cout << "whitePen\t" << whitePen << "\nPenOld\t\t" << PenOld << '\n';
 
    if (!DeleteObject(whitePen))
        cout << "Not done";
    else
        cout << "Done";
Изображения
 
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,154
Завершенные тесты: 1
05.04.2014, 14:38     Вывод черных и белых пиксилей на экран #17
А у меня так
C++
1
2
3
    HPEN PenOld=(HPEN)SelectObject(hDC, whitePen); 
    cout<<whitePen<<std::endl;
    cout<<PenOld<<std::endl;
Миниатюры
Вывод черных и белых пиксилей на экран  
IrineK
Заблокирован
05.04.2014, 14:44     Вывод черных и белых пиксилей на экран #18
Ну вот, и где же истина?!

У меня еще и Delete выполняется без лишних церемоний:
C++
1
2
3
4
5
6
7
8
9
10
HWND hW = GetConsoleWindow();
    HDC hDC = GetDC(hW);
    
    HPEN whitePen = CreatePen(PS_SOLID, 1, RGB(255, 255, 255)); 
    SelectObject(hDC, whitePen); 
        
    if (!DeleteObject(whitePen))
        cout << "Not done";
    else
        cout << "Done";
Изображения
 
IrineK
Заблокирован
05.04.2014, 14:56     Вывод черных и белых пиксилей на экран #19
В Release тоже все нормально:
Миниатюры
Вывод черных и белых пиксилей на экран  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.04.2014, 15:15     Вывод черных и белых пиксилей на экран
Еще ссылки по теме:

Вывод на экран чётных слов строки исправить на вывод нечётных слов C++
C++ Вывод на экран
Вывод списка на экран C++

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

Или воспользуйтесь поиском по форуму:
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,154
Завершенные тесты: 1
05.04.2014, 15:15     Вывод черных и белых пиксилей на экран #20
У меня VS 2008.
Может в более поздних версиях учли нежелание программистов
возвращать в контент исходные значения GDI объектов.
Yandex
Объявления
05.04.2014, 15:15     Вывод черных и белых пиксилей на экран
Ответ Создать тему
Опции темы

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