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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? xcombolist.cpp

?? 一個(gè)類似于CListCtrl的控件類
?? CPP
字號(hào):
// XComboList.cpp
//
// Author:  Hans Dietrich
//          hdietrich2@hotmail.com
//
// This software is released into the public domain.
// You are free to use it in any way you like.
//
// This software is provided "as is" with no expressed
// or implied warranty.  I accept no liability for any
// damage or loss of business that this software may cause.
//
///////////////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "XComboList.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

UINT NEAR WM_XCOMBOLIST_VK_RETURN = ::RegisterWindowMessage(_T("WM_XCOMBOLIST_VK_RETURN"));
UINT NEAR WM_XCOMBOLIST_VK_ESCAPE = ::RegisterWindowMessage(_T("WM_XCOMBOLIST_VK_ESCAPE"));
UINT NEAR WM_XCOMBOLIST_KEYDOWN   = ::RegisterWindowMessage(_T("WM_XCOMBOLIST_KEYDOWN"));
UINT NEAR WM_XCOMBOLIST_LBUTTONUP = ::RegisterWindowMessage(_T("WM_XCOMBOLIST_LBUTTONUP"));

BEGIN_MESSAGE_MAP(CXComboList, CWnd)
	//{{AFX_MSG_MAP(CXComboList)
	ON_WM_LBUTTONDOWN()
	ON_WM_KILLFOCUS()
	ON_WM_CREATE()
	ON_WM_VSCROLL()
	ON_WM_DESTROY()
	ON_WM_TIMER()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

///////////////////////////////////////////////////////////////////////////////
// ctor
CXComboList::CXComboList(CWnd *pParent)
{
	m_pParent = pParent;
	ASSERT(m_pParent);
	m_nCount = 0;
	m_bFirstTime = TRUE;
}

CXComboList::~CXComboList()
{
}

///////////////////////////////////////////////////////////////////////////////
// SetActive
void CXComboList::SetActive(int nScrollBarWidth)
{
	//TRACE0("in CXComboList::SetActive\n");

	if (!::IsWindow(m_ListBox.m_hWnd))
		return;

	m_ListBox.SetFocus();

	if (m_bFirstTime)
	{
		m_bFirstTime = FALSE;

		CRect rect;
		GetWindowRect(&rect);

		// set listbox size according to item height
		int nItemHeight = m_ListBox.GetItemHeight(0);

		CRect lbrect;
		GetClientRect(&lbrect);
		lbrect.top   += 1;
		lbrect.bottom = lbrect.top + (rect.Height() / nItemHeight) * nItemHeight;
		lbrect.left  += 1;
		lbrect.right -= nScrollBarWidth;		

		int nItemsInView = (lbrect.Height()) / nItemHeight;

		// set size of listbox wrapper (from size of listbox)
		rect.bottom = rect.top + lbrect.Height() + 4;
		MoveWindow(&rect);
		m_ListBox.MoveWindow(&lbrect);
		m_ListBox.BringWindowToTop();

		// set size and position for vertical scroll bar
		CRect sbrect;
		sbrect = lbrect;
		sbrect.left   = lbrect.right;
		sbrect.right += nScrollBarWidth;
		m_wndSBVert.MoveWindow(&sbrect);

		SCROLLINFO si;
		si.cbSize = sizeof(si);
		si.fMask = SIF_ALL;
		m_wndSBVert.GetScrollInfo(&si);

		// set info for scrollbar
		si.nMin = 0;
		si.nMax = m_ListBox.GetCount();
		if (si.nMax < 0)
			si.nMax = 1;
		si.nPage = nItemsInView;
		int nCurSel = m_ListBox.GetCurSel();
		if (nCurSel == LB_ERR || nCurSel < 0)
			nCurSel = 0;
		si.nPos = nCurSel;

		// set top index, to force selected item to be in view
		m_ListBox.SetTopIndex(nCurSel > 0 ? nCurSel - 1 : 0);

		if (si.nPos < 0)
			si.nPos = 0;
		m_wndSBVert.SetScrollInfo(&si);
		m_wndSBVert.SetScrollPos(si.nPos, TRUE);

		//RedrawWindow();

		SetTimer(1, 80, NULL);
	}
}

///////////////////////////////////////////////////////////////////////////////
// GetScrollBarCtrl
CScrollBar* CXComboList::GetScrollBarCtrl(int nBar)
{
	UNUSED_ALWAYS(nBar);
	return &m_wndSBVert;
}

///////////////////////////////////////////////////////////////////////////////
// SendRegisteredMessage
void CXComboList::SendRegisteredMessage(UINT nMsg, WPARAM wParam, LPARAM lParam)
{
	CWnd *pWnd = m_pParent;
	if (pWnd)
		pWnd->SendMessage(nMsg, wParam, lParam);
}

