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

📄 browsectrl.cpp

📁 MFC窗口程序设计源代码。相信大家看得懂。
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	ld.OffsetLineTo(1, 1);
	ld.OffsetLineTo(1, -1);
	ld.OffsetLineTo(1, 1);
	
	// Bitblt to screen
	pDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);
	
	// Cleanup
	blackPen.DeleteObject();
	whitePen.DeleteObject();
	yellowPen.DeleteObject();
	olivePen.DeleteObject();
	bmp.DeleteObject();
}

void CBrowseCtrl::DrawButtonFolder(CDC *pDC, COLORREF bkColor, const CRect& rect) const
{
	CDC memDC;
	CBitmap bmp;
	PrepareMemDC(&memDC, &bmp, pDC, rect, bkColor);

	CLineDraw ld(&memDC);
	const BOOL DISABLED = (GetStyle() & WS_DISABLED) != 0;
	int i = 0;

	CPen blackPen, whitePen, yellowPen, darkPen, grayPen;
	blackPen.CreatePen(PS_SOLID, 1, DISABLED ? BC_COLOR_DARK : BC_COLOR_BLACK);
	whitePen.CreatePen(PS_SOLID, 1, DISABLED ? BC_COLOR_WHITE : BC_COLOR_WHITE);
	yellowPen.CreatePen(PS_SOLID, 1, DISABLED ? BC_COLOR_GRAY : BC_COLOR_YELLOW);
	darkPen.CreatePen(PS_SOLID, 1, DISABLED ? BC_COLOR_DARK : BC_COLOR_DARK);
	grayPen.CreatePen(PS_SOLID, 1, DISABLED ? BC_COLOR_GRAY : BC_COLOR_GRAY);
	
	// right side black part
	memDC.SelectObject(&blackPen);
	ld.InitOffsetMoveTo(15, 4);
	ld.OffsetLineTo(0, 9);
	ld.OffsetLineTo(-12, 0);
	ld.OffsetMoveTo(11, -1);
	ld.OffsetLineTo(-2, -5);

	// front white part
	memDC.SelectObject(&whitePen);
	ld.InitOffsetMoveTo(3, 12);
	ld.OffsetLineTo(-2, -5);
	ld.OffsetLineTo(9, 0);

	// front dark frame
	memDC.SelectObject(&darkPen);
	ld.InitOffsetMoveTo(13, 11);
	ld.OffsetLineTo(0, 1);
	ld.OffsetLineTo(-11, 0);
	ld.OffsetLineTo(-2, -5);
	ld.OffsetLineTo(0, -1);
	ld.OffsetLineTo(12, 0);
	ld.OffsetLineTo(-1, 1);
	ld.OffsetMoveTo(2, 1);
	ld.OffsetLineTo(-1, 1);

	// front gray patterns
	memDC.SelectObject(&grayPen);
	ld.InitOffsetMoveTo(2, 8);
	ld.OffsetLineTo(3, 3);

	for (i = 0; i < 5; i++)
	{
		ld.InitOffsetMoveTo(i * 2 + 2, 8);
		if (i == 4)
			ld.OffsetLineTo(2, 2);
		else
			ld.OffsetLineTo(3, 3);
	}

	// front yellow patterns
	memDC.SelectObject(&yellowPen);
	ld.InitOffsetMoveTo(3, 10);
	ld.OffsetLineTo(1, 1);

	for (i = 0; i < 5; i++)
	{
		ld.InitOffsetMoveTo(3 + i * 2, 8);
		if (i == 4)
			ld.OffsetLineTo(0, 0);
		else
			ld.OffsetLineTo(3, 3);
	}

	// rear dark frame
	memDC.SelectObject(&darkPen);
	ld.InitOffsetMoveTo(1, 5);
	ld.OffsetLineTo(0, -2);
	ld.OffsetLineTo(2, -2);
	ld.OffsetLineTo(4, 0);
	ld.OffsetLineTo(2, 2);
	ld.OffsetLineTo(5, 0);
	ld.OffsetLineTo(0, 7);

	// rear white part
	memDC.SelectObject(&whitePen);
	ld.InitOffsetMoveTo(2, 5);
	ld.OffsetLineTo(0, -2);
	ld.OffsetLineTo(1, -1);
	ld.OffsetLineTo(4, 0);
	ld.OffsetLineTo(2, 2);
	ld.OffsetLineTo(4, 0);

	// rear gray patterns
	memDC.SelectObject(&grayPen);
	ld.InitOffsetMoveTo(3, 5);
	ld.OffsetLineTo(0, 0);

	for (i = 0; i < 3; i++)
	{
		ld.InitOffsetMoveTo(3 + i * 2, 3);
		ld.OffsetLineTo(2, 2);
	}

	ld.InitOffsetMoveTo(11, 5);
	ld.OffsetLineTo(0, 0);
	ld.OffsetMoveTo(2, 0);
	ld.OffsetLineTo(0, 0);
	ld.OffsetMoveTo(0, 2);
	ld.OffsetLineTo(0, 0);

	// rear yellow patterns
	memDC.SelectObject(&yellowPen);
	for (i = 0; i < 5; i++)
	{
		ld.InitOffsetMoveTo(4 + i * 2, 5);
		if (i == 0)
			ld.OffsetLineTo(-1, -1);		
		else if (i == 3)
			ld.OffsetLineTo(0, 0);
		else if (i == 4)
			ld.OffsetLineTo(1, 1);
		else
			ld.OffsetLineTo(-2, -2);
	}

	// bitblt to screen
	pDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);

	// clean up
	blackPen.DeleteObject();
	whitePen.DeleteObject();
	yellowPen.DeleteObject();
	darkPen.DeleteObject();
	grayPen.DeleteObject();
	bmp.DeleteObject();
}

