[ ページコメント(0) ] [ トラックバック(0) ]
Counter: 1262,
today: 2,
yesterday: 1
ツールバーに256色(8bit)の画像を使用する
ツールバーは通常4bit16色の画像以外を使用すると
正しく表示されません。
ですのでそれを修正したCExtToolBarを作成しました。
面倒くさいので説明はしませんが、
下記と同様なクラスを作成し、
LoadToolBarを呼ぶ代わりにLoadExtToolBarを呼んでください。
//ExtToolBar.cpp
#include "stdafx.h"
#include "ExtToolBar.h"
struct CToolBarData
{
WORD wVersion;
WORD wWidth;
WORD wHeight;
WORD wItemCount;
//WORD aItems[wItemCount]
WORD* items()
{ return (WORD*)(this+1); }
};
IMPLEMENT_DYNAMIC(CExtToolBar, CToolBar)
CExtToolBar::CExtToolBar()
{
}
CExtToolBar::~CExtToolBar()
{
}
BEGIN_MESSAGE_MAP(CExtToolBar, CToolBar)
END_MESSAGE_MAP()
BOOL CExtToolBar::LoadExtToolBar(UINT nIDResource)
{
return LoadExtToolBar(MAKEINTRESOURCE(nIDResource));
}
BOOL CExtToolBar::LoadExtToolBar(LPCTSTR lpszResourceName)
{
switch( GetBitCount( lpszResourceName ) )
{
case 8:
return LoadExtToolBarNot4( lpszResourceName, ILC_COLOR8 );
}
return LoadToolBar( lpszResourceName );
}
BOOL CExtToolBar::LoadExtToolBarNot4( LPCTSTR lpszResourceName, int depth )
{
CImageList img;
CBitmap bmp;
HIMAGELIST himg;
HBITMAP hbmp;
int i;
UINT *pItems;
BOOL bResult;
HINSTANCE hInst = AfxFindResourceHandle(lpszResourceName, RT_TOOLBAR);
HRSRC hRsrc = ::FindResource(hInst, lpszResourceName, RT_TOOLBAR);
if (hRsrc == NULL)
return FALSE;
HGLOBAL hGlobal = LoadResource(hInst, hRsrc);
if (hGlobal == NULL)
return FALSE;
CToolBarData* pData = (CToolBarData*)LockResource(hGlobal);
if (pData == NULL)
return FALSE;
ASSERT(pData->wVersion == 1);
himg = ImageList_Create( 16, 15, depth | ILC_MASK, 0, 32 );
bmp.LoadBitmap( lpszResourceName );
hbmp = (HBITMAP)bmp.GetSafeHandle();
ImageList_AddMasked( himg, hbmp, RGB(192,192,192) );
img.Attach( himg );
GetToolBarCtrl().SetImageList( &img );
img.Detach();
DeleteObject( himg );
bmp.DeleteObject();
SetSizes( CSize(16 + 7,15 + 6), CSize(16,15) );
pItems = new UINT[pData->wItemCount];
for( i = 0; i < (int)pData->wItemCount; i++ )
{
pItems[i] = pData->items()[i];
}
bResult = SetButtons( pItems, pData->wItemCount );
UnlockResource(hGlobal);
FreeResource(hGlobal);
delete[] pItems;
return TRUE;
}
int CExtToolBar::GetBitCount(UINT nIDResource)
{
return GetBitCount(MAKEINTRESOURCE(nIDResource));
}
int CExtToolBar::GetBitCount( LPCTSTR lpszResourceName )
{
HINSTANCE hInst = AfxFindResourceHandle(lpszResourceName,RT_BITMAP);
HRSRC hRsrc = ::FindResource(hInst,lpszResourceName,RT_BITMAP);
int bitcount;
if (hRsrc == NULL){
hInst = NULL;
hRsrc = ::FindResource(hInst,lpszResourceName,RT_BITMAP);
}
if (hRsrc == NULL)return 0;
// determine how many colors in the bitmap
HGLOBAL hglb;
if ((hglb = LoadResource(hInst, hRsrc)) == NULL)
return 0;
LPBITMAPINFOHEADER lpBitmap = (LPBITMAPINFOHEADER)LockResource(hglb);
if (lpBitmap == NULL)return 0;
bitcount = lpBitmap->biBitCount;
::FreeResource(hglb);
return bitcount;
}
//CExtToolBar.h
#pragma once
// CExtToolBar
class CExtToolBar : public CToolBar
{
DECLARE_DYNAMIC(CExtToolBar)
public:
CExtToolBar();
virtual ~CExtToolBar();
protected:
DECLARE_MESSAGE_MAP()
protected:
BOOL LoadExtToolBarNot4( LPCTSTR lpszResourceName, int depth );
public:
BOOL LoadExtToolBar(UINT nIDResource);
BOOL LoadExtToolBar(LPCTSTR lpszResourceName);
int GetBitCount( UINT nIDResource );
int GetBitCount( LPCTSTR lpszResourceName );
};
付箋の編集