///////////////////////////////////////////////////////////////////////////////
// OnLButtonDown
void CXComboList::OnLButtonDown(UINT nFlags, CPoint point) 
{
	SendRegisteredMessage(WM_XCOMBOLIST_LBUTTONUP, 0, 0);
	CWnd::OnLButtonUp(nFlags, point);
}

///////////////////////////////////////////////////////////////////////////////
// PreTranslateMessage
BOOL CXComboList::PreTranslateMessage(MSG* pMsg) 
{
	switch (pMsg->message)
	{
		case WM_KEYDOWN:
		{
			///////////////////////////////////////////////////////////////////
			// we need to trap all cursor keys & alpha keys to reposition the 
			// scroll bar
			///////////////////////////////////////////////////////////////////

			//TRACE("   WM_KEYDOWN\n");

			SCROLLINFO si = 
			{
				sizeof(SCROLLINFO),
				SIF_ALL | SIF_DISABLENOSCROLL,
			};
			m_wndSBVert.GetScrollInfo(&si);
			BOOL bSetScrollInfo = FALSE;
			int nIndex = 0;
			if (::IsWindow(m_ListBox.m_hWnd))
				nIndex = m_ListBox.GetCurSel();
			if (nIndex == LB_ERR || nIndex < 0)
				nIndex = 0;

			// use index from listbox, because scroll position cannot be relied
			// upon here

			switch (pMsg->wParam)
			{
				case VK_RETURN:
					SendRegisteredMessage(WM_XCOMBOLIST_VK_RETURN, 0, 0);
					break;

				case VK_ESCAPE:
					SendRegisteredMessage(WM_XCOMBOLIST_VK_ESCAPE, 0, 0);
					break;

				// handle scrolling messages
				case VK_DOWN:
					si.nPos = nIndex + 1;
					bSetScrollInfo = TRUE;
					break;

				case VK_END:
					si.nPos = si.nMax;
					bSetScrollInfo = TRUE;
					break;

				case VK_HOME:
					si.nPos = 0;
					bSetScrollInfo = TRUE;
					break;

				case VK_NEXT:			// PAGE DOWN
					si.nPos = nIndex + (si.nPage-1);
					bSetScrollInfo = TRUE;
					break;

				case VK_PRIOR:			// PAGE UP
					si.nPos = nIndex - (si.nPage - 1);
					bSetScrollInfo = TRUE;
					break;

				case VK_UP:
					si.nPos = nIndex - 1;
					bSetScrollInfo = TRUE;
					break;

				default:
					if (pMsg->wParam >= 0x41/*VK_A*/ && pMsg->wParam <= 0x5A/*VK_Z*/)
					{
						// this was an alpha key - try to find listbox index
						CString strAlpha;
						strAlpha = (_TCHAR) pMsg->wParam;
						int nIndex2 = 0;
						if (::IsWindow(m_ListBox.m_hWnd))
							nIndex2 = m_ListBox.FindString(nIndex, strAlpha);
						if (nIndex2 != LB_ERR)
						{
							si.nPos = nIndex2;
							bSetScrollInfo = TRUE;
						}
					}
					break;
			}

			if (bSetScrollInfo)
			{
				// let parent know the selection has changed
				SendRegisteredMessage(WM_XCOMBOLIST_KEYDOWN, 0, 0);

				// update scrollbar
				if (si.nPos < 0)
					si.nPos = 0;
				if (si.nPos > si.nMax)
					si.nPos = si.nMax;
				m_wndSBVert.SetScrollInfo(&si);
			}

			break;
		}

		case WM_LBUTTONUP:
			SendRegisteredMessage(WM_XCOMBOLIST_LBUTTONUP, 0, 0);
			break;
	}
	
	return CWnd::PreTranslateMessage(pMsg);
}

///////////////////////////////////////////////////////////////////////////////
// OnKillFocus
void CXComboList::OnKillFocus(CWnd* pNewWnd) 
{
	//TRACE0("in CXComboList::OnKillFocus\n");
	CWnd::OnKillFocus(pNewWnd);

	m_nCount++;
	if (m_nCount > 2)
	{
		SendRegisteredMessage(WM_XCOMBOLIST_VK_ESCAPE, 0, 0);
	}
}

///////////////////////////////////////////////////////////////////////////////
// OnCreate
int CXComboList::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CWnd::OnCreate(lpCreateStruct) == -1)
		return -1;

	CRect rect2(0,0,0,0);

	// create the listbox that we're wrapping
	VERIFY(m_ListBox.Create(WS_VISIBLE|WS_CHILD|LBS_NOINTEGRALHEIGHT/*|WS_BORDER*/,
		rect2, this, 0));

	// create the vertical scrollbar
	VERIFY(m_wndSBVert.Create(WS_VISIBLE|WS_CHILD|SBS_VERT,
		rect2, this, 0));

	// set font from parent
	CFont *font = GetParent()->GetFont();
	if (font)
	{
		SetFont(font, FALSE);
		m_wndSBVert.SetFont(font, FALSE);
	}

	return 0;
}

