Jump to content

  • Log In with Google      Sign In   
  • Create Account


coding a screenshot tool - allowing user to select a part of screen


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
6 replies to this topic

#1 fread   Members   -  Reputation: 228

Like
0Likes
Like

Posted 23 April 2014 - 05:43 AM

Hi guys. How to code (in WINAPI) util that would allow user to select part of the screen? I'm going to make a screenshot maker tool like the one available in AQQ communicator. I'd like to allow user selection of certain parts of screen (select first and second corner). Then I need to capture the pixels data in RGB or RGBA format. Any ideas how to do this?



Sponsor:

#2 Vortez   Crossbones+   -  Reputation: 2688

Like
4Likes
Like

Posted 23 April 2014 - 06:39 AM

You could have a look at my code here. Should work fine for what you need (with some adjustment of course). The raw buffer thing is just a managed byte array btw.

The last version of the code is here, but it's a bit more complex, but it support all type of bitmaps color depth, and the cursor part is fixed.

Just change Info.BitsPerPixel = 32; to 24 for RGB images.


Edited by Vortez, 23 April 2014 - 07:03 AM.


#3 fread   Members   -  Reputation: 228

Like
0Likes
Like

Posted 23 April 2014 - 08:22 AM

Thank you, but that's related to "making screenshot" part of the question.
What about the selecting a rectangle on the screenshot with mouse? User should be able to do this somehow. Click and drag to make rectangle and then confirm making a screenshot. Something like that. Any ideas?



#4 ferrous   Members   -  Reputation: 1836

Like
1Likes
Like

Posted 23 April 2014 - 11:30 AM

Are you referring to the whole screen, or the applications window?  There are api's for getting the global mouse coordinates.  Though I'm a bit iffy on the best way to draw the rectangle, in old school GDI land, i believe there was a way to get the desktop's HDC and then draw using that.  I'd imagine it's something similar on more modern windows.

 

On the other hand, if you just want the application window, well that's relatively easy, just a matter of drawing a rectangle within your own framework.



#5 Vortez   Crossbones+   -  Reputation: 2688

Like
1Likes
Like

Posted 23 April 2014 - 11:47 AM

Well, if you look at my code, im taking the whole screen with GetWindowRect(), but if you supply your own value to the x,y,w,h variables it will only take that area. Now, i have no idea about how your app work so im just giving you the code for the screenshot, how you take it is up to you.

 

 


Though I'm a bit iffy on the best way to draw the rectangle, in old school GDI land, i believe there was a way to get the desktop's HDC and then draw using that.

 

Yep, that's what those lines are for

HWND hDesktopWnd = GetDesktopWindow();
HDC hdc = GetDC(hDesktopWnd);


Perhaps you could make a gui with some edit box for the coordinates, and a preview windows and see the rectangle into that.


Edited by Vortez, 23 April 2014 - 12:07 PM.


#6 ferrous   Members   -  Reputation: 1836

Like
1Likes
Like

Posted 23 April 2014 - 12:06 PM

Hah, for some reason I find it amusing that it's remained the same after so many years.

 

Maybe they are having trouble with the rectangle portion?  That's just looking at when the mouse first gets it down message, thats your first point, then just look at mouse move messages while the mouse is still down to get a second point.  And you have your rectangle right there, you might have to take the mins/maxes of it to make sure it's not negative, but its pretty straightforward.  (And probably also in Vortez's code, I'd imagine)



#7 Servant of the Lord   Crossbones+   -  Reputation: 18099

Like
2Likes
Like

Posted 23 April 2014 - 12:27 PM

If you are looking for a tool to do this on the entire desktop, such tools already exist for free that can save you work. I use Greenshot, which, by the way, is open source so you can take a look and see how it works.

 

If you are looking to do this from inside your game, and only selecting a portion of your game window, then just use your API of choice to get the previous screen buffer, and copy a subrect of the RGB data and save that. Draw your own rect using your game's existing drawing code - just pause the logic of your game while doing so. I wouldn't touch Win32 at all for that, unless I was already writing the game in Win32. Think of the screenshot functionality as a in-game feature, and implement it within the confines of the structure of your game that already exists.

 

For me, using SFML, the actual screen-capturing code is as easy as:

sf::Image entireScreen = myRenderWindow.capture();
sf::Image portionOfScreen;
portionOfScreen.create(userSelectedRectangle.width, userSelectedRectangle.height);
portionOfScreen.copy(entireScreen, 0, 0, userSelectedRectangle);

portionOfScreen.saveToFile("screenshot.png");

How to get 'userSelectedRectangle' would be dependent on your game's architecture, but really shouldn't be hard.

 

[Edit:] Ah, but you aren't making a game, and you are wanting to capture a portion of the entire monitor, so everything I said above is irrelevant. ph34r.png


Edited by Servant of the Lord, 23 April 2014 - 12:35 PM.

It's perfectly fine to abbreviate my username to 'Servant' rather than copy+pasting it all the time.

[Fly with me on Twitter] [Google+] [My broken website]

All glory be to the Man at the right hand... On David's throne the King will reign, and the Government will rest upon His shoulders. All the earth will see the salvation of God.                                                                                                                                                            [Need web hosting? I personally like A Small Orange]
Of Stranger Flames - [indie turn-based rpg set in a para-historical French colony] | Indie RPG development journal





Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS