C++ Pixels In Console Window

前端 未结 6 1060
谎友^
谎友^ 2020-12-04 22:27

In C++ using Code::Blocks v10.05, how do I draw a single pixel on the console screen? Is this easy at all, or would it be easier to just draw a rectangle? How do I color it?

相关标签:
6条回答
  • 2020-12-04 23:05

    If you're willing to have the image look blocky, you could take advantage of the block characters from the console code page.

    • = '\xDB' = U+2588 FULL BLOCK
    • = '\xDC' = U+2584 LOWER HALF BLOCK
    • = '\xDF' = U+2580 UPPER HALF BLOCK
    • and space

    By using the half-blocks in combination with colored text, you can turn an 80×25 console window into an 80×50 16-color display. (This was the approach used by the QBasic version of Nibbles.)

    Then, you just need to convert your image to the 16-color palette and a reasonably small size.

    Mario in 8 lines and 10 columns of "text"

    0 讨论(0)
  • 2020-12-04 23:09

    To use in CodeBlocks I found this (you have to add a linker option -lgdi32): //Code Blocks: Project Build Options Linker settings Othoer linker options: add -lgdi32

    I forgot: You have to put this before including windows.h :#define _WIN32_WINNT 0x0500

    The whole cosine code again. Ready to compile

    //Code Blocks: Project Build Options Linker settings Othoer linker options: add -lgdi32
    #define _WIN32_WINNT 0x0500
    #include "windows.h"
    #include <iostream>
    #include <cmath>
    using namespace std;
    #define PI 3.14
    int main(){
        HWND myconsole = GetConsoleWindow();
        HDC mydc = GetDC(myconsole);
        int pixel =0;
        COLORREF COLOR= RGB(255,255,255);
    
        //Draw pixels
        for(double i = 0; i < PI * 4; i += 0.05)
        {
            SetPixel(mydc,pixel,(int)(50+25*cos(i)),COLOR);
            pixel+=1;
        }
    
        ReleaseDC(myconsole, mydc);
        cin.ignore();
        return 0;
    }
    
    0 讨论(0)
  • 2020-12-04 23:14

    windows.h provides a function SetPixel() to print a pixel at specified location of a window. The general form of the function is

    SetPixel(HDC hdc, int x, int y, COLORREF& color);
    

    where, x and y are coordinates of pixel to be display and color is the color of pixel.

    Important: to print the pixel in your machine with Code::blocks IDE, add a link library libgdi32.a (it is usually inside MinGW\lib ) in linker setting.

    0 讨论(0)
  • 2020-12-04 23:19

    I have drawn the straight line using windows.h in code::blocks. I can't explain it in details, but I can provide you a code and procedure to compile it in code::blocks.

    1. go to setting menu and select compiler and debugger.
    2. Click on linker tab and add a link library libgdi32.a which is at C:\Program Files\CodeBlocks\MinGW\lib directory.

    Now compile this program

    #include <windows.h>
    
    #include <cmath>
    
    #define ROUND(a) ((int) (a + 0.5))
    
    /* set window handle */
    
    static HWND sHwnd;
    
    static COLORREF redColor=RGB(255,0,0);
    
    static COLORREF blueColor=RGB(0,0,255);
    
    static COLORREF greenColor=RGB(0,255,0);
    
    
    void SetWindowHandle(HWND hwnd){
    
    sHwnd=hwnd;
    
    }
    
    /* SetPixel */
    
    void setPixel(int x,int y,COLORREF& color=redColor){
    
    if(sHwnd==NULL){
    
        MessageBox(NULL,"sHwnd was not initialized !","Error",MB_OK|MB_ICONERROR);
    
        exit(0);
    
    }
    
    HDC hdc=GetDC(sHwnd);
    
    SetPixel(hdc,x,y,color);
    
    ReleaseDC(sHwnd,hdc);
    
    return;
    
    // NEVERREACH //
    
    }
    
    
    void drawLineDDA(int xa, int ya, int xb, int yb){
    
       int dx = xb - xa, dy = yb - ya, steps, k;
    
       float xIncrement, yIncrement, x = xa, y = ya;
    
       if(abs(dx) > abs(dy)) steps = abs(dx);
    
       else steps = abs(dy);
    
       xIncrement = dx / (float) steps;
    
       yIncrement = dy / (float) steps;
    
       setPixel(ROUND(x), ROUND(y));
    
       for(int k = 0; k < steps; k++){
    
        x += xIncrement;
    
        y += yIncrement;
    
        setPixel(x, y);
    
     }
    
    }
    
    /* Window Procedure WndProc */
    
    LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
    
     switch(message){
    
        case WM_PAINT:
    
            SetWindowHandle(hwnd);
    
            drawLineDDA(10, 20, 250, 300);
    
            break;
    
        case WM_CLOSE: // FAIL THROUGH to call DefWindowProc
    
            break;
    
        case WM_DESTROY:
    
            PostQuitMessage(0);
    
            return 0;
    
        default:
    
        break; // FAIL to call DefWindowProc //
    
      }
    
     return DefWindowProc(hwnd,message,wParam,lParam);
    
    }
    
    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int      iCmdShow){
    
    static TCHAR szAppName[] = TEXT("Straight Line");
    
    WNDCLASS wndclass;
    
    wndclass.style         = CS_HREDRAW|CS_VREDRAW ;
    
    wndclass.lpfnWndProc   = WndProc ;
    
    wndclass.cbClsExtra    = 0 ;
    
    wndclass.cbWndExtra    = 0 ;
    
    wndclass.hInstance     = hInstance ;
    
    wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
    
    wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
    
    wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
    
    wndclass.lpszMenuName  = NULL ;
    
    wndclass.lpszClassName = szAppName ;
    
    // Register the window //
    
    if(!RegisterClass(&wndclass)){
    
        MessageBox(NULL,"Registering the class failled","Error",MB_OK|MB_ICONERROR);
    
        exit(0);
    
    }
    
    // CreateWindow //
    
    HWND hwnd=CreateWindow(szAppName,"DDA - Programming Techniques",
    
                WS_OVERLAPPEDWINDOW,
    
                 CW_USEDEFAULT,
    
                 CW_USEDEFAULT,
    
                 CW_USEDEFAULT,
    
                 CW_USEDEFAULT,
    
                 NULL,
    
                 NULL,
    
                 hInstance,
    
                 NULL);
    
    if(!hwnd){
    
        MessageBox(NULL,"Window Creation Failed!","Error",MB_OK);
    
        exit(0);
    
      }
    
      // ShowWindow and UpdateWindow //
    
      ShowWindow(hwnd,iCmdShow);
    
     UpdateWindow(hwnd);
    
     // Message Loop //
    
     MSG msg;
    
     while(GetMessage(&msg,NULL,0,0)){
    
        TranslateMessage(&msg);
    
        DispatchMessage(&msg);
    
     }
    
      /* return no error to the operating system */
    
      return 0;
    
    }
    

    In this program I have used DDA line drawing algorithm. Pixel drawing tasks is done by setPixel(ROUND(x), ROUND(y)) function. This is windows programing which you can learn details here

    0 讨论(0)
  • 2020-12-04 23:20

    Console is a text device, so in general you don't write to individual pixels. You can create a special font and select it as a font for console, but it will be monochromatic. There are libraries which simplify writing console UI (e.g. Curses), but I believe that you also have more gamelike functionality in mind besides just showing a sprite.

    if you want to write a game, I suggest taking a look at some of the graphics/game frameworks/libs, e.g. SDL

    0 讨论(0)
  • 2020-12-04 23:24

    It depends on your OS. I suppose you are programming in a Windows platform, therefore you can use SetPixel but you have to use "windows.h" to get a console handle, so here an example for drawing the cos() function:

    #include<windows.h>
    #include<iostream>
    #include <cmath>
    
    using namespace std;
    
    #define PI 3.14
    
    int main() 
    {
        //Get a console handle
        HWND myconsole = GetConsoleWindow();
        //Get a handle to device context
        HDC mydc = GetDC(myconsole);
    
        int pixel =0;
    
        //Choose any color
        COLORREF COLOR= RGB(255,255,255); 
    
        //Draw pixels
        for(double i = 0; i < PI * 4; i += 0.05)
        {
            SetPixel(mydc,pixel,(int)(50+25*cos(i)),COLOR);
            pixel+=1;
        }
    
        ReleaseDC(myconsole, mydc);
        cin.ignore();
        return 0;
    }
    

    You can also use some others libraries like: conio.h allegro.h sdl, etc.

    0 讨论(0)
提交回复
热议问题