⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 outbarctrl.cpp

📁 模拟popo的一个程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	bm.CreateCompatibleBitmap(pDC, rcClient.Width(), rcClient.Height());
	CBitmap *oldBitmap = memDC.SelectObject(&bm);

	int obj = HITOBJ(lastHit);
	int index = HITINDEX(lastHit);

	int i;
	for (i = folders.size() - 1; i >= 0; i--)
		drawFolder(&memDC, i, FALSE, (obj == HT_FOLDER && index == i));

	CRect rc;
	getInsideRect(rc);
	drawBackground(&memDC, rc);

	CRgn rgn;
	rgn.CreateRectRgnIndirect(rc);
	memDC.SelectClipRgn(&rgn);

	int max = getMaxVisibleItem();
	for (i = scrollPos(); i <= max; i++)
		drawItem(&memDC, i);

	if (obj == HT_ITEM)
		hilightItem(&memDC, index, FALSE);

	for (i = 1; i >= 0; i--) {
		if (canScroll(i))
			drawScroll(&memDC, i, pressedHit == MAKEHIT(HT_SCROLL, i));
	}

	pDC->BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &memDC, 0, 0, SRCCOPY);

	memDC.SelectObject(oldBitmap);
}

void CNOutBarCtrl::hilightItem(CDC *pDC, int i, BOOL pressed)
{	
	CRect rc;
	getInsideRect(rc);
	CRgn rgn;
	rgn.CreateRectRgnIndirect(rc);
	pDC->SelectClipRgn(&rgn);
	getIconRect(rc, i);
	
	if (pressed)
		pDC->Draw3dRect(rc, GetSysColor(COLOR_3DDKSHADOW), GetSysColor(COLOR_BTNHILIGHT));
	else
		pDC->Draw3dRect(rc, GetSysColor(COLOR_BTNHILIGHT), GetSysColor(COLOR_3DDKSHADOW));
}

/*
 * Draw the scroll box
 */
void CNOutBarCtrl::drawScroll(CDC *pDC, int i, BOOL pressed)
{
	CRect rc;
	getScrollRect(rc, i);

	int state = (i == SCROLL_DIR_UP ? DFCS_SCROLLUP : DFCS_SCROLLDOWN);
	if (pressed)
		state |= DFCS_PUSHED;
	pDC->DrawFrameControl(rc, DFC_SCROLL, state);
}

void CNOutBarCtrl::removeFolder(int i)
{
	delete folders[i];
	folders.erase(folders.begin() + i);
	Invalidate();
}

void CNOutBarCtrl::removeAllFolders()
{
	for (int i = folders.size() - 1; i >= 0; i--)
		delete folders[i];
	folders.clear();
}

/*
 * Remove an item from the selected folder
 */
void CNOutBarCtrl::removeItem(int folder, int i)
{
	vector<CNOutBarItem *> &items = folders[folder]->items;
	delete items[i];
	items.erase(items.begin() + i);
	lastHit = HITNONE;
	if (folder == selFolder)
		repaintInsideRect();
}

/*
 * Rename a folder or an item
 */
void CNOutBarCtrl::renameUI()
{
	onEditCanceled();
	
	int obj = HITOBJ(lastHit);
	int i = HITINDEX(lastHit);
	DWORD flags = WS_VISIBLE | WS_CHILD | ES_CENTER;
	const char *text = "";

	editCtrl = new CNOutBarEdit(this, obj, i);

	if (obj == HT_FOLDER) {
		text = folders[i]->text;
		editCtrl->Create(flags, CRect(0, 0, 0, 0), this, 1);
		editCtrl->ModifyStyleEx(0, WS_EX_CLIENTEDGE, SWP_FRAMECHANGED);

	} else if (obj == HT_ITEM) {
		CClientDC dc(this);
		drawItem(&dc, i, TRUE);

		text = folders[selFolder]->items[i]->text;
		editCtrl->Create(flags | WS_BORDER, CRect(0, 0, 0, 0), this, 1);
	}

	editCtrl->SetFont(CFont::FromHandle((HFONT) GetStockObject(DEFAULT_GUI_FONT)));
	editCtrl->SetWindowText(text);
	editCtrl->SetFocus();
	editCtrl->SetSel(0, -1);
	resizeEditCtrl();
}

