A tool to convert bitmaps to region files

Environment: VC++ 4.2

Since the arcticle Transparent Window by Franz Polzer helped me a lot, I would like to contribute a little tool that converts bitmaps to region-files suitable to use as a window-mask (SetWindowRgn).

Why does anybody need this tool?

  • its flexible; its possible to adjust the key-color
  • its fast (not the tool, but your app); loading a region is better than creating it online
  • its free; source is included

How to use it?

    enter a source bitmap path (or press browse)
  • enter a key color (or click onto any pixel of the source bitmap)
  • press "calc !" wait and see the result
  • enter a destination path (or press browse)
  • press "write"

To use those region-files in your own project, you need to do the following: Import the *.RGN-file into your project-resources. The type of that resource needs to be set to "Data".

You can also import it manually by editing your *.rc file. Just insert something like the following:


Below is some example code that loads and activates a region, it should be called from something like "OnInitDialog".

//nRegionID - resource ID of the region data
BOOL CTransparentWnd::InitRegion (unsigned short nRegionID)
	const char *MSGCAPTION="Init Region";
	HRSRC hrsrc;		//handle of the resource	
	HGLOBAL hmem;		//handle to resource memory
	DWORD dwSize;		//size of our resource
	RGNDATA *rd;		//region data	
	CRgn rgn;			//the region itself	

	//try to locate the resource
	if ((hrsrc=FindResource(NULL,
	                         RT_RCDATA)) == NULL)
		MessageBox ("failed to find region",MSGCAPTION,MB_OK);
		return FALSE;
	//load the resource
	if ((hmem=LoadResource (NULL,hrsrc)) == NULL)
		MessageBox ("failed to load region",MSGCAPTION,MB_OK);
		return FALSE;
	//get the size of the region-data structure (= header + data)
	if ((dwSize=SizeofResource (NULL,hrsrc)) == 0)
		MessageBox ("region has an invalid size",MSGCAPTION,MB_OK);
		return FALSE;
	//lock the resource to get a pointer for it
	if ((rd=(RGNDATA *)LockResource (hmem)) == NULL)
		MessageBox ("failed to lock resource memory",MSGCAPTION,MB_OK);
		return FALSE;
	//create a region from our data
	if (!rgn.CreateFromData (NULL,dwSize,rd))
		MessageBox ("failed to create a region from that data",MSGCAPTION,MB_OK);
		return FALSE;
	if (!SetWindowRgn (GetSafeHwnd(),(HRGN)rgn,TRUE))
		MessageBox ("failed to set the region for that window",MSGCAPTION,MB_OK);
		return FALSE;
	//NOTE: win32-based apps do not need to unlock or free loaded resources (not manually)
	return TRUE;

Download project files - 34 KB

This article was originally published on January 24th, 1999

Most Popular Programming Stories

More for Developers

RSS Feeds

Thanks for your registration, follow us on our social networks to keep up-to-date