亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? cbmpmenu.cpp

?? 最新visualC++編程200例書籍源碼包括對數據庫的操作
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
	if (CToolBar::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	ModifyStyleEx(0, WS_EX_TOOLWINDOW);
	GetToolBarCtrl().SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);

	NONCLIENTMETRICS nc;
	ZeroMemory(&nc, sizeof(nc));
	nc.cbSize = sizeof(nc);
	SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &nc, 0);
	m_oMenuFont.CreateFontIndirect(&nc.lfMenuFont);
	SetFont(&m_oMenuFont);

	return 0;
}

void MenuToolBar::OnLButtonDown(UINT nFlags, CPoint point) 
{
	//Calculate button index and post a user define message to ourselves..so that this function returns immediately
	int nBtnIndex = GetToolBarCtrl().HitTest(&point);

	TBBUTTON tbb;
	GetToolBarCtrl().GetButton(nBtnIndex, &tbb);

	//if this button is disabled or grayed down...then we simply return
	BOOL bRet = (((MENUITEMINFO*)(tbb.dwData))->fState & MF_GRAYED) || 
					(((MENUITEMINFO*)(tbb.dwData))->fState & MF_DISABLED);

	if(bRet)
		return;

	if(nBtnIndex >= 0)
	{
		if(m_nLastLBDownIndex != nBtnIndex)
		{
			//If already another popup menu was opened, then we need to close that window
			((CBmpMenu*)GetParent())->DestroySubMenus();

			PostMessage(WM_LBUTTONDOWNAFTER, nFlags, MAKELPARAM(point.x, point.y));

			m_nLastLBDownIndex = nBtnIndex;
		}
	}
}

void MenuToolBar::OnPostLbuttonMsg(UINT nFlags, LPARAM lp)
{
	//claculate the button index
	CPoint point(LOWORD(lp), HIWORD(lp));

	int nBtnIndex = GetToolBarCtrl().HitTest(&point);
	TBBUTTON tbb;
	GetToolBarCtrl().GetButton(nBtnIndex, &tbb);

	//if the click was on a button corresponding to popup item, then we need to open up popup menu 
	//and don't pass the message up windows hirarchy.
	if(tbb.dwData && ((MENUITEMINFO*)(tbb.dwData))->hSubMenu)
	{
		((CBmpMenu*)GetParent())->SendMessage(WM_POPUPSUBMENU, lp, (MENU_SELECTFIRSTITEM & nFlags)?MENU_SELECTFIRSTITEM:0);
		return;
	}

	//If this is a valid button and no submenu then send wm_command message to owner and close all menus
	((CBmpMenu*)GetParent())->m_pOwnerWnd->PostMessage(WM_COMMAND, MAKEWPARAM(tbb.idCommand, 0), 0);
	((CBmpMenu*)GetParent())->DestroyRootMenu();
}


void MenuToolBar::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	int nBtnIndex = GetToolBarCtrl().HitTest(&point);

	//skip mouse move message if this button is disabled or grayed or inactive
	TBBUTTON tbb;
	GetToolBarCtrl().GetButton(nBtnIndex, &tbb);

	//if this button is disabled or grayed down...then we simply return
	BOOL bRet = (((MENUITEMINFO*)(tbb.dwData))->fState & MF_GRAYED) || 
					(((MENUITEMINFO*)(tbb.dwData))->fState & MF_DISABLED);

	if(bRet)
		return;

	//skip WM_MOUSEMOVE message if the last mouse position is same as curent one.
	static CPoint pt(0,0);

	if(point != pt)
		pt = point;
	else
		return;

	if(nBtnIndex >= 0)
	{
		if(m_nLastHoverIndex != nBtnIndex)
		{
			m_nLastHoverIndex = nBtnIndex;
			m_oHoverPt = point;

			//Hovetrack only for submenu items
			TRACKMOUSEEVENT tme = {sizeof(tme), TME_HOVER, m_hWnd, 0};

			_TrackMouseEvent(&tme);
		}
	}

	CToolBar::OnMouseMove(nFlags, point);
}