void CBrowseCtrl::DrawButtonExplorer(CDC *pDC, COLORREF bkColor, const CRect& rect) const
{
	CDC memDC;
	CBitmap bmp;
	PrepareMemDC(&memDC, &bmp, pDC, rect, bkColor);

	CLineDraw ld(&memDC);
	const BOOL DISABLED = (GetStyle() & WS_DISABLED) != 0;
	int i = 0;

	CPen blackPen, whitePen, yellowPen, darkPen, grayPen, olivePen, cyanPen, bluePen, navyPen;
	blackPen.CreatePen(PS_SOLID, 1, DISABLED ? BC_COLOR_DARK : BC_COLOR_BLACK);
	whitePen.CreatePen(PS_SOLID, 1, DISABLED ? BC_COLOR_WHITE : BC_COLOR_WHITE);
	yellowPen.CreatePen(PS_SOLID, 1, DISABLED ? BC_COLOR_GRAY : BC_COLOR_YELLOW);
	darkPen.CreatePen(PS_SOLID, 1, DISABLED ? BC_COLOR_DARK : BC_COLOR_DARK);
	grayPen.CreatePen(PS_SOLID, 1, DISABLED ? BC_COLOR_GRAY : BC_COLOR_GRAY);
	olivePen.CreatePen(PS_SOLID, 1, DISABLED ? BC_COLOR_GRAY : BC_COLOR_OLIVE);
	cyanPen.CreatePen(PS_SOLID, 1, DISABLED ? BC_COLOR_WHITE : BC_COLOR_CYAN);
	bluePen.CreatePen(PS_SOLID, 1, DISABLED ? BC_COLOR_DARK : BC_COLOR_BLUE);
	navyPen.CreatePen(PS_SOLID, 1, DISABLED ? BC_COLOR_DARK : BC_COLOR_NAVY);

	// top-left dark frame
	memDC.SelectObject(&darkPen);
	ld.InitOffsetMoveTo(0, 11);
	ld.OffsetLineTo(0, -9);
	ld.OffsetLineTo(2, -2);
	ld.OffsetLineTo(4, 0);
	ld.OffsetLineTo(2, 2);
	ld.OffsetLineTo(5, 0);

	// scope dark border
	ld.InitOffsetMoveTo(8, 9);
	ld.OffsetLineTo(-1, 1);
	ld.OffsetLineTo(-3, 0);
	ld.OffsetLineTo(-2, -2);
	ld.OffsetLineTo(0, -2);
	ld.OffsetLineTo(2, -2);
	ld.OffsetLineTo(3, 0);
	ld.OffsetLineTo(2, 2);

	// black lines
	memDC.SelectObject(&blackPen);
	ld.InitOffsetMoveTo(14, 3);
	ld.OffsetLineTo(0, 8);
	ld.OffsetLineTo(-1, 1);
	ld.OffsetLineTo(1, 1);
	ld.OffsetLineTo(0, 1);
	ld.OffsetLineTo(-1, 1);
	ld.OffsetLineTo(-1, 0);
	ld.OffsetMoveTo(-4, -3);
	ld.OffsetLineTo(-7, 0);
	ld.OffsetMoveTo(4, -2);
	ld.OffsetLineTo(1, 0);
	ld.OffsetLineTo(2, -2);
	ld.OffsetLineTo(0, -2);
	ld.OffsetLineTo(-2, -2);

	// yellow lines
	memDC.SelectObject(&yellowPen);
	ld.InitOffsetMoveTo(2, 10);
	ld.OffsetLineTo(0, 0);
	ld.InitOffsetMoveTo(2, 4);
	ld.OffsetLineTo(0, -2);
	ld.OffsetLineTo(1, -1);
	ld.OffsetLineTo(1, 1);
	ld.OffsetLineTo(1, -1);
	ld.OffsetLineTo(7, 7);
	ld.OffsetMoveTo(-2, 0);
	ld.OffsetLineTo(2, 2);
	ld.OffsetMoveTo(0, -4);
	ld.OffsetLineTo(-2, -2);
	ld.OffsetMoveTo(2, 0);
	ld.OffsetLineTo(0, 0);

	// gray parts
	memDC.SelectObject(&grayPen);
	ld.InitOffsetMoveTo(1, 2);

	int q = -1;
	for (i = 0; i < 5; i++, q = -q)
		ld.OffsetLineTo(1, q);

	ld.OffsetLineTo(7, 7);
	ld.OffsetMoveTo(0, -2);
	ld.OffsetLineTo(-1, -1);
	ld.OffsetMoveTo(-1, 3);
	ld.OffsetLineTo(2, 2);
	ld.OffsetMoveTo(-4, 1);
	ld.OffsetLineTo(0, 0);
	ld.OffsetMoveTo(-2, -1);
	ld.OffsetLineTo(1, -1);
	ld.OffsetMoveTo(0, -2);
	ld.OffsetLineTo(-4, 4);
	ld.OffsetLineTo(-1, -1);
	ld.OffsetMoveTo(0, -4);
	ld.OffsetLineTo(1, -1);

	// white parts
	memDC.SelectObject(&whitePen);
	ld.InitOffsetMoveTo(1, 10);
	ld.OffsetLineTo(0, -7);
	ld.OffsetLineTo(11, 0);
	ld.InitOffsetMoveTo(3, 6);
	ld.OffsetLineTo(1, -1);
	ld.OffsetMoveTo(2, 0);
	ld.OffsetLineTo(-3, 3);

	// Olive parts
	memDC.SelectObject(&olivePen);
	ld.InitOffsetMoveTo(13, 3);
	ld.OffsetLineTo(0, 8);
	ld.OffsetLineTo(-1, 0);
	ld.OffsetLineTo(-2, -2);
	ld.OffsetLineTo(-1, 0);
	ld.OffsetLineTo(0, -2);
	ld.OffsetMoveTo(-1, 4);
	ld.OffsetLineTo(-6, 0);

	// Cyan parts
	memDC.SelectObject(&cyanPen);
	ld.InitOffsetMoveTo(5, 5);
	ld.OffsetLineTo(-2, 2);
	ld.OffsetLineTo(2, 2);
	ld.OffsetLineTo(2, -2);
	ld.OffsetLineTo(-1, -1);
	ld.OffsetLineTo(-1, 1);
	ld.InitOffsetMoveTo(9, 11);
	ld.OffsetLineTo(3, 3);

	// Navy parts
	memDC.SelectObject(&navyPen);
	ld.InitOffsetMoveTo(8, 11);
	ld.OffsetLineTo(3, 3);

	// Blue parts
	memDC.SelectObject(&bluePen);
	ld.InitOffsetMoveTo(9, 10);
	ld.OffsetLineTo(4, 4);
	ld.OffsetLineTo(0, -1);
	ld.OffsetLineTo(-3, -3);	

	// bitblt to screen
	pDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);

	// clean up
	blackPen.DeleteObject();
	whitePen.DeleteObject();
	yellowPen.DeleteObject();
	darkPen.DeleteObject();
	grayPen.DeleteObject();
	olivePen.DeleteObject();
	cyanPen.DeleteObject();
	bluePen.DeleteObject();
	navyPen.DeleteObject();
	bmp.DeleteObject();
}