///////////////////////////////////////////////////////////////////////////////
// OnVScroll
void CXComboList::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar*) 
{
	if (!::IsWindow(m_ListBox.m_hWnd))
		return;

	// forward scroll message to listbox
	const MSG* pMsg = GetCurrentMessage();
	m_ListBox.SendMessage(WM_VSCROLL, pMsg->wParam, pMsg->lParam);

    SCROLLINFO si = 
	{
        sizeof(SCROLLINFO),
        SIF_ALL | SIF_DISABLENOSCROLL,
    };
	m_wndSBVert.GetScrollInfo(&si);

    switch (nSBCode) 
	{
		case SB_BOTTOM:			// scroll to bottom
			si.nPos = si.nMax;
			break;
		case SB_TOP:			// scroll to top
			si.nPos = 0;
			break;
		case SB_PAGEDOWN:		// scroll one page down
			si.nPos += si.nPage;
			break;
		case SB_PAGEUP:			// scroll one page up
			si.nPos -= si.nPage;
			break;
		case SB_LINEDOWN:		// scroll one line up
			si.nPos += 1;
			break;
		case SB_LINEUP:			// scroll one line up
			si.nPos -= 1;
			break;
		case SB_THUMBTRACK:		// drag scroll box to specified position. The 
								// current position is provided in nPos
		case SB_THUMBPOSITION:	// scroll to the absolute position. The current 
								// position is provided in nPos
			si.nPos = nPos;        
			break;
		case SB_ENDSCROLL:		// end scroll
			return;
		default:
			break;
	}

	if (si.nPos < 0)
		si.nPos = 0;
	if (si.nPos > si.nMax)
		si.nPos = si.nMax;
	m_wndSBVert.SetScrollInfo(&si);
}

///////////////////////////////////////////////////////////////////////////////
// OnDestroy
void CXComboList::OnDestroy() 
{
	KillTimer(1);

	if (::IsWindow(m_ListBox.m_hWnd))
		m_ListBox.DestroyWindow();


	CWnd::OnDestroy();
}