LRESULT MenuToolBar::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
	// TODO: Add your specialized code here and/or call the base class
	//Garb WM_MOUSEHOVER message
	if(message == WM_MOUSEHOVER)
	{
		if(m_nLastHoverIndex >= 0)
		{
			TBBUTTON tbb;
			GetToolBarCtrl().GetButton(m_nLastHoverIndex, &tbb);

			if(tbb.dwData)
			{
				//pass on left mouse down event for submenu items
				if(((MENUITEMINFO*)(tbb.dwData))->hSubMenu)
				{
					SendMessage(WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(m_oHoverPt.x, m_oHoverPt.y));		
					SendMessage(WM_LBUTTONUP, MK_LBUTTON, MAKELPARAM(m_oHoverPt.x, m_oHoverPt.y));	
				}
				else //delete any submenus present for this menu
				{
					((CBmpMenu*)GetParent())->DestroySubMenus();
					m_nLastLBDownIndex = -1; //reset after destroying submenus
				}
			}
		}
	}

	if(message == WM_RESETDATA)
		m_nLastLBDownIndex = -1;

	return CToolBar::DefWindowProc(message, wParam, lParam);
}

//Grab Key down events
BOOL MenuToolBar::KeyboardFilter(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	//On escape key, we close all menu windows
	if(nChar==VK_ESCAPE)
	{
		((CBmpMenu*)GetParent())->DestroyRootMenu();
		return TRUE;
	}

	//On left arrow...we need to close the current submenu and go to parent
	if(nChar == VK_LEFT)
	{
		CWnd *pWnd = GetParent()->GetParent();

		if(pWnd && IsWindow(pWnd->m_hWnd) && pWnd->IsKindOf(RUNTIME_CLASS(CBmpMenu)))
		{
			((CBmpMenu*)pWnd)->DestroySubMenus();

			(CBmpMenu*)pWnd->SendMessage(WM_RESETDATA, 0, 0);
		}
		return TRUE;
	}

	if((nChar == VK_RIGHT) || (nChar == VK_RETURN))
	{	
		if(m_nSelectedItem != -1)
		{
			int ndx = CommandToIndex(m_nSelectedItem);

			if(ndx >= 0)
			{
				TBBUTTON tbb;
				GetToolBarCtrl().GetButton(ndx, &tbb);

				CRect rect;
				GetToolBarCtrl().GetItemRect(ndx, &rect);

				if(tbb.dwData)
				{
					//pass on left mouse down event for submenu items..also need to select the first submenu item
					if((((MENUITEMINFO*)(tbb.dwData))->hSubMenu) || (nChar == VK_RETURN))
					{
						m_nLastLBDownIndex = -1;
						SendMessage(WM_LBUTTONDOWN, MK_LBUTTON|MENU_SELECTFIRSTITEM, MAKELPARAM(rect.left+1, rect.top+1));		
						SendMessage(WM_LBUTTONUP, MK_LBUTTON|MENU_SELECTFIRSTITEM, MAKELPARAM(rect.left+1, rect.top+1));
					}
				}
			}
		}

		return TRUE;
	}

	//pass on for further processing
	OnChar(nChar, nRepCnt, nFlags);

	return FALSE;
}

void MenuToolBar::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default
	if(KeyboardFilter(nChar,nRepCnt,nFlags)) 
		return;

	CWnd::OnKeyDown(nChar, nRepCnt, nFlags);
}