void CBrowseCtrl::OnMove(int x, int y) 
{
	CButton::OnMove(x, y);
	RecalculateRects(TRUE);
}

void CBrowseCtrl::OnSize(UINT nType, int cx, int cy) 
{
	CButton::OnSize(nType, cx, cy);
	RecalculateRects(TRUE);
}

void CBrowseCtrl::RecalculateRects(BOOL bMoveEdit)
{
	ASSERT(::IsWindow(m_hWnd));
	CRect rcClient;
	GetClientRect(&rcClient);	

	// get the button rect
	m_rcButton = rcClient;
	CSize netSize(ICON_WIDTH, ICON_HEIGHT);
	int nReqWidth = ICON_WIDTH;

	if ((m_dwStyle & BC_BTN_ICON) == 0)
	{
		// Unlike icons, text size could vary
		CClientDC dc(this);
		dc.SelectObject(GetFont());
		netSize = dc.GetTextExtent(m_sButtonText);
		nReqWidth = netSize.cx;
	}

	if (nReqWidth < ICON_WIDTH)
		nReqWidth = ICON_WIDTH;
	nReqWidth += WIDTH_SPACE;

	if (m_rcButton.Width() > nReqWidth)
	{
		if (m_dwStyle & BC_BTN_LEFT)
			m_rcButton.right = m_rcButton.left + nReqWidth; // Left side
		else
			m_rcButton.left = m_rcButton.right - nReqWidth; // Right side
	}

	// get the content rect(areat for drawing icons and text on the browse button)
	CRect rcBtn = m_rcButton;
	rcBtn.DeflateRect(BTN_EDGE, BTN_EDGE);
	
	m_rcContent = CRect(rcBtn.TopLeft(), netSize);

	if (rcBtn.Height() > netSize.cy)
		m_rcContent.OffsetRect(0, (rcBtn.Height() - netSize.cy) / 2);
	else
		m_rcContent.bottom = rcBtn.bottom;

	if (rcBtn.Width() > netSize.cx)
		m_rcContent.OffsetRect((rcBtn.Width() - netSize.cx) / 2, 0);
	else
		m_rcContent.right = rcBtn.right;
	
	// Get the edit box area
	m_rcEdit = rcClient;
	if (m_dwStyle & BC_BTN_LEFT)
		m_rcEdit.left = m_rcButton.right;
	else
		m_rcEdit.right = m_rcButton.left;

	if (bMoveEdit && ::IsWindow(m_wndEdit.m_hWnd))
		m_wndEdit.MoveWindow(&m_rcEdit, TRUE);
}

