📄 browsectrl.cpp
字号:
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 + -