// User typed a char into menu. Look for item with & preceeding the char typed.
void MenuToolBar::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default
	//////////////////
	UINT iCurrentItem = (UINT)-1; // guaranteed higher than any command ID
	CUIntArray arItemsMatched;		// items that match the character typed

	UINT nItem = GetToolBarCtrl().GetButtonCount();
	
	for (UINT i=0; i< nItem; i++) 
	{
		// get menu info
		TBBUTTON tbb;
		GetToolBarCtrl().GetButton(i, &tbb);

		if(tbb.dwData)
		{
			if(((MENUITEMINFO*)(tbb.dwData))->dwTypeData)
			{
				CString text = ((MENUITEMINFO*)(tbb.dwData))->dwTypeData;
				int iAmpersand = text.Find('&');
				if (iAmpersand >=0 && toupper(nChar)==toupper(text[iAmpersand+1]))
					arItemsMatched.Add(i);
			}
			if ((UINT)SendMessage(TB_GETHOTITEM, 0, 0) == i)
				iCurrentItem = i; // note index of current item
		}
	}
	// arItemsMatched now contains indexes of items that match the char typed.
	UINT nFound = arItemsMatched.GetSize();
	if (nFound == 0)
	{
		//notify owner window and take corresponding action
		UINT lRet = (((CBmpMenu*)GetParent())->m_pOwnerWnd)->SendMessage(WM_MENUCHAR, MAKEWPARAM(nChar, MF_POPUP), 
													(LPARAM)((CBmpMenu*)GetParent())->m_hMenu);

		switch(HIWORD(lRet))
		{
		case MNC_CLOSE:
			((CBmpMenu*)GetParent())->DestroyRootMenu();
			break;

		case MNC_SELECT:
			//select the menu item
			break;

		case MNC_EXECUTE:
			(((CBmpMenu*)GetParent())->m_pOwnerWnd)->SendMessage(WM_COMMAND, LOWORD(lRet), 0);			
			break;
		}

		return;
	}

	else if (nFound==1)
	{
		CRect rect;
		GetToolBarCtrl().GetItemRect(arItemsMatched[0], &rect);
		SendMessage(TB_SETHOTITEM, arItemsMatched[0], 0);
		m_nLastLBDownIndex = -1;
		SendMessage(WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(rect.left+1, rect.top+1));		
		SendMessage(WM_LBUTTONUP, MK_LBUTTON, MAKELPARAM(rect.left+1, rect.top+1));
		return;
	}

	// more than one found--return 1st one past current selected item;
	UINT iSelect = 0;
	for (i=0; i < nFound; i++) {
		if (arItemsMatched[i] > iCurrentItem) {
			iSelect = i;
			break;
		}
	}

	SendMessage(TB_SETHOTITEM, iSelect, 0);
}

