zoukankan      html  css  js  c++  java
  • 关于工具栏真彩位图的加载问题

    /***=========================================================================
    ====                                                                     ====
    ====                          D C U t i l i t y                          ====
    ====                                                                     ====
    =============================================================================
    ====                                                                     ====
    ====    File name           :  TrueColorToolBar.cpp                      ====
    ====    Project name        :  Tester                                    ====
    ====    Project number      :  ---                                       ====
    ====    Creation date       :  13/1/2003                                 ====
    ====    Author(s)           :  Dany Cantin                               ====
    ====                                                                     ====
    ====                  Copyright ?DCUtility  2003                        ====
    ====                                                                     ====
    =============================================================================
    ===========================================================================*/
    
    #include "stdafx.h"
    #include "TrueColorToolBar.h"
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
    
    /////////////////////////////////////////////////////////////////////////////
    // CTrueColorToolBar
    
    CTrueColorToolBar::CTrueColorToolBar()
    {
    	m_bDropDown = FALSE;
    }
    
    CTrueColorToolBar::~CTrueColorToolBar()
    {
    }
    
    
    BEGIN_MESSAGE_MAP(CTrueColorToolBar, CToolBar)
    	//{{AFX_MSG_MAP(CTrueColorToolBar)
    	ON_NOTIFY_REFLECT(TBN_DROPDOWN, OnToolbarDropDown)
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    
    /////////////////////////////////////////////////////////////////////////////
    // CTrueColorToolBar message handlers
    BOOL CTrueColorToolBar::LoadTrueColorToolBar(int  nBtnWidth,
    											 UINT uToolBar,
    											 UINT uToolBarHot,
    											 UINT uToolBarDisabled)
    {
    	if (!SetTrueColorToolBar(TB_SETIMAGELIST, uToolBar, nBtnWidth))
    		return FALSE;
    	
    	if (uToolBarHot) {
    		if (!SetTrueColorToolBar(TB_SETHOTIMAGELIST, uToolBarHot, nBtnWidth))
    			return FALSE;
    	}
    
    	if (uToolBarDisabled) {
    		if (!SetTrueColorToolBar(TB_SETDISABLEDIMAGELIST, uToolBarDisabled, nBtnWidth))
    			return FALSE;
    	}
    
    	return TRUE;
    }
    
    
    BOOL CTrueColorToolBar::SetTrueColorToolBar(UINT uToolBarType, 
    							     	        UINT uToolBar,
    										    int  nBtnWidth)
    {
    	CImageList	cImageList;
    	CBitmap		cBitmap;
    	BITMAP		bmBitmap;
    	
    	if (!cBitmap.Attach(LoadImage(AfxGetResourceHandle(), MAKEINTRESOURCE(uToolBar),
    								  IMAGE_BITMAP, 0, 0,
    								  LR_DEFAULTSIZE|LR_CREATEDIBSECTION)) ||
    	    !cBitmap.GetBitmap(&bmBitmap))//存储位图信息到结构体
    		return FALSE;
    
    
    			CSize		cSize(bmBitmap.bmWidth, bmBitmap.bmHeight); //位图大小
    			int			nNbBtn	= cSize.cx/nBtnWidth;//按钮个数
    			//对于真彩也就是大于256的像素,the actual bitmap data (color) is the color itself, relative intensities of RGB. 
    		RGBTRIPLE*	rgb		= (RGBTRIPLE*)(bmBitmap.bmBits);//获得像素内存块地址
    			COLORREF	rgbMask	= RGB(rgb[0].rgbtRed, rgb[0].rgbtGreen, rgb[0].rgbtBlue);//获得掩码,掩码就是与的概念吧,目的是背景色和窗口一致
    			
    			if (!cImageList.Create(nBtnWidth, cSize.cy, ILC_COLOR24|ILC_MASK, nNbBtn, 0))
    				return FALSE;
    		
    //	COLORREF	rgbMask	= RGB(255,255,255);
    
    
    	if (cImageList.Add(&cBitmap, rgbMask) == -1)
    		return FALSE;
    
    	SendMessage(uToolBarType, 0, (LPARAM)cImageList.m_hImageList);
    	cImageList.Detach(); 
    	cBitmap.Detach();
    	
    	return TRUE;
    }
    
    void CTrueColorToolBar::AddDropDownButton(CWnd* pParent, UINT uButtonID, UINT uMenuID)
    {
    	if (!m_bDropDown) {
    		GetToolBarCtrl().SendMessage(TB_SETEXTENDEDSTYLE, 0, (LPARAM)TBSTYLE_EX_DRAWDDARROWS);
    		m_bDropDown = TRUE;
    	}
    
    	SetButtonStyle(CommandToIndex(uButtonID), TBSTYLE_DROPDOWN);
    
    	stDropDownInfo DropDownInfo;
    	DropDownInfo.pParent	= pParent;
    	DropDownInfo.uButtonID	= uButtonID;
    	DropDownInfo.uMenuID	= uMenuID;
    	m_lstDropDownButton.Add(DropDownInfo);
    }
    
    void CTrueColorToolBar::OnToolbarDropDown(NMTOOLBAR* pnmtb, LRESULT *plr)
    {
    	for (int i = 0; i < m_lstDropDownButton.GetSize(); i++) 
    	{
    		
    		stDropDownInfo DropDownInfo = m_lstDropDownButton.GetAt(i);
    
    		if (DropDownInfo.uButtonID == UINT(pnmtb->iItem)) 
    		{
    
    			CMenu menu;
    			menu.LoadMenu(DropDownInfo.uMenuID);
    			CMenu* pPopup = menu.GetSubMenu(0);
    			
    			CRect rc;
    			SendMessage(TB_GETRECT, (WPARAM)pnmtb->iItem, (LPARAM)&rc);
    			ClientToScreen(&rc);
    			
    			pPopup->TrackPopupMenu(TPM_LEFTALIGN/*|TPM_LEFTBUTTON|TPM_VERTICAL*/,
    				                   rc.left, rc.bottom, DropDownInfo.pParent, &rc);
    			break;
    		}
    	}
    }
    

      

  • 相关阅读:
    Java内存模型原理,你真的理解吗?
    CentOS 7.4 下搭建 Elasticsearch 6.3 搜索群集
    CentOS 7下ElasticSearch集群搭建案例
    分布式系统理论基础
    分布式系统理论进阶
    Paxos,Raft,Zab一致性协议-Raft篇
    P2P 网络核心技术:Gossip 协议
    分布式系统Paxos算法
    Hacker News的热门排名算法(转)
    Elasticsearch分布式机制和document分析
  • 原文地址:https://www.cnblogs.com/xzlq/p/3134200.html
Copyright © 2011-2022 走看看