///////////////////////////////////////////////////////////////////////////////
// OnTimer
void CXComboList::OnTimer(UINT nIDEvent) 
{
	UNUSED_ALWAYS(nIDEvent);

	if (!::IsWindow(m_ListBox.m_hWnd))
		return;

	// get current mouse position
	POINT point;
	::GetCursorPos(&point);
	ScreenToClient(&point);

	BOOL bOutside;
	int nIndex = m_ListBox.ItemFromPoint(point, bOutside);
	//TRACE("   nIndex=%d  bOutside=%d\n", nIndex, bOutside);

	if (!bOutside)
	{
		int nCurSel = m_ListBox.GetCurSel();

		if (nIndex != nCurSel)
			if (nIndex >= 0 && nIndex < m_ListBox.GetCount())
				m_ListBox.SetCurSel(nIndex);
	}
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产日韩精品一区二区三区| 香蕉成人啪国产精品视频综合网| 色综合久久中文综合久久牛| 91女厕偷拍女厕偷拍高清| 99久久99久久久精品齐齐| 97久久超碰精品国产| 色域天天综合网| 制服.丝袜.亚洲.另类.中文| 日韩精品中文字幕一区二区三区 | 9人人澡人人爽人人精品| 久久国产精品区| 国产最新精品精品你懂的| 色综合天天综合网天天狠天天| 欧美午夜免费电影| 91精品福利视频| 91蝌蚪porny| 91免费在线播放| 8x福利精品第一导航| 久久久久综合网| 亚洲成人777| 国产高清在线观看免费不卡| 91久久精品一区二区三| 91麻豆精东视频| 肉色丝袜一区二区| 一区二区三区精品在线| 久久这里只有精品6| 1024精品合集| 久久精品国产精品亚洲红杏| 91在线观看污| 久久久精品一品道一区| 天天综合天天综合色| 99国产精品国产精品久久| 日韩欧美中文字幕公布| 亚洲精品成人天堂一二三| 国产一区在线观看麻豆| 欧美精品一二三四| 综合在线观看色| 韩国av一区二区三区在线观看| 91成人在线精品| 国产精品每日更新| 国产曰批免费观看久久久| 欧美日韩一区二区三区免费看| 国产婷婷精品av在线| 免费一级片91| 欧美色网一区二区| 综合欧美一区二区三区| 国产最新精品精品你懂的| 欧美精品久久一区二区三区| 伊人性伊人情综合网| 99综合电影在线视频| 久久久亚洲高清| 久久97超碰色| 日韩视频免费直播| 日韩电影在线看| 欧美性猛交xxxxxx富婆| 成人免费一区二区三区视频 | 午夜视频一区在线观看| 国产91丝袜在线播放0| 日韩一级片在线观看| 亚洲成人福利片| 色噜噜久久综合| 亚洲日本免费电影| 不卡视频免费播放| 国产精品毛片久久久久久久| 国产成人精品免费| 久久一夜天堂av一区二区三区| 另类小说欧美激情| 7777精品伊人久久久大香线蕉经典版下载 | 亚洲精品乱码久久久久久黑人| 国产精品一区在线观看乱码| 精品国免费一区二区三区| 日韩国产欧美一区二区三区| 欧美色老头old∨ideo| 亚洲一区二区三区在线| 在线免费观看成人短视频| 亚洲美女少妇撒尿| 一本大道久久a久久精二百| ...av二区三区久久精品| 99视频在线精品| 18涩涩午夜精品.www| 色综合色狠狠天天综合色| 亚洲激情男女视频| 欧洲视频一区二区| 亚洲国产成人91porn| 欧美三级电影网站| 日韩国产一区二| 精品国产乱码久久久久久免费| 老司机一区二区| 亚洲精品一区二区在线观看| 国产麻豆成人精品| 国产精品丝袜91| 色综合欧美在线| 午夜精品福利一区二区蜜股av| 91麻豆精品国产自产在线观看一区 | 不卡一区二区三区四区| 亚洲人成网站精品片在线观看| 91成人在线精品| 热久久一区二区| 久久久久久免费网| 91热门视频在线观看| 亚洲国产精品嫩草影院| 日韩一区二区在线观看| 国产福利精品一区二区| 亚洲三级免费观看| 欧美猛男男办公室激情| 精品午夜久久福利影院| 国产精品久久久久久久蜜臀| 日本道在线观看一区二区| 蜜桃av一区二区| 亚洲国产精品精华液2区45| 色婷婷久久久久swag精品| 日韩电影一二三区| 国产天堂亚洲国产碰碰| 91黄色免费网站| 精品一区二区在线视频| 亚洲欧洲成人精品av97| 欧美嫩在线观看| 国产成人精品影院| 亚洲国产成人av网| 国产无一区二区| 欧美日韩久久久一区| 欧美午夜在线观看| 久久成人久久鬼色| 亚洲欧洲精品天堂一级| 日韩视频123| 99国产欧美另类久久久精品 | 欧美一区二区精品在线| 成人午夜短视频| 亚洲va中文字幕| 亚洲国产精品v| 制服视频三区第一页精品| 99久久婷婷国产综合精品| 五月婷婷综合在线| 国产精品久久久久久久第一福利| 欧美久久免费观看| www.av精品| 国产主播一区二区三区| 亚洲成人资源网| 一区精品在线播放| 亚洲精品一区二区三区蜜桃下载| 欧美亚洲精品一区| 大胆亚洲人体视频| 精品亚洲国内自在自线福利| 亚洲一区精品在线| 中文字幕日韩av资源站| 精品日韩一区二区三区| 欧洲av一区二区嗯嗯嗯啊| 国产高清不卡一区| 青青草原综合久久大伊人精品优势| 国产精品视频一二三| 欧美一区二区日韩| 欧美日韩国产美女| 一本色道久久加勒比精品 | 欧美国产一区在线| 日韩精品一区在线| 欧美裸体bbwbbwbbw| 色综合亚洲欧洲| 国产 欧美在线| 狠狠狠色丁香婷婷综合久久五月| 亚洲一区二区视频在线观看| 中文字幕日本乱码精品影院| 久久嫩草精品久久久精品| 在线综合视频播放| 欧美精品久久久久久久多人混战 | 亚洲免费观看高清| 国产欧美日韩视频在线观看| 欧美电视剧在线看免费| 91精品国产乱码久久蜜臀| 91精品福利视频| 一本一道综合狠狠老| 91在线视频播放| eeuss国产一区二区三区| 国产成人av在线影院| 激情综合网av| 久久国产视频网| 九九视频精品免费| 毛片av一区二区| 老汉av免费一区二区三区| 天天色天天爱天天射综合| 亚洲电影一区二区| 午夜久久福利影院| 日韩精品电影在线| 五月天丁香久久| 日本午夜精品一区二区三区电影| 亚洲成人1区2区| 丝袜亚洲精品中文字幕一区| aa级大片欧美| 成人爱爱电影网址| 99精品视频免费在线观看| 99久久久久久| 色噜噜偷拍精品综合在线| 91久久一区二区| 欧美亚洲禁片免费| 欧美夫妻性生活| 日韩精品中文字幕在线不卡尤物| 精品成人一区二区三区| 久久久久国产精品麻豆ai换脸| 国产农村妇女精品| 久久精品一区二区三区四区| 亚洲国产精品v|