HBITMAP 
GetSysColorBitmap(HDC hDC, HBITMAP hSourceBitmap, BOOL bMono, BOOL bSelected)
{
	struct _COLORMAPTABLE{
		COLORREF	rgb;
		int			nSysColor;
	};

	_COLORMAPTABLE _ColorMap[]=
	{
		// mapping from color in DIB to system color
		{ RGB(0x00, 0x00, 0x00),  COLOR_BTNTEXT },       // black
		{ RGB(0x80, 0x80, 0x80),  COLOR_BTNSHADOW },     // dark gray
		{ RGB(0xC0, 0xC0, 0xC0),  COLOR_MENU },       // bright gray
		{ RGB(0xFF, 0xFF, 0xFF),  COLOR_BTNHIGHLIGHT }   // white
	};

	HBITMAP hOldSourceBitmap, hOldDestBitmap, hDestBitmap;
	HDC hMemSrc, hMemDest;
	int height, width;
	int i, j;
	BITMAP SrcBitmap;

	if(bSelected && !bMono)
		_ColorMap[2].nSysColor= COLOR_HIGHLIGHT;
	else
		_ColorMap[2].nSysColor= COLOR_MENU;

	// Step 1: Create a memory DC for the source and destination bitmaps
	//         compatible with the device used.

	hMemSrc = CreateCompatibleDC(hDC);
	hMemDest= CreateCompatibleDC(hDC);


	// Step 2: Get the height and width of the source bitmap.

	GetObject(hSourceBitmap, sizeof(BITMAP), (LPSTR)&SrcBitmap);
	width = SrcBitmap.bmWidth;
	height = SrcBitmap.bmHeight;


	// Step 3: Select the source bitmap into the source DC. Create a
	//         destination bitmap, and select it into the destination DC.

	hOldSourceBitmap = (HBITMAP)SelectObject(hMemSrc, hSourceBitmap);
	hDestBitmap = CreateBitmap(height, width, (bMono)?1:SrcBitmap.bmPlanes,
		(bMono)?1:SrcBitmap.bmBitsPixel, NULL);

	if (hDestBitmap)
	{
		hOldDestBitmap = (HBITMAP)SelectObject(hMemDest, hDestBitmap);

		// Step 4: Copy the pixels from the source to the destination.

		for (i = 0; i < width; ++i)
		{
			for (j = 0; j < height; ++j)
			{
				//Get the color of source bitmap
				COLORREF rgb = GetPixel(hMemSrc, i, j);
				
				SetPixel(hMemDest, i, j, rgb);

				if(!bMono)
				{
					//check if we need to change this color
					for(int k=0; k<sizeof(_ColorMap)/sizeof(_ColorMap[0]); k++)
					{
						if(rgb == _ColorMap[k].rgb)
						{
							SetPixel(hMemDest, i, j, GetSysColor(_ColorMap[k].nSysColor));
							break;
						}
					}
				}
			}
		}
	}


	// Step 5: Destroy the DCs.

	SelectObject(hMemSrc, hOldSourceBitmap);
	SelectObject(hMemDest, hOldDestBitmap);
	DeleteDC(hMemDest);
	DeleteDC(hMemSrc);


	// Step 6: Return the rotated bitmap.

	return(hDestBitmap);

}
 //新增漸變色條狀菜單顯示
#define NCOLORSHADES 128		// this many shades in gradient

static void PaintRect(CDC* pDC, int x, int y, int w, int h, COLORREF color)
{
	CBrush brush(color);
	CBrush* pOldBrush = pDC->SelectObject(&brush);
	pDC->PatBlt(x, y, w, h, PATCOPY);
	pDC->SelectObject(pOldBrush);
	brush.DeleteObject();
}

