7

I am writing an opencv application to draw using laser beam using visual studio VC++ console application. I want to draw lines on desktop. I know that the drawing functions are available in GDI32.dll , but confused on how to integrate GDI32.dll with my vc code. can you suggest some good solution?

Cody Gray - on strike
  • 239,200
  • 50
  • 490
  • 574
Rajesh Agrawal
  • 484
  • 2
  • 5
  • 18
  • 1
    This is way more related to win32 and gdi than OpenCV. I suggest you tag it appropriately. There's duzens of GDI tutorials out there that shows exactly how to use GDI with VC++. On your OpenCV project you just need to add the appropriate library paths, headers and link with the right GDI libraries for it to work. There's no magic, really. – karlphillip Dec 17 '11 at 05:03
  • I am not using Win32 APi. My code is in native c,c++ Can't use GDI libraries ! – Rajesh Agrawal Dec 17 '11 at 05:35
  • Native C and C++ can use the GDI library. Are you having a problem doing so, or do you have an external requirement that forbids it? – Ben Voigt Dec 17 '11 at 05:44
  • 7
    You should **never** draw directly on the desktop. Like we all learned in kindergarten, if something is not yours, you shouldn't draw on it. The desktop is not yours; it belongs to Windows. – Cody Gray - on strike Dec 17 '11 at 12:57

1 Answers1

17

The code below draws a blue rectangle on the desktop.

#include <iostream>
#include <Windows.h>

int main() {    

    /* hide console window */
    ShowWindow(FindWindowA("ConsoleWindowClass", NULL), false);

    /* Calling GetDC with argument 0 retrieves the desktop's DC */
    HDC hDC_Desktop = GetDC(0);

    /* Draw a simple blue rectangle on the desktop */
    RECT rect = { 20, 20, 200, 200 };
    HBRUSH blueBrush=CreateSolidBrush(RGB(0,0,255));
    FillRect(hDC_Desktop, &rect, blueBrush);

    Sleep(10);
    return 0;
}

Just for fun. A Mandelbrot fractal drawn directly on the desktop.

#define MAGNITUDE_CUTOFF 100
#define NUMCOLOURS 256
#define WIDTH 640
#define HEIGHT 200
#define UP 72
#define DOWN 80
#define LEFT 75
#define RIGHT 77
#define SPACE 32
#define ENTER 13
#define ESCAPE 27
#define TAB 9
#define INSERT 82

#include <stdio.h>
#include <time.h>
#include <windows.h>
#include <iostream>
using namespace std;

int col(int x, int y);
void fract(void);

char op;
int ch,max_iterations;
double xmin = -2.10, xmax = 0.85, ymin = -1.5 , ymax = 1.5;
double  width_fact, height_fact;


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

    width_fact = (xmax-xmin)/WIDTH;
    height_fact = (ymax-ymin)/HEIGHT;


    for( int x = 0 ; x < 640 ; x++ ){
        for (int y = 0;y < 480; y++ ){

         int blue = (col(x,y) & 0x0f) << 4;
         int green =    (col(x,y) & 0xf0) << 0;
         int red =  (col(x,y) & 0xf00) >> 4;
         SetPixel(hdc, x,y, RGB(red,green,blue));

        }
    }


    system("pause");

    ReleaseDC(hwnd, hdc); // Release the DC
    DeleteDC(hdc); // Delete the DC
    return(0);
}

void fract(){
   int x,y,icount=0;
   width_fact = (xmax-xmin)/WIDTH;
   height_fact = (ymax-ymin)/HEIGHT;

   for (y=0;y<HEIGHT;y++){
       for (x=0;x<WIDTH;x++){
          // setcolor(col(x,y));
          // gotoxy(x+3,y+3);printf("Û");

       }

   }
   //setcolor(15);
}


int col( int x, int y){
    int n,icount=0;
    float p,q,r,i,prev_r,prev_i;

    p= (( (float)x ) * width_fact) + (float)xmin;
    q= (( (float)y ) * height_fact) +(float)ymin;

    prev_i = 0;
    prev_r = 0;

    for (n=0; n <= NUMCOLOURS; n++){
        r = (prev_r * prev_r) - (prev_i * prev_i) +p;
        i = 2 * (prev_r * prev_i) +q;

        if (( r*r + i*i) < MAGNITUDE_CUTOFF ){
            prev_r = r;
            prev_i = i;
        }
        else {
            return n;
        }
    }
    return n;
}
Software_Designer
  • 8,490
  • 3
  • 24
  • 28
  • 8
    What in the world is the `Sleep(10)` function call doing in there? Also, that's not really the standard way of hiding/showing the console window... – Cody Gray - on strike Dec 18 '11 at 01:01
  • 1
    @CodyGray Can you please write an answer with the standard way of hiding/showing the console window and the other optimizations you might have in mind? Thanks a ton – Shayan Nov 02 '20 at 09:26