Bitmap Problem
Wayne G. Maas -- wgmaas@usa.nai.net
Friday, November 15, 1996
Environment: Win 95, VC 4.2flat
---------------------------------------------
I've got a question I hope someone can help me with. It concerns
bitmaps.
I have some code that builds toolbars. The button bitmaps are
extracted
from various Windows applications. I am attempting to resize the
icon images
from 32x32 to 24x24 which is the button size I am using. The code
almost works.
I am getting the icon image but the image is in one color. The
on-line help states
that the CreateCompatibleDC will create a device context selects a
1-by-1
monochrome stock bitmap. So I believe that is why I am getting the
image in all
black.
My question, how can I get the colors to display correctly. Am I
overlooking something.
Any help would be appreciated. (The code segment appears below.)
Wayne
--------------
...
...
CDC dcIcon;
CBitmap bmpIcon;
CDC dcButton;
CBitmap bmpButton;
//extracts the icon from a windows application filename
HICON hIcon =
ExtractIcon(AfxGetInstanceHandle(),pActionTool->GetAppFileName(),0);
dcIcon.CreateCompatibleDC(NULL); // handle to memory device context
bmpIcon.FromHandle((HBITMAP)hIcon);
dcIcon.SelectObject(bmpIcon);
dcButton.CreateCompatibleDC(NULL);
bmpButton.CreateCompatibleBitmap(&dcButton, 24, 24);
dcButton.SelectObject(bmpButton);
SetStretchBltMode(dcButton, STRETCH_DELETESCANS);
dcButton.StretchBlt(0,0,23,23,&dcIcon,0,0,31,31,SRCCOPY);
...
...
Jim Barry -- Jim.Barry@ilp.com
Monday, November 18, 1996
[Mini-digest: 3 responses]
On 16 November 1996 04:29, Wayne G. Maas[SMTP:wgmaas@usa.nai.net] wrote:
>Environment: Win 95, VC 4.2flat
>---------------------------------------------
>
>I've got a question I hope someone can help me with. It concerns
>bitmaps.
>I have some code that builds toolbars. The button bitmaps are
>extracted
>from various Windows applications. I am attempting to resize the
>icon images
>from 32x32 to 24x24 which is the button size I am using. The code
>almost works.
>I am getting the icon image but the image is in one color. The
>on-line help states
>that the CreateCompatibleDC will create a device context selects a
>1-by-1
>monochrome stock bitmap. So I believe that is why I am getting the
>image in all
>black.
>
>My question, how can I get the colors to display correctly. Am I
>overlooking something.
>Any help would be appreciated. (The code segment appears below.)
>
>Wayne
>
>--------------
>...
>...
>CDC dcIcon;
>CBitmap bmpIcon;
>
>CDC dcButton;
>CBitmap bmpButton;
>
>//extracts the icon from a windows application filename
>HICON hIcon =
>ExtractIcon(AfxGetInstanceHandle(),pActionTool->GetAppFileName(),0);
>
>dcIcon.CreateCompatibleDC(NULL); // handle to memory device context
>bmpIcon.FromHandle((HBITMAP)hIcon);
>dcIcon.SelectObject(bmpIcon);
>
>dcButton.CreateCompatibleDC(NULL);
>bmpButton.CreateCompatibleBitmap(&dcButton, 24, 24);
>dcButton.SelectObject(bmpButton);
>
>SetStretchBltMode(dcButton, STRETCH_DELETESCANS);
>dcButton.StretchBlt(0,0,23,23,&dcIcon,0,0,31,31,SRCCOPY);
>...
Don't use a memory DC for creating the compatible bitmap - use a screen DC:
CClientDC dcScreen(NULL);
bmpButton.CreateCompatibleBitmap(&dcScreen, 24, 24);
...
See article Q139165 "PRB: Memory DC Produces Monochrome Images" if you want to know why.
Jim Barry
Interactive Learning Productions
Newcastle upon Tyne, UK
-----From: joew@statsoft.com (Joe Willcoxson)
Try using CopyImage(). You can get it to scale from 32x32 to 24x24.
--
Joe Willcoxson (joew@statsoft.com)
Senior Software Engineer
Visit us: http://www.statsoft.com
Visit me: http://users.aol.com/chinajoe
-----From: "Umesh Chandwani"
Hi Wayne,
Your problem lies in the following line(as you have already guessed.)
bmpButton.CreateCompatibleBitmap(&dcButton, 24, 24);
This will create a monochrome bitmap.
Instead you must use the foll. lines of code.
[Moderator's note: The message ended here.]
Dong Chen -- d_chen@ix.netcom.com
Monday, November 18, 1996
I did it this way.
1. load the icon:
SHFILEINFO sfi;
CString strFile;
HICON hicon
// strFile is the path of your application to load icon from
// it can be an .exe or a .lnk etc.
// hicon is the handle of the icon
SHGetFileInfo(strFile, 0, &sfi, sizeof(SHFILEINFO), SHGFI_ICON |
SHGFI_SHELLICONSIZE );
hicon = sfi.hIcon;
//Refer to the help for more flags
2. create memory dc
CDC dcMem;
dcMem.CreateCompatibleDC(pDC);
// where pDC is the pointer to your parinting dc
// it can be CDC, CPaintDC*, CClientDC* etc depends on where you call your
draw icon function which I can't tell from your posting
3. create bitmap
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(pDC, 32, 32))
4. draw to memory
CBitmap* pBitmapOld = dcMem.SelectObject(&bitmap);
dcMem.DrawIcon(0, 0, hicon);
5. bilt it
pDC->StretchBlt(startx, starty, 24, 24,
&dcMem, 0, 0, 32, 32, SRCCOPY);
Of course, there are some other things you need to take care of. Such as
background painting, restore the gdi objects, 3D look, and focus and
selected modes etc.
--
Dong
d_chen@ix.netcom.com
Andi Giri -- agiri@ctiis.com
Thursday, November 21, 1996
In response to Wayne G. Maas's query "Bitmap Problem"
Jim Barry says:
>Don't use a memory DC for creating the compatible bitmap - use a screen
>DC:
>
>CClientDC dcScreen(NULL);
>bmpButton.CreateCompatibleBitmap(&dcScreen, 24, 24);
>...
>
>See article Q139165 "PRB: Memory DC Produces Monochrome Images" if you
>want to know why.
>
There is no need to make the destination DC as a screen DC.
As far as we create the destination bitmap using a screen (client) DC,
we are fine. Hnce, it will suffice to just change the line
FROM:
>bmpButton.CreateCompatibleBitmap(&dcButton, 24, 24);
TO:
>bmpButton.CreateCompatibleBitmap(&dcIcon, 24, 24);
because dcIcon was created as a screen bitmap as follows:
>dcIcon.CreateCompatibleDC(NULL);
>Following is a quote from the on-line help for
CreateCompatibleDC(NULL);
If pDC is NULL, the function creates a memory device context that is
compatible with the system display.
Andi
| Вернуться в корень Архива
|