void CNOutBarCtrl::addFolderUI()
{
	CNOutBarFolder *f = new CNOutBarFolder("");
	folders.insert(folders.begin() + selFolder + 1, f);
	Invalidate();

	lastHit = MAKEHIT(HT_FOLDER, selFolder + 1);
	renameUI();
}

/*
 * Resize the edit control according to the current window size
 */
void CNOutBarCtrl::resizeEditCtrl()
{
	if (!editCtrl)
		return;

	int obj = editCtrl->obj;
	int i = editCtrl->index;
	
	CRect rc;
	if (obj == HT_FOLDER) {
		getFolderRect(rc, i);
		rc.InflateRect(-2, -2);
	} else if (obj == HT_ITEM) {
		getLabelRect(rc, i);
		if (largeIconView) {
			rc.left += 5;
			rc.right -= 5;
		}
	}

	editCtrl->MoveWindow(rc);
}

/*
 * Called when 'enter' is pressed in the edit control
 */
void CNOutBarCtrl::onEditFinished()
{
	if (!editCtrl)
		return;
	
	CString text;
	editCtrl->GetWindowText(text);
	int index = editCtrl->index;
	
	if (editCtrl->obj == HT_FOLDER)
		folders[index]->text = text;
	else if (editCtrl->obj == HT_ITEM)
		folders[selFolder]->items[index]->text = text;
		
	if (listener)
		listener->renamed(editCtrl->obj, index, text);

	delete editCtrl;
	editCtrl = NULL;
}

/*
 * Called When 'ESC' is pressed, or the edit control lost its focus
 */
void CNOutBarCtrl::onEditCanceled()
{
	if (editCtrl) {
		delete editCtrl;
		editCtrl = NULL;
	}
}


BEGIN_MESSAGE_MAP(CNOutBarCtrl, CWnd)
	//{{AFX_MSG_MAP(CNOutBarCtrl)
	ON_WM_PAINT()
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_LBUTTONDBLCLK()
	ON_WM_TIMER()
	ON_WM_SIZE()
	ON_WM_MOUSEWHEEL()
	ON_WM_RBUTTONDOWN()
	ON_WM_ERASEBKGND()
	ON_WM_SETCURSOR()
	ON_WM_KEYDOWN()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CNOutBarCtrl message handlers

void CNOutBarCtrl::OnPaint() 
{
	CPaintDC dc(this); // device context for painting

	drawAll(&dc);
}

void CNOutBarCtrl::OnMouseMove(UINT nFlags, CPoint point) 
{
	HIT hit = hitTest(point);

	if (hit != lastHit) {
		int newObj = HITOBJ(hit);
		int newIndex = HITINDEX(hit);

		if (!editCtrl) {
			CClientDC dc(this);

			int obj = HITOBJ(lastHit);
			int index = HITINDEX(lastHit);

			if (obj == HT_FOLDER)
				drawFolder(&dc, index, FALSE, FALSE);
			else if (obj == HT_ITEM)
				drawItem(&dc, index, TRUE);
			else if (obj == HT_SCROLL && HITOBJ(pressedHit) == HT_SCROLL) {
				drawScroll(&dc, index);
				KillTimer(IDT_SCROLL);
			}

			if (newObj == HT_FOLDER)
				drawFolder(&dc, newIndex, hit == pressedHit, TRUE);
			else {
				if (newObj == HT_ITEM)
					hilightItem(&dc, newIndex, hit == pressedHit);
			}
		}

		lastHit = hit;

		if (dragItem >= 0) {
			if (newObj == HT_FOLDER && selFolder != newIndex)
				currentCursor = dragCursor;
			else
				currentCursor = forbiddenCursor;
		} else if (newObj == HT_FOLDER)
			currentCursor = handCursor;
		else
			currentCursor = NULL;
	}
	
	CWnd::OnMouseMove(nFlags, point);
}

void CNOutBarCtrl::OnLButtonDown(UINT nFlags, CPoint point) 
{
	if (GetFocus() != this) SetFocus();

	OnMouseMove(nFlags, point);

	int obj = HITOBJ(lastHit);
	int index = HITINDEX(lastHit);

	CClientDC dc(this);

	pressedHit = lastHit;

	if (obj == HT_FOLDER)
		drawFolder(&dc, index, TRUE);
	else if (obj == HT_ITEM) {
		dragItem = index;
		hilightItem(&dc, index, TRUE);
	} else if (obj == HT_SCROLL) {
		SetTimer(IDT_SCROLL, 50, NULL);
		drawScroll(&dc, index, TRUE);
	}

	CWnd::OnLButtonDown(nFlags, point);
}