BOOL CBrowseCtrl::IsEditManuallyChanged() const
{
	return m_bEditChanged && m_sEditText.CompareNoCase(CString(m_lpszPathNames)) != 0;
}

void CBrowseCtrl::SetDialogBanner(LPCTSTR lpszBanner)
{
	m_sDlgBanner = lpszBanner;
}

CString CBrowseCtrl::GetDialogBanner() const
{
	return m_sDlgBanner;
}

void CBrowseCtrl::ModifyButtonStyle(DWORD dwRemove, DWORD dwAdd)
{
	DWORD dwStyle = m_dwStyle;
	dwStyle &= ~dwRemove;
	dwStyle |= dwAdd;
	SetButtonStyle(dwStyle);
}

void CBrowseCtrl::PrepareMemDC(CDC *pMemDC, CBitmap *pBmp, CDC *pSrcDC, const CRect &srcRect, COLORREF bkColor) const
{
	pMemDC->CreateCompatibleDC(pSrcDC);
	pBmp->CreateCompatibleBitmap(pSrcDC, srcRect.Width(), srcRect.Height());
	pMemDC->SelectObject(pBmp);
	pMemDC->FillSolidRect(CRect(0, 0, srcRect.Width(), srcRect.Height()), bkColor);
}

BOOL CBrowseCtrl::SplitPath(LPCTSTR lpszPathName, CString *pStrDrvLetter, CString *pStrFolder, CString *pStrFileName, CString *pStrFileTitle, CString *pStrFileExt)
{
	const int FULL_LEN = 2048; // should be enough?

	TCHAR szFullPath[FULL_LEN + 1] = _T("");
	if (_tfullpath(szFullPath, lpszPathName, FULL_LEN) == NULL)
		return FALSE;	

	TCHAR szDrv[_MAX_DRIVE + 1] = _T("");
	TCHAR szDir[FULL_LEN + 1] = _T("");
	TCHAR szName[FULL_LEN + 1] = _T("");
	TCHAR szExt[FULL_LEN + 1] = _T("");
	_tsplitpath(szFullPath, szDrv, szDir, szName, szExt);

	if (pStrDrvLetter != NULL)
		*pStrDrvLetter = szDrv;

	if (pStrFolder != NULL)
	{
		*pStrFolder = CString(szDrv) + szDir;
		pStrFolder->TrimRight(_T('\\'));
		pStrFolder->TrimRight(_T('/'));
	}

	if (pStrFileName != NULL)
		*pStrFileName = CString(szName) + szExt;

	if (pStrFileTitle != NULL)
		*pStrFileTitle = szName;

	if (pStrFileExt != NULL)
	{
		*pStrFileExt = szExt;
		pStrFileExt->TrimLeft(_T('.'));
	}

	return TRUE;
}

