|
What format are the source bitmaps? BMPs don't have a notion of transparency but a 32 bpp BMP
has an extra byte you could use as an alpha blending value. GDI+ can work with transparency.
|
|
|
|
|
Thanks Mark.
The bitmaps were converted from PNGs or GIFs using Corel Draw. In Corel, the background is removed and doesn't show. Then when I choose to export it and use it in Visual Studio, it will show a white background when it is used in the software.
How do I do the things you mentioned?
BP
|
|
|
|
|
Although 32 bit bitmaps do contain an extra bit, there is nothing in GDI or GDI+ which uses this as a transparency mask. Your best bet is to pick a color to be transparent, set your border to this color, and use TransparentBlt. If you're using GDI+, you can set a transparency range, but you shouldn't need to do that.
|
|
|
|
|
Thanks Christian,
Can you point me to an example of TransparentBlt in usage?
Thanks,
BP
|
|
|
|
|
Any of the hits I got when I typed 'transparentblt' into google would have done, but this one is on MSDN, which is where you should generally look for this sort of info:
Here
|
|
|
|
|
Thanks Christian, I saw that but I don't know where to get all the values for that function's arguments, where to place it in the software (i.e. CMainFrm, CView), when to call it, etc... Do you know if there is a project here that uses it so that I can see how to use that function? Since I import it as a resource, I don't know how to get a hold of it or even adjust it's transparency setting.
Thanks,
BP
|
|
|
|
|
There is no transparency setting, you specify the color that is to be transparent. You can use LoadImage to load a bitmap from resources. You most probably want to paint it in your WM_PAINT event handler.
Where you call it depends entirely on where the code is that is drawing the icon, which depends on where the icon is being displayed.
|
|
|
|
|
Last question, when I do that, how do I specify the color that is to be transparent?
|
|
|
|
|
I would tend to use the last parameter of TransparentBlt to do that:
UINT crTransparent You can specify a color in hex, 0xFFCC00 is FF red, CC green, 00 blue.
|
|
|
|
|
Instead of converting to bitmaps (where you lose transparency) you can load them as GDI+
Bitmap objects and GDI+ will handle the alpha blending right for transparency.
As a starting point, try something like this in OnPaint or OnEraseBkgnd...wherever you're painting
a window...
HICON hIcon = ::LoadIcon(AfxGetInstanceHandle(), CResId(IDR_MAINFRAME));
Bitmap bitmap(hIcon);
Graphics graphics(*pDC);
graphics.DrawImage(&bitmap, 0, 0);
Of course, in real life you wouldn't want to reload an icon resource (or worse, bitmap from a
file) every time you paint so you'd load it once (in the window class constructor or OnCreate)
and use the same object to draw every time.
This just makes a simple test example...try it
To try it on PNGs and GIFs replace these lines
HICON hIcon = ::LoadIcon(AfxGetInstanceHandle(), CResId(IDR_MAINFRAME));
Bitmap bitmap(hIcon);
with
Bitmap bitmap(L"path\MyPNGFile.png", TRUE);
|
|
|
|
|
Thanks Mark.
Do you also know how to use the CImage::SetTransparentColor(...) function?
Thanks,
BP
|
|
|
|
|
BlitzPackage wrote: Do you also know how to use the CImage::SetTransparentColor(...) function?
I've never used the CImage class...sorry.
|
|
|
|
|
I took a glance at CImage - It looks like it uses GDI+ as well so I would assume that if
you load the original icons/gifs/pngs (not the ones converted to bitmaps) they should draw
properly like the code sample I posted.
|
|
|
|
|
Thanks Mark.
If I do that, how do I get them to their proper place on the toolbars, buttons, menus, etc...?
BP
|
|
|
|
|
Ohhhh you are using them as bitmaps on conrols? I thought you were just rendering them to the
screen in a window
In that case I would put them in a bitmap and use image lists in the code.
Example 18 pixel wide bitmap(s) using bright green as transparent color in the bitmaps:
CImageList MyImageList;
...
MyImageList.Create(IDB_BITMAP, 18, 18, RGB(0x00,0xFF,0x00));
This will get you an image list. Check out the controls you're using and look for SetImageList()
method in the classes (CToolBar, CButton, etc.)
I could post some sample code but I'm not sure what exactly you are trying to do with the bitmaps.
Mark
|
|
|
|
|
Thanks Mark,
If you could post some sample code that would be great. I am just trying to use them as menu icons, button icons, tool bar icons, etc...
Any help you can provide would be great.
Thanks again.
BP
|
|
|
|
|
Here's an example of a Windows toolbar common control with two buttons...
Add these to your window class:
CToolBarCtrl ToolBar;
CImageList MyImageList;
Add this to your window class' .cpp file
static TBBUTTON ToolBarButtonDescs[] =
{
{0, ID_BUTTON1, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0,0}, 0, 0} ,
{1, ID_BUTTON2, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0,0}, 0, 0}
};
Add this to the window class constructor
MyImageList.Create(IDB_BITMAP, 18, 18, RGB(0x00,0xFF,0x00));
Add this to the window class' OnCreate() (WM_CREATE handler)
ToolBar.Create(WS_CHILD | WS_VISIBLE, CRect(0,0,100,20), this, ID_TOOLBAR);
ToolBar.SetImageList(&MyImageList);
ToolBar.AddButtons(sizeof(ToolBarButtonDescs) / sizeof(TBBUTTON), ToolBarButtonDescs);
The trick is creating the image list bitmap. In this case I have two buttons, 18 pixels wide so
add a bitmap resource 36x18. I've set the bitmap index for button 1 to index 0 and button 2 to
index 1 in the image list. So the rect (0,0,17,17) in the bitmap needs to be the image you want
on the first button and the rect (18,0,35,17) will be the image for the second button. I've
specified RGB(0x00,0xFF,0x00) (bright green) as the transparent color so draw any areas you want
to be transparent in that color. The image list bitmap is the images for all the buttons side-by-
side. I've used 18 pixel wide bitmap (per button) as an example but you can use whatever width
you want. The height will be calculated automagically based on the image width you specify in
this call:
MyImageList.Create(IDB_BITMAP, 18, 18, RGB(0x00,0xFF,0x00));
where the first 18 is the per-image width in the list and the second 18 is the grow-by value
when programatically adding bitmaps to the list.
You can use a different transparency color too.
Make sense?
|
|
|
|
|
Thanks Mark,
That is very understandable. I will apply what you have provided. For buttons, I guess I will use the SetImageList function...right?
Thanks again,
BP
|
|
|
|
|
BlitzPackage wrote: For buttons, I guess I will use the SetImageList function...right?
You can. I just took another look at that...its for XP+/Comclt32.dll version 6.0+ only.
For individual buttons you may want to use icon resources (for transparency)...
CButton button;
...
button.SetIcon(AfxGetApp()->LoadIcon(IDI_ICON));
|
|
|
|
|
what i want:
i have a dialog with 4 buttons on it each time i push a button a different dialog will open and hide the first dialog then when i close that dialog the first opens again.
what i have:
i have it where it will open the other dialogs i just cant figure out how to get the first to reopen when i close the other dialogs.
i need the part that going in the other dialogs that will open the first dialog when it closes and cant figure it out.
this is in the main dialog
::ShowWindow(m_hWnd, SW_HIDE);<br />
p2->ShowWindow(SW_SHOW); <--- thoes 2 lines work
i tryed passing the handle of the main to the rest still didnt work
|
|
|
|
|
I am new to VC++/MFC, so I am sure someone will have a more elegant solution. Try this approach:
When the button is pushed on the first dialog, save whatever settings of the member variables you need, then call the default IDOK (CDialog::OnOK()) - default OnOK will close the dialog box
Call DoModal on the other Dialog, then, when finished before calling DoModal on the first dialog, set its member variable appropriately, then call DoModal
Hope this helps.
Peace,
BP
|
|
|
|
|
i got it!!!
|
|
|
|
|
|
p2->maindlg = m_hWnd; in main dialog and
void PrivacyCleaner::OnClose() <br />
{<br />
<br />
::ShowWindow(maindlg, SW_SHOW);<br />
CDialog::OnClose();<br />
}<br />
<br />
void PrivacyCleaner::OnCloseButton() <br />
{<br />
CDialog::EndDialog(0);<br />
OnClose(); <br />
}
in other dialogs
|
|
|
|
|
I just found this: http://msdn2.microsoft.com/en-us/library/wddd3ztw(VS.80).aspx
You can call CDialog::EndDialog(int nResult). Any value will do for nResult.
Hope this helps.
BP
|
|
|
|
|