📄 outbarctrl.cpp
字号:
}
void OutBarCtrl::removeItem(int i)
{
vector<OutBarItem *> &items = folders[selFolder]->items;
delete items[i];
items.erase(items.begin() + i);
repaintInsideRect();
}
void OutBarCtrl::renameUI()
{
onEditCanceled();
int obj = HITOBJ(lastHit);
int i = HITINDEX(lastHit);
DWORD flags = WS_VISIBLE | WS_CHILD | ES_CENTER;
const char *text = "";
editCtrl = new OutBarEdit(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 OutBarCtrl::addFolderUI()
{
OutBarFolder *f = new OutBarFolder("");
folders.insert(folders.begin() + selFolder + 1, f);
Invalidate();
lastHit = MAKEHIT(HT_FOLDER, selFolder + 1);
renameUI();
}
void OutBarCtrl::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);
}
void OutBarCtrl::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;
}
void OutBarCtrl::onEditCanceled()
{
if (editCtrl) {
delete editCtrl;
editCtrl = NULL;
}
}
BEGIN_MESSAGE_MAP(OutBarCtrl, CWnd)
//{{AFX_MSG_MAP(OutBarCtrl)
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
ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// OutBarCtrl message handlers
void OutBarCtrl::OnPaint()
{
CPaintDC dc(this); // device context for painting
CDC memDC;
memDC.CreateCompatibleDC(&dc);
CRect rcClient;
GetClientRect(rcClient);
CBitmap bm;
bm.CreateCompatibleBitmap(&dc, 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));
}
dc.BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &memDC, 0, 0, SRCCOPY);
memDC.SelectObject(oldBitmap);
}
void OutBarCtrl::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) {
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme);
tme.dwFlags = TME_LEAVE;
tme.hwndTrack = m_hWnd;
tme.dwHoverTime = 0;
// _TrackMouseEvent(&tme);
drawFolder(&dc, newIndex, hit == pressedHit, TRUE);
} else {
if (newObj == HT_ITEM)
hilightItem(&dc, newIndex, hit == pressedHit);
else if (newObj == HT_SCROLL && hit == pressedHit) {
SetTimer(IDT_SCROLL, 100, NULL);
scroll(newIndex);
}
}
}
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 OutBarCtrl::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, 100, NULL);
scroll(index);
}
CWnd::OnLButtonDown(nFlags, point);
}
void OutBarCtrl::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 {
selFolder = index;
Invalidate();
if (listener)
listener->selFolderChanged(selFolder);
}
} 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 OutBarCtrl::OnLButtonDblClk(UINT nFlags, CPoint point)
{
if (HITOBJ(lastHit) == HT_ITEM) {
KillTimer(IDT_DBLCLK);
if (listener)
listener->itemDoubleClicked(clickedItem);
clickedItem = -1;
}
CWnd::OnLButtonDblClk(nFlags, point);
}
void OutBarCtrl::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;
}
CWnd::OnTimer(nIDEvent);
}
void OutBarCtrl::OnSize(UINT nType, int cx, int cy)
{
CWnd::OnSize(nType, cx, cy);
resizeEditCtrl();
}
BOOL OutBarCtrl::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 OutBarCtrl::OnRButtonDown(UINT nFlags, CPoint point)
{
OnMouseMove(nFlags, point);
if (listener)
listener->rightButtonDown(HITOBJ(lastHit), HITINDEX(lastHit));
CWnd::OnRButtonDown(nFlags, point);
}
BOOL OutBarCtrl::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}
BOOL OutBarCtrl::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
if (currentCursor) {
SetCursor(currentCursor);
return TRUE;
}
return CWnd::OnSetCursor(pWnd, nHitTest, message);
}
void OutBarCtrl::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
int start = -1;
if (HITOBJ(lastHit) == HT_ITEM)
start = HITINDEX(lastHit);
vector<OutBarItem *> &items = folders[selFolder]->items;
int n = items.size();
int c = toupper(nChar);
int k = start;
for (int i = 0; i < n; ++i) {
if (toupper(items[++k % n]->text[0]) == c)
break;
}
if (i < n) {
k %= n;
lastHit = MAKEHIT(HT_ITEM, k);
scrollToPos(k);
}
CWnd::OnKeyDown(nChar, nRepCnt, nFlags);
}
LRESULT OutBarCtrl::OnMouseLeave(WPARAM wParam, LPARAM lParam)
{
int obj = HITOBJ(lastHit);
int index = HITINDEX(lastHit);
if (obj == HT_FOLDER) {
CClientDC dc(this);
drawFolder(&dc, index, FALSE, FALSE);
}
lastHit = pressedHit = HT_NONE;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -