A tool to convert bitmaps to region files
Posted
by Till Toenshoff
on January 24th, 1999
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:
IDR_SAMPLE_REGION RCDATA DISCARDABLE "res\\sample.rgn"
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,
(LPCSTR)nRegionID,
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;
}
//setup
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;
}

Comments
Problems with RCDATA in Visual Studio .NET ?
Posted by Legacy on 01/01/2004 12:00amOriginally posted by: Till Toenshoff
I experienced strange problems when including custom resources (RCDATA) into the application .rc-file.
The .NET resource editor kept removing the "RCDATA"-expression which lead to a syntax error. That smart .NET resource compiler returns errors for lines that are just fine - mean trap.
It took me a lot some time to find out that the best place for keeping such resource includes is within the .rc2-file. Once included in that file (and not within the .rc anymore), this resource is not listed or touched by the resource editor.
Hope that helps!
cheers,
Replytill
Small Fix for memory leak and load diferent type bitmaps
Posted by Legacy on 03/30/2001 12:00amOriginally posted by: Plamen Grigorov
ReplyA Wrote a MUCH Better Tool for Regions
Posted by Legacy on 02/07/2001 12:00amOriginally posted by: Bill SerGio
I wrote a program that will let you create a region from image file format like .jpg, .bmp, .gif, .mpg, .ico, etc. FASTER than any of the code posted on CodeGuru or any other site on the Internet. You can read my article on creating regions and download the FREE sample project at:
http://www.codearchive.com/~sergio/slickskins.htm
Best regards,
ReplyBill SerGio
sergio@codearchive.com
problem loading 256 bit bitmaps
Posted by Legacy on 10/31/2000 12:00amOriginally posted by: Shaun Wilde
ReplyMore info about region file please
Posted by Legacy on 03/29/2000 12:00amOriginally posted by: Robert Christiaanse
Hello,
I have created a program in Delphi which does exactly the same thing. It is funny to see that it is almost the same way implemented. The difference is, I create a list of the points of the polygon (region) and show it to the user.
(12,13),
(17,15),
(11,3),
(14,17)
A programmer can define an array of points for his region an than use the Windows Api function to create it.
You create a region file. Can you tell me how I should read this file? What is the format? (Maybe I can find it in your code, but he, I am a (not so clever) Delphi programmer.
Thanx. Good job!
ReplyA Similar Tool
Posted by Legacy on 05/14/1999 12:00amOriginally posted by: Richard de Oude
I have written a similar tool to this and posted it in the Tool section.
ReplySolution to NT and Write failure problems
Posted by Legacy on 04/14/1999 12:00amOriginally posted by: Paul Martinsen
ReplyThis tool doesn't work under windows NT
Posted by Legacy on 03/02/1999 12:00amOriginally posted by: N. Albers
Hello,
It's a nice tool, but is doesn't work under Windows NT.
It gives an Assertion falure on:
Bmp2RgnDlg.cpp line 232:
nSize=pRgn->GetRegionData (NULL,0);
ASSERT (nSize);
Something goes wrong here under NT.
Regards,
N. Albers
ReplyWrite Failure
Posted by Legacy on 01/28/1999 12:00amOriginally posted by: Travis Miller
Reply