C ++ рисование пикселей вопрос - PullRequest
1 голос
/ 02 января 2011


Как сделать окно или более похожий на область отсечения, где я смогу рисовать пиксели?Он может использовать WinApi, однако я не хочу, чтобы мой проект выглядел как winapi, поэтому он будет иметь

int main(){}

вместо

int WINAPI WinMain(HINSTANCE ...

Я нашел пример, гдеЯ могу рисовать в окне консоли

int main()
{
    COLORREF color = RGB(255,0,0); // COLORREF to hold the color info

    SetConsoleTitle("Pixel In Console?"); // Set text of the console so you can find the window

    HWND hwnd = FindWindow(NULL, "Pixel In Console?"); // Get the HWND
    HDC hdc = GetDC(hwnd); // Get the DC from that HWND

    for( int i = 0 ; i < 50 ; i++ )
    {
    SetPixel(hdc, 5+i, 12, color); // SetPixel(HDC hdc, int x, int y, COLORREF color)
    }
        ReleaseDC(hwnd, hdc); // Release the DC
    DeleteDC(hdc); // Delete the DC
    system("pause");
    return(0);
}

, но вместо консоли я хочу рисовать в выбранной области, которая будет удерживать фокус (когда пользователь нажимает на нее и т. Д.).

Было бы замечательно иметь возможность обрабатывать простые события клавиатуры / мыши для этой программы, но это не моя основная задача, может быть, некоторые другие сторонние библиотеки помогут с этим.

Я надеюсь,Я четко объяснил, что я хочу сделать, но английский не мой родной язык, поэтому я очень сожалею о любых недоразумениях.

Буду благодарен за любую помощь.


Поскольку я использую этот сайт впервые, я извиняюсь за небольшой спам или сообщения в неправильных местах, так как я не уверен, где размещать мои следующие сообщения :-) Так что яхотел написать, это:

"В противном случае, как Allegro / SDL создает окна? Они используют вызовы ассемблера или оболочки? Я буду намного счастливее, когда я смогу создать окно с нуля,независимо от того, сколько работы это займет :) "

Ответы [ 5 ]

4 голосов
/ 02 января 2011

Вам это не понравится - в Windows вам нужно создать окно, затем переопределить сообщение WM_PAINT, а затем нарисовать то, что вы должны нарисовать при вызове из системы.Это старый способ ведения дел, и он не так плох.

Некоторые интересные и актуальные ссылки:

http://www.winprog.org/tutorial/bitmaps.html

http://www.codeproject.com/Articles/66250/BeginPaint-EndPaint-or-GetDC-ReleaseDC.aspx

Если вы действительно хотите избежать всего этого, попробуйте popcap .Кривая обучения там может быть круче, так что вы, вероятно, действительно хотите придерживаться GDI и HWND, независимо от того, насколько сложным и запутанным он может выглядеть в начале.

2 голосов
/ 02 января 2011

Я предлагаю вам попробовать OpenGL в сочетании с GLFW или glut . С OpenGL вы сможете обрабатывать все, что связано с обработкой графики (2D / 3D-рендеринг), а роль библиотеки GLFW, например, заключается в добавлении некоторых функций, таких как: управление окнами, управление событиями, таймеры, потоки и т. Д. .

Личная записка, иди на GLFW, потому что перенасыщение больше не поддерживается, я думаю ...

1 голос
/ 26 февраля 2013

Проблема с вашим кодом: Я опробовал ваш код и обнаружил, что строка, кажется, появляется в некотором случае ее выполнения, но иногда, когда я ее выполняю, красная линия не обнаруживается! Насколько я понимаю, это потому, что вы сохранили эти 3 утверждения:

// Set text of the console so you can find the window
SetConsoleTitle("Pixel In Console?"); 
HWND hwnd = FindWindow(NULL, "Pixel In Console?"); // Get the HWND
HDC hdc = GetDC(hwnd); // Get the DC from that HWND

Но Windows обновляет имя вашего окна только через некоторое время, поэтому, если вы заставите эти операторы выполняться один за другим, оператор HWND hwnd = FindWindow(NULL, "Pixel In Console?"); не сможет найти такое окно, потому что Windows требуется время, чтобы обновить заголовок, как: SetConsoleTitle("Pixel In Console?");

Решение: Вы можете оставить Sleep(int); (включая windows.h) или использовать:

HWND hwnd = FindWindowA("ConsoleWindowClass",NULL); // Get the HWND

вместо

SetConsoleTitle("Pixel In Console?"); // Set text of the console so you can find the window HWND hwnd = FindWindow(NULL, "Pixel In Console?"); // Get the HWND

Вот пример программы :

#include <windows.h>
#include<conio.h>`
#include<iostream.h>`

POINT p;    //structure with coordinates to mouse location`

void main()
{
    COLORREF color = RGB(255,0,0); // COLORREF to hold the color info`

    HWND hwnd = FindWindowA("ConsoleWindowClass",NULL); // Get the HWND
    HDC hdc = GetDC(hwnd); // Get the DC from that HWND

    for( int i = 0 ; i < 400 ; i++ )
    {
        for(int j=0;j<50;j++)
            SetPixel(hdc, i, j, color);
    }
    while(1)
    {
          GetCursorPos(&p);
          ScreenToClient(hwnd,&p);
          cout<<p.x<<' '<<p.y;
          clrscr();
          if(GetAsyncKeyState(1)) //checks if left mouse button is pressed
          {
                //fool around with these functions:
                SetPixel(hdc,p.x,p.y,color); 
                //LineTo(hdc,p.x,p.y);
                //Rectangle(hdc,200,200,p.x,p.y);
                Sleep(10);
          }
    }
    ReleaseDC(hwnd, hdc); // Release the DC
    DeleteDC(hdc); // Delete the DC
    system("pause");
}

Это мой первый ответ. Я надеюсь, что помог, и потребовалось много поисков, чтобы найти эти функции кроме того, я думаю, что я узнал больше из вашего сценария, чем показал вам:)

1 голос
/ 02 января 2011

Иначе, как Allegro / SDL создает окно?Они используют вызовы ассемблера или оболочки?Я буду намного счастливее, когда смогу создавать окна с нуля, независимо от того, сколько работы это займет :)

1 голос
/ 02 января 2011

Короче говоря: вам нужно использовать графический фреймворк / инструментарий виджетов, чтобы создать окно, и начать с него.

Затем, в зависимости от того, какую платформу вы используете, вы создадите окнои измените пиксели в соответствии с его ссылкой.

Я рекомендую SDL (маленький, вероятно, именно то, что вам нужно), Allegro (аналогичный) или Qt (крупно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...