void CBmpMenu::PaintGradiantRect(CDC *pDC, const RECT &rect,COLORREF clrFrom, COLORREF clrTo, 
                       BOOL hori, BOOL ascend)
{
	int cxCap = rect.right - rect.left;
	int cyCap = rect.bottom - rect.top;

	// Get the intensity values for the ending color
	int r1 = GetRValue(clrTo); // red
	int g1 = GetGValue(clrTo); // green
	int b1 = GetBValue(clrTo); // blue
	
	// Get the intensity values for the begining color
	int r2 = GetRValue(clrFrom); // red
	int g2 = GetGValue(clrFrom); // green
	int b2 = GetBValue(clrFrom); // blue

	int r, g, b;

    if(hori) //paint horizontal rect;
    {
	    int x = cxCap;	
	    int w = x;							// width of area to shade
	    int xDelta= max(w/NCOLORSHADES,1);	// width of one shade band


	    while (x >= xDelta) {
		    x -= xDelta;
		    if (r1 > r2)
			    r = r1 - (r1-r2)*(w-x)/w;
		    else
			    r = r1 + (r2-r1)*(w-x)/w;

		    if (g1 > g2)
			    g = g1 - (g1-g2)*(w-x)/w;
		    else
			    g = g1 + (g2-g1)*(w-x)/w;

		    if (b1 > b2)
			    b = b1 - (b1-b2)*(w-x)/w;
		    else
			    b = b1 + (b2-b1)*(w-x)/w;

            if(ascend) // Paint from  left to right;
		        PaintRect(pDC, rect.left+x, rect.top, xDelta, cyCap, RGB(r, g, b));
            else               // Paint from  right to left;
                PaintRect(pDC, rect.right-x-xDelta, rect.top, xDelta, cyCap, RGB(r, g, b));
	    }
    }
    else    //paint vertical rect;
    {
	    int y = cyCap;	
	    int w = y;							// height of area to shade
	    int yDelta= max(w/NCOLORSHADES,1);	// height of one shade band


	    //while (y >= yDelta) {
        while (y > 0) {
		    y -= yDelta;
		    if (r1 > r2)
			    r = r1 - (r1-r2)*(w-y)/w;
		    else
			    r = r1 + (r2-r1)*(w-y)/w;

		    if (g1 > g2)
			    g = g1 - (g1-g2)*(w-y)/w;
		    else
			    g = g1 + (g2-g1)*(w-y)/w;

		    if (b1 > b2)
			    b = b1 - (b1-b2)*(w-y)/w;
		    else
			    b = b1 + (b2-b1)*(w-y)/w;
		    
            if(ascend) // Paint from  top to bottom;
		        PaintRect(pDC, rect.left, rect.top+y, cxCap, yDelta, RGB(r, g, b));
            else       // Paint from  bottom to top;
                PaintRect(pDC, rect.left, rect.bottom-y-yDelta, cxCap, yDelta, RGB(r, g, b));
	    }
    }

}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成人福利片| 欧美xxxxx裸体时装秀| 91精品国产一区二区三区蜜臀| 精品国产乱码久久久久久牛牛 | 国产精品一二一区| 色吧成人激情小说| 久久久激情视频| 日本网站在线观看一区二区三区 | 久久精品国产精品青草| 91丨国产丨九色丨pron| 精品国产乱码久久久久久闺蜜| 亚洲精品久久7777| 成人精品视频一区二区三区 | 韩国成人在线视频| 欧美精品成人一区二区三区四区| 国产精品嫩草影院com| 国精品**一区二区三区在线蜜桃| 欧美猛男gaygay网站| 亚洲精品免费视频| 99精品黄色片免费大全| 国产精品另类一区| 国产美女娇喘av呻吟久久| 7777精品伊人久久久大香线蕉| 亚洲综合在线电影| 色综合久久久久久久| 中文字幕一区二区三区不卡 | 精品一区二区三区日韩| 欧美一级在线免费| 欧美aaaaaa午夜精品| 欧美一区二区三区在线观看视频| 亚洲国产精品久久艾草纯爱| 色噜噜狠狠成人网p站| 亚洲欧美激情在线| 在线看日本不卡| 亚洲成人tv网| 欧美视频完全免费看| 亚洲地区一二三色| 欧美精品日韩精品| 日本亚洲一区二区| 2022国产精品视频| 丁香婷婷深情五月亚洲| 中文字幕中文在线不卡住| 北条麻妃国产九九精品视频| 国产精品成人免费| 91久久香蕉国产日韩欧美9色| 亚洲自拍与偷拍| 欧美精品欧美精品系列| 精品一区二区影视| 国产精品欧美久久久久无广告| 99热99精品| 亚洲福利国产精品| 26uuu精品一区二区在线观看| 高清国产一区二区| 亚洲国产婷婷综合在线精品| 制服丝袜激情欧洲亚洲| 国产激情一区二区三区| 亚洲免费在线视频一区 二区| 欧美色图激情小说| 国产一区视频导航| 亚洲乱码日产精品bd| 欧美一区二区三区电影| 国产成人aaa| 午夜免费久久看| 国产日韩欧美高清| 欧美在线观看视频在线| 国内偷窥港台综合视频在线播放| 日本一区二区视频在线观看| 欧美视频三区在线播放| 欧美男男青年gay1069videost| 久久国产精品区| 亚洲精品自拍动漫在线| 久久综合999| 欧美日韩精品一区二区三区蜜桃| 国产精品一区二区在线观看不卡 | 亚洲同性gay激情无套| 欧美一区二区网站| 色婷婷久久综合| 国产乱码精品一区二区三区av | 国产电影精品久久禁18| 亚洲综合一区二区三区| 国产三级一区二区三区| 欧美色视频在线| 99综合影院在线| 国产乱子伦视频一区二区三区 | 国产99久久久国产精品潘金| 亚洲成人综合网站| 亚洲欧洲精品一区二区精品久久久| 欧美丰满嫩嫩电影| 色网站国产精品| 国产a视频精品免费观看| 美女免费视频一区二区| 亚洲成人福利片| 一区二区三区中文字幕精品精品| 国产偷国产偷精品高清尤物| 欧美变态凌虐bdsm| 欧美性感一类影片在线播放| 99久久99久久免费精品蜜臀| 国产精品一区一区| 久久精品99久久久| 麻豆久久久久久久| 天堂在线亚洲视频| 亚洲福利电影网| 艳妇臀荡乳欲伦亚洲一区| 日本一区二区三区视频视频| 久久久久久久精| 久久久久久久综合| 久久久欧美精品sm网站 | 欧美日韩国产大片| 色综合网站在线| 91丨九色丨尤物| 99re热视频精品| 成人精品小蝌蚪| caoporn国产一区二区| 成人综合婷婷国产精品久久蜜臀| 国产在线看一区| 国产精品一区二区三区99| 久久国产夜色精品鲁鲁99| 麻豆久久久久久| 国产麻豆视频一区二区| 国产91综合网| 99久久国产综合色|国产精品| a级精品国产片在线观看| 99riav久久精品riav| 色偷偷一区二区三区| 色婷婷av一区二区| 欧美日本一区二区| 欧美一区二区在线视频| 久久久午夜精品理论片中文字幕| 国产日韩在线不卡| 亚洲素人一区二区| 亚洲一区二区在线视频| 日本aⅴ免费视频一区二区三区| 蜜桃在线一区二区三区| 国产高清不卡一区| 91国偷自产一区二区三区成为亚洲经典| 久久久美女毛片| 亚洲同性同志一二三专区| 亚洲曰韩产成在线| 老司机精品视频在线| 国产精品18久久久久久久久久久久| 成人高清免费观看| 欧洲日韩一区二区三区| 日韩一区二区精品在线观看| 精品国产乱码久久久久久闺蜜| 国产精品视频线看| 偷偷要91色婷婷| 国产一区二区三区在线观看精品| 成人午夜视频在线| 欧美在线免费视屏| 久久综合九色欧美综合狠狠| 中文字幕在线不卡视频| 全部av―极品视觉盛宴亚洲| 国产成人在线免费| 8x8x8国产精品| 国产精品女主播av| 天堂在线亚洲视频| av网站一区二区三区| 日韩一区二区在线看片| 自拍偷拍欧美激情| 美女网站一区二区| 在线亚洲精品福利网址导航| 精品久久久三级丝袜| 亚洲电影一区二区三区| 国产99久久久国产精品潘金 | 亚洲欧洲精品成人久久奇米网| 一区二区三区四区蜜桃| 国产又粗又猛又爽又黄91精品| 在线观看一区不卡| 国产精品理论在线观看| 美女高潮久久久| 欧美亚洲动漫制服丝袜| 中文乱码免费一区二区| 美女视频黄 久久| 欧美日韩亚洲丝袜制服| 国产精品久久久久久久久久久免费看 | 99精品欧美一区| 2023国产精华国产精品| 三级在线观看一区二区| 一本高清dvd不卡在线观看| 久久综合色播五月| 美腿丝袜亚洲三区| 欧美色网站导航| 一区二区三区精品视频| av影院午夜一区| 欧美国产1区2区| 国产盗摄一区二区| 欧美va亚洲va国产综合| 偷拍一区二区三区| 色8久久精品久久久久久蜜 | 精品乱人伦小说| 午夜欧美电影在线观看| 欧美亚洲国产一区在线观看网站| 中文字幕亚洲成人| av亚洲精华国产精华精华| 国产精品卡一卡二| 成人app在线观看| 中文字幕精品—区二区四季| 国产成人午夜99999| 国产欧美一区二区精品婷婷 | 青青草国产成人av片免费 |