CString CBrowseCtrl::GetDriveLetter() const
{
	CString str;
	SplitPath(GetPathName(), &str, NULL, NULL, NULL, NULL);
	return str;
}

CString CBrowseCtrl::GetDirectory() const
{
	if (m_dwStyle & BC_CTL_FOLDERSONLY)
		return GetPathName();

	CString str;
	SplitPath(GetPathName(), NULL, &str, NULL, NULL, NULL);
	return str;
}

void CBrowseCtrl::OnEnable(BOOL bEnable) 
{
	CButton::OnEnable(bEnable);	
	// TODO: Add your message handler code here

	if (::IsWindow(m_wndEdit.m_hWnd))
		m_wndEdit.EnableWindow(bEnable);

	if (::IsWindow(m_hWnd))
		RedrawWindow();
}

void CBrowseCtrl::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default	
	CButton::OnKeyDown(nChar, nRepCnt, nFlags);
	if (nChar == VK_SPACE)
	{
		m_bBtnPushed = TRUE;
		RedrawWindow();
	}
}

void CBrowseCtrl::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default
	CButton::OnKeyUp(nChar, nRepCnt, nFlags);
	if (nChar == VK_SPACE)
	{
		m_bBtnPushed = FALSE;
		RedrawWindow();
		OnButtonClicked();
	}	
}

void CBrowseCtrl::OnButtonClicked()
{
	DoModal();
	CWnd* pParent = GetParent();
	if (pParent != NULL && ::IsWindow(pParent->m_hWnd))
		pParent->PostMessage(WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(), 0), (LPARAM)NULL);
}

⌨️ 快捷键说明

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