Jump to content
  • Advertisement
Sign in to follow this  
fread

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

This topic is 2009 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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?

Share this post


Link to post
Share on other sites
Advertisement

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

Share this post


Link to post
Share on other sites

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?

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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)

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!