社本@元ネオニート Blog

社本@元ネオニート (元々ワック) のいたずら書き (for Programmers)

AILight Banner
AILight Blog

プロフィール

社本@元ネオニート Blog
働いたら負けかなと思っていたのですが。。とうとう働き始めました。アメリカのシアトル・エリアにある企業向けのバックアップソフトを開発している会社です。日本人は私だけ。なんとか。。やっていけてるようです。

目次

Blog 利用状況

記事分類

過去の記事

タグ

状態ごと(コールド, ホット, ディセーブル)のイメージを持ったツールバーの作成 - WTL/IE

IE4から、状態ごと(ノーマル, ホット, ディセーブル)のイメージを持ったツールバーがサポートされました。
このツールバーの作成する関数クラス(関数)を、作ってみました。(これまた、何年も前だけど)
かなり、面倒だってことが分かるかと思います。。

---
template <class T, class TBase = CFrameWindowImpl>
class CFrameWindowImpl2 : public TBase
{
public:
 CFrameWindowImpl2()
 {
 }
 ~CFrameWindowImpl2()
 {
 }

public:
 // ホットイメージのサポート
 static HWND CreateSimpleToolBarCtrl(HWND hWndParent, UINT nResourceID, UINT nHotResourceID, UINT nDisabledResourceID,
  BOOL bInitialSeparator = FALSE, DWORD dwStyle = ATL_SIMPLE_TOOLBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR, int nMarginX = 7, int nMarginY = 7)
 {
  HINSTANCE hInst = _Module.GetResourceInstance();
  HRSRC hRsrc = ::FindResource(hInst, MAKEINTRESOURCE(nResourceID), RT_TOOLBAR);
  if (hRsrc == NULL)
   return NULL;

  HGLOBAL hGlobal = ::LoadResource(hInst, hRsrc);
  if (hGlobal == NULL)
   return NULL;

  T::_AtlToolBarData* pData = (T::_AtlToolBarData*)::LockResource(hGlobal);
  if (pData == NULL)
   return NULL;
  ATLASSERT(pData->wVersion == 1);

  WORD* pItems = pData->items();
  int nItems = pData->wItemCount + (bInitialSeparator ? 1 : 0);
  TBBUTTON* pTBBtn = (TBBUTTON*)_alloca(nItems * sizeof(TBBUTTON));

  // set initial separator (half width)
  if(bInitialSeparator)
  {
   pTBBtn[0].iBitmap = 4;
   pTBBtn[0].idCommand = 0;
   pTBBtn[0].fsState = 0;
   pTBBtn[0].fsStyle = TBSTYLE_SEP;
   pTBBtn[0].dwData = 0;
   pTBBtn[0].iString = 0;
  }

  int nBmp = 0;
  for(int i = 0, j = bInitialSeparator ? 1 : 0; i < pData->wItemCount; i++, j++)
  {
   if(pItems[i] != 0)
   {
    pTBBtn[j].iBitmap = nBmp++;
    pTBBtn[j].idCommand = pItems[i];
    pTBBtn[j].fsState = TBSTATE_ENABLED;
    pTBBtn[j].fsStyle = TBSTYLE_BUTTON;
    pTBBtn[j].dwData = 0;
    pTBBtn[j].iString = 0;
   }
   else
   {
    pTBBtn[j].iBitmap = 8;
    pTBBtn[j].idCommand = 0;
    pTBBtn[j].fsState = 0;
    pTBBtn[j].fsStyle = TBSTYLE_SEP;
    pTBBtn[j].dwData = 0;
    pTBBtn[j].iString = 0;
   }
  }

  HWND hWnd = ::CreateWindowEx(0, TOOLBARCLASSNAME, NULL, dwStyle, 0,0, 50, 40,
    hWndParent, (HMENU)LongToHandle(nID), _Module.GetModuleInstance(), NULL);

  ::SendMessage(hWnd, TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0L);

  // check if font is taller than our bitmaps
  CFontHandle font = (HFONT)::SendMessage(hWnd, WM_GETFONT, 0, 0L);
  if(font.IsNull())
   font = AtlGetDefaultGuiFont();
  LOGFONT lf;
  font.GetLogFont(lf);
  WORD cyFontHeight = (WORD)abs(lf.lfHeight);

  // Cold
  if (CFrameWindowImpl2::GetColorDepthFromResource(nResourceID) != 8)
  {
   HIMAGELIST hImageList = ImageList_LoadImage(
    _Module.GetResourceInstance(), MAKEINTRESOURCE(nResourceID), pData->wWidth, 1, 
    CLR_NONE, IMAGE_BITMAP, LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
   ATLASSERT(hImageList != NULL);
   ::SendMessage(hWnd, TB_SETIMAGELIST, 0, (LPARAM)hImageList);
  }
  else
  {
   HIMAGELIST hImageList = ImageList_LoadImage(
    _Module.GetResourceInstance(), MAKEINTRESOURCE(nResourceID), pData->wWidth, 1, 
     RGB(255, 0, 255), IMAGE_BITMAP, LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
   ATLASSERT(hImageList != NULL);
   ImageList_SetBkColor(hImageList, ::GetSysColor(COLOR_3DFACE));
   ::SendMessage(hWnd, TB_SETIMAGELIST, 0, (LPARAM)hImageList);
  }

  // Hot
  if (CFrameWindowImpl2::GetColorDepthFromResource(nResourceID) != 8)
  {
   HIMAGELIST hImageList = ImageList_LoadImage(
    _Module.GetResourceInstance(), MAKEINTRESOURCE(nHotResourceID), pData->wWidth, 1, 
    CLR_NONE, IMAGE_BITMAP, LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
   ATLASSERT(hImageList != NULL);
   ::SendMessage(hWnd, TB_SETHOTIMAGELIST, 0, (LPARAM)hImageList);
  }
  else
  {
   HIMAGELIST hImageList = ImageList_LoadImage(
    _Module.GetResourceInstance(), MAKEINTRESOURCE(nHotResourceID), pData->wWidth, 1, 
     RGB(255, 0, 255), IMAGE_BITMAP, LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
   ATLASSERT(hImageList != NULL);
   ImageList_SetBkColor(hImageList, ::GetSysColor(COLOR_3DFACE));
   ::SendMessage(hWnd, TB_SETHOTIMAGELIST, 0, (LPARAM)hImageList);
  }

  // Disabled
  if (CFrameWindowImpl2::GetColorDepthFromResource(nResourceID) != 8)
  {
   HIMAGELIST hImageList = ImageList_LoadImage(
    _Module.GetResourceInstance(), MAKEINTRESOURCE(nDisabledResourceID), pData->wWidth, 1, 
    CLR_NONE, IMAGE_BITMAP, LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
   ATLASSERT(hImageList != NULL);
   ::SendMessage(hWnd, TB_SETDISABLEDIMAGELIST, 0, (LPARAM)hImageList);
  }
  else
  {
   HIMAGELIST hImageList = ImageList_LoadImage(
    _Module.GetResourceInstance(), MAKEINTRESOURCE(nDisabledResourceID), pData->wWidth, 1, 
     RGB(255, 0, 255), IMAGE_BITMAP, LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
   ATLASSERT(hImageList != NULL);
   ImageList_SetBkColor(hImageList, ::GetSysColor(COLOR_3DFACE));
   ::SendMessage(hWnd, TB_SETDISABLEDIMAGELIST, 0, (LPARAM)hImageList);
  }

  TBADDBITMAP tbab;
  tbab.hInst = hInst;
  tbab.nID = nResourceID;
  ::SendMessage(hWnd, TB_ADDBUTTONS, nItems, (LPARAM)pTBBtn);
  ::SendMessage(hWnd, TB_SETBITMAPSIZE, 0, MAKELONG(pData->wWidth, max(pData->wHeight, cyFontHeight)));
#if 0
  ::SendMessage(hWnd, TB_SETBUTTONSIZE, 0, MAKELONG(pData->wWidth + 7, max(pData->wHeight, cyFontHeight) + 7));
#else
  // "ヘルプとサポート センター"の幅に合わせた
//  ::SendMessage(hWnd, TB_SETBUTTONSIZE, 0, MAKELONG(pData->wWidth + 10, max(pData->wHeight, cyFontHeight) + 10));
  ::SendMessage(hWnd, TB_SETBUTTONSIZE, 0, MAKELONG(pData->wWidth + nMarginX, max(pData->wHeight, cyFontHeight) + nMarginY));
#endif

  return hWnd;
 }

public:
 static int GetColorDepthFromResource(_U_STRINGorID image)
 {
  HRSRC hResource = ::FindResource(_pModule->GetResourceInstance(), image.m_lpstr, RT_BITMAP);
  ATLASSERT(hResource != NULL);
  HGLOBAL hGlobal = ::LoadResource(_pModule->GetResourceInstance(), hResource);
  ATLASSERT(hGlobal != NULL);
  LPBITMAPINFOHEADER pBitmapInfoHeader = (LPBITMAPINFOHEADER)::LockResource(hGlobal);
  ATLASSERT(pBitmapInfoHeader != NULL);
  return pBitmapInfoHeader->biBitCount;
 }
};
---

投稿日時 : 2005年10月15日 5:34


コメントを追加

タイトル
名前
URL
コメント