
Introduction
This article demonstrates the methods of capturing different portions of the
screen. You have the facility to then save the captured image to a file.
Background
The idea for developing the article came to me when I had downloaded such a
utility for capturing screen-shots for use in my articles like this one, on the
Internet, but unfortunately the downloaded utility had too many nagging screens
and obviously for a no-nags version I had to pay which I cannot afford. So the
only way out was to develop one on my own, the MSDN sample WinCap could have
served the purpose but the source was not available on the CD. So I started
developing the article in MFC using the Win32 sample provided on the MSDN CD
(WinCap). And also so as to be able to capture portions of the screen which I
had done sometime ago in Visual Basic, since screen capture in Visual Basic is
much easier and code for this is available in the Knowledge Base section of
Visual Basic.
Features
This article has the following features.
- Capture the Desktop
- Capture a window
- Capture a client area
- Capture a control (e.g. Button)
In addition it has the following, interesting but not so useful (in my view)
features:
- Track the X and Y coordinates of the captured image
- Trace the color code of a specific point of the captured image
Option for color and position tracking are on the MainFrame window of the
system and can only be used after capturing an image.
How to use the project
Download the project source, unzip the files to some folder, build the
project, in case there are no error at build-time, execute the project, a Icon
of a Camera will appear in the System Tray (bar at the bottom of the screen),
Right-Click on the the Icon and a menu will pop-up, select the options from the
menu.

Pop-up Menu
| Option |
Task performed |
| Capture Desktop |
Captures a image of the System Desktop immediately |
| Capture Window |
Prompts to click on window to be captured |
| Capture Client Area |
Prompts to click on client area to capture |
| Capture Control |
Prompts to click on control to capture |
| Clear Image |
Clears captured image |
| Show Window |
Display the CapIT System Window |
| Close |
Closes the CapIT System |
In addition to the pop-up menus the CapIT System has it own main menu which
cap be displayed when you select "Show Window" from the pop-up menu.
How it works
When capturing window or client area or control, the system calls the
function SetCapture() and waits for the user to click on some
window on the Desktop which is to be captured. After clicking on the area to be
captured, the system framework call the member function void
CCapITView::OnCaptureChanged(CWnd *pWnd) which calls
WindowCapture(HWND hwnd) which in turn carries out the job of
capturing the image (till the menu are disabled). After completion of capture
the system calls ReleaseCapture() to release
SetCapture(). But in the case of capturing the Desktop
SetCapture() is not called, but directly calls
WindowCapture(HWND hwnd) passing to it
GetDesktopWindow()->m_hWnd and the system proceeds with
capturing the Desktop image immediately, since there is only one Desktop area
and its HWND is known to the System.
Note :
The following member functions in the class CCapITView are
borrowed from the MSDN sample WinCap. Could I have written them on my own, No
Way.
HBITMAP CopyWindowToBitmap(CWnd* wnd , HWND hWnd, WORD fPrintArea)
HBITMAP CopyScreenToBitmap(LPRECT lpRect)
BOOL PaintBitmap(HDC hDC, LPRECT lpDCRect, HBITMAP hDDB, LPRECT
lpDDBRect, HPALETTE hPal)
void DoSize(CWnd* wnd , HBITMAP ghBitmap)
void SetupScrollBars(CWnd* wnd , WORD cxBitmap, WORD cyBitmap)
void ReallyGetClientRect(CWnd* wnd , LPRECT lpRect)
WORD SaveDIB(HDIB hDib, LPSTR lpFileName)
WORD PaletteSize (VOID FAR * pv)
WORD DibNumColors (VOID FAR * pv)
HDIB ChangeBitmapFormat(HBITMAP hBitmap, WORD wBitCount, WORD
dwCompression, HPALETTE hPal, HWND hwnd)
HANDLE AllocRoomForDIB(BITMAPINFOHEADER bi, HBITMAP hBitmap , HWND
hwnd)
HPALETTE GetSystemPalette(HWND hwnd)
int PalEntriesOnDevice(HDC hDC)
Known problems
Color of the saved image under Windows 98 is not the same as of the captured
image, but I think it is nearly the same in Windows 2000.
Points of interest
The project uses a CScrollView instead of CView
because if the image being captured is bigger in size (e.g. Desktop) then in the
Frame Window you may not be able to capture the entire image since a
CView will capture as per the CView Client Area
size.
History