Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

draw on desktop using visual c++

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?

like image 615
Rajesh Agrawal Avatar asked Dec 17 '11 04:12

Rajesh Agrawal


People also ask

How do I create a desktop application in Visual Studio C++?

To create a Windows desktop project in Visual Studio 2017In the New Project dialog box, in the left pane, expand Installed > Visual C++, then select Windows Desktop. In the middle pane, select Windows Desktop Wizard. In the Name box, type a name for the project, for example, DesktopApp. Choose OK.

How do you draw with GDI?

To draw a line in Windows GDI+ you need a Graphics object, a Pen object, and a Color object. The Graphics object provides the DrawLine method, and the Pen object holds attributes of the line, such as color and width. The address of the Pen object is passed as an argument to the DrawLine method.

What is Windows Desktop Wizard in Visual Studio?

The Windows Desktop Wizard replaces the Win32 Application Wizard in Visual Studio 2017 and later. The wizard allows you to create any of four types of C++ projects (listed in the heading in the table below). In each case, you can specify additional options that are appropriate for the type of project you open.


1 Answers

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;
}
like image 136
Software_Designer Avatar answered Sep 28 '22 07:09

Software_Designer