void CNOutBarCtrl::OnLButtonUp(UINT nFlags, CPoint point) 
{
	OnMouseMove(nFlags, point);
	
	int obj = HITOBJ(lastHit);
	int index = HITINDEX(lastHit);

	if (dragItem >= 0) {
		if (obj == HT_FOLDER) {
			currentCursor = handCursor;
			if (listener && selFolder != index)
				listener->itemDragged(dragItem, index);
		} else
			currentCursor = NULL;
		dragItem = -1;
	}

	CClientDC dc(this);
	
	if (pressedHit == lastHit) {
		if (obj == HT_FOLDER) {
			if (index == selFolder)
				drawFolder(&dc, index);
			else {
				if (listener) {
					listener->selFolderChanged(selFolder);
					animateFolder(selFolder, index);
				}
			}
		} else if (obj == HT_ITEM) {
			hilightItem(&dc, index, FALSE);
			clickedItem = index;
			SetTimer(IDT_DBLCLK, 300, NULL);
		} else if (obj == HT_SCROLL) {
			drawScroll(&dc, index);
			KillTimer(IDT_SCROLL);
		}
	}

	pressedHit = HITNONE;
	
	CWnd::OnLButtonUp(nFlags, point);
}

void CNOutBarCtrl::OnLButtonDblClk(UINT nFlags, CPoint point) 
{
	if (HITOBJ(lastHit) == HT_ITEM) {
		KillTimer(IDT_DBLCLK);
		if (listener && clickedItem >= 0)
			listener->itemDoubleClicked(clickedItem);
		clickedItem = -1;
	}

	CWnd::OnLButtonDblClk(nFlags, point);
}

void CNOutBarCtrl::OnTimer(UINT nIDEvent) 
{
	if (nIDEvent == IDT_SCROLL) {
		if (HITOBJ(pressedHit) == HT_SCROLL)
			scroll(HITINDEX(pressedHit));

	} else if (nIDEvent == IDT_DBLCLK) {
		KillTimer(IDT_DBLCLK);
		if (listener && lastHit == MAKEHIT(HT_ITEM, clickedItem))
			listener->itemClicked(clickedItem);
		clickedItem = -1;

	} else
		CWnd::OnTimer(nIDEvent);
}

void CNOutBarCtrl::OnSize(UINT nType, int cx, int cy) 
{
	CWnd::OnSize(nType, cx, cy);
	
	resizeEditCtrl();
}

BOOL CNOutBarCtrl::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) 
{
	int dir;
	int delta = zDelta / WHEEL_DELTA;
	
	if (delta > 0)
		dir = SCROLL_DIR_UP;
	else {
		dir = SCROLL_DIR_DOWN;
		delta = -delta;
	}
	if (canScroll(dir))
		scroll(dir, delta);

	return CWnd::OnMouseWheel(nFlags, zDelta, pt);
}

void CNOutBarCtrl::OnRButtonDown(UINT nFlags, CPoint point) 
{
	OnMouseMove(nFlags, point);
	
	if (listener)
		listener->rightButtonDown(HITOBJ(lastHit), HITINDEX(lastHit));
	
	CWnd::OnRButtonDown(nFlags, point);
}

BOOL CNOutBarCtrl::OnEraseBkgnd(CDC* pDC) 
{
	// Do not let Windows to draw the background for us, since
	// we will do the entire painting when WM_PAINT is received.
	return TRUE;
}

BOOL CNOutBarCtrl::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
{
	if (currentCursor) {
		SetCursor(currentCursor);
		return TRUE;
	}
	return CWnd::OnSetCursor(pWnd, nHitTest, message);
}

void CNOutBarCtrl::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// Find an item when a user pressed the first letter of an item,
	// and set the scroll position properly

	int start = -1;
	if (HITOBJ(lastHit) == HT_ITEM)
		start = HITINDEX(lastHit);

	vector<CNOutBarItem *> &items = folders[selFolder]->items;
	int n = getMaxItem();
	if (isalpha(nChar))
		nChar = toupper(nChar);

	int k = start;
	for (int i = 0; i < n; ++i) {
		int c = items[++k % n]->text[0];
		if (isalpha(c))
			c = toupper(c);
		if (nChar == c)
			break;
	}
	if (i < n) {
		k %= n;
		lastHit = MAKEHIT(HT_ITEM, k);
		scrollToPos(k);
	}

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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -