void QSint::ScrollPanner::mouseMoveEvent(QMouseEvent *event) { if (m_panning && event->buttons() & Qt::LeftButton) { m_valueXpan = event->pos().x() + m_oldX; if (m_valueXpan < 0) m_valueXpan = 0; else if (m_valueXpan >= (width()-m_sizeXpan)) m_valueXpan = width()-m_sizeXpan; double dx = double(width()) / double(m_sizeX); int viewX = double(m_valueXpan) / dx + m_minX; emit scrollHorizontal(viewX); m_valueYpan = event->pos().y() + m_oldY; if (m_valueYpan < 0) m_valueYpan = 0; else if (m_valueYpan >= (height()-m_sizeYpan)) m_valueYpan = height()-m_sizeYpan; double dy = double(height()) / double(m_sizeY); int viewY = double(m_valueYpan) / dy + m_minY; emit scrollVertical(viewY); } }
void LLScrollContainer::updateScroll() { if (!mScrolledView) { return; } static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0); LLRect doc_rect = mScrolledView->getRect(); S32 doc_width = doc_rect.getWidth(); S32 doc_height = doc_rect.getHeight(); S32 visible_width = 0; S32 visible_height = 0; BOOL show_v_scrollbar = FALSE; BOOL show_h_scrollbar = FALSE; calcVisibleSize( &visible_width, &visible_height, &show_h_scrollbar, &show_v_scrollbar ); S32 border_width = getBorderWidth(); if( show_v_scrollbar ) { if( doc_rect.mTop < getRect().getHeight() - border_width ) { mScrolledView->translate( 0, getRect().getHeight() - border_width - doc_rect.mTop ); } scrollVertical( mScrollbar[VERTICAL]->getDocPos() ); mScrollbar[VERTICAL]->setVisible( TRUE ); S32 v_scrollbar_height = visible_height; if( !show_h_scrollbar && mReserveScrollCorner ) { v_scrollbar_height -= scrollbar_size; } mScrollbar[VERTICAL]->reshape( scrollbar_size, v_scrollbar_height, TRUE ); // Make room for the horizontal scrollbar (or not) S32 v_scrollbar_offset = 0; if( show_h_scrollbar || mReserveScrollCorner ) { v_scrollbar_offset = scrollbar_size; } LLRect r = mScrollbar[VERTICAL]->getRect(); r.translate( 0, mInnerRect.mBottom - r.mBottom + v_scrollbar_offset ); mScrollbar[VERTICAL]->setRect( r ); } else { mScrolledView->translate( 0, getRect().getHeight() - border_width - doc_rect.mTop ); mScrollbar[VERTICAL]->setVisible( FALSE ); mScrollbar[VERTICAL]->setDocPos( 0 ); } if( show_h_scrollbar ) { if( doc_rect.mLeft > border_width ) { mScrolledView->translate( border_width - doc_rect.mLeft, 0 ); mScrollbar[HORIZONTAL]->setDocPos( 0 ); } else { scrollHorizontal( mScrollbar[HORIZONTAL]->getDocPos() ); } mScrollbar[HORIZONTAL]->setVisible( TRUE ); S32 h_scrollbar_width = visible_width; if( !show_v_scrollbar && mReserveScrollCorner ) { h_scrollbar_width -= scrollbar_size; } mScrollbar[HORIZONTAL]->reshape( h_scrollbar_width, scrollbar_size, TRUE ); } else { mScrolledView->translate( border_width - doc_rect.mLeft, 0 ); mScrollbar[HORIZONTAL]->setVisible( FALSE ); mScrollbar[HORIZONTAL]->setDocPos( 0 ); } mScrollbar[HORIZONTAL]->setDocSize( doc_width ); mScrollbar[HORIZONTAL]->setPageSize( visible_width ); mScrollbar[VERTICAL]->setDocSize( doc_height ); mScrollbar[VERTICAL]->setPageSize( visible_height ); } // end updateScroll
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; switch (message) { case WM_CREATE: tabList->push_back(TabObject(gdi_main->getTabs().get(TCmpTab), "Tävling")); tabList->push_back(TabObject(gdi_main->getTabs().get(TRunnerTab), "Deltagare")); tabList->push_back(TabObject(gdi_main->getTabs().get(TTeamTab), "Lag(flera)")); tabList->push_back(TabObject(gdi_main->getTabs().get(TListTab), "Listor")); { TabAuto *ta = (TabAuto *)gdi_main->getTabs().get(TAutoTab); tabList->push_back(TabObject(ta, "Automater")); tabAutoRegister(ta); } tabList->push_back(TabObject(gdi_main->getTabs().get(TSpeakerTab), "Speaker")); tabList->push_back(TabObject(gdi_main->getTabs().get(TClassTab), "Klasser")); tabList->push_back(TabObject(gdi_main->getTabs().get(TCourseTab), "Banor")); tabList->push_back(TabObject(gdi_main->getTabs().get(TControlTab), "Kontroller")); tabList->push_back(TabObject(gdi_main->getTabs().get(TClubTab), "Klubbar")); tabList->push_back(TabObject(gdi_main->getTabs().get(TSITab), "SportIdent")); INITCOMMONCONTROLSEX ic; ic.dwSize=sizeof(ic); ic.dwICC=ICC_TAB_CLASSES ; InitCommonControlsEx(&ic); hMainTab=CreateWindowEx(0, WC_TABCONTROL, "tabs", WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS, 0, 0, 300, 20, hWnd, 0, hInst, 0); createTabs(true, true, false, false, false, false, false, false); SetTimer(hWnd, 4, 10000, 0); //Connection check break; case WM_MOUSEWHEEL: { int dz = GET_WHEEL_DELTA_WPARAM(wParam); scrollVertical(gdi_main, -dz, hWndWorkspace); } break; case WM_SIZE: MoveWindow(hMainTab, 0,0, LOWORD(lParam), 30, 1); MoveWindow(hWndWorkspace, 0, 30, LOWORD(lParam), HIWORD(lParam)-30, 1); RECT rc; GetClientRect(hWndWorkspace, &rc); PostMessage(hWndWorkspace, WM_SIZE, wParam, MAKELONG(rc.right, rc.bottom)); break; case WM_WINDOWPOSCHANGED: if (gEvent) { LPWINDOWPOS wp = (LPWINDOWPOS) lParam; // points to size and position data if (wp->x>=0 && wp->y>=0 && wp->cx>300 && wp->cy>200) { gEvent->setProperty("xpos", wp->x); gEvent->setProperty("ypos", wp->y); gEvent->setProperty("xsize", wp->cx); gEvent->setProperty("ysize", wp->cy); } else { Sleep(0); } } return DefWindowProc(hWnd, message, wParam, lParam); case WM_TIMER: if (!gdi_main) return 0; if (wParam==1) { if (autoTask) autoTask->autoSave(); } else if (wParam==2) { // Interface timeouts (no synch) if (autoTask) autoTask->interfaceTimeout(gdi_extra); } else if (wParam==3) { if (autoTask) autoTask->synchronize(gdi_extra); } else if (wParam==4) { // Verify database link if (gEvent) gEvent->verifyConnection(); //OutputDebugString("Verify link\n"); //Sleep(0); if (gdi_main) { if (gEvent->hasClientChanged()) { gdi_main->makeEvent("Connections", "verify_connection", 0, 0, false); gEvent->validateClients(); } } } break; case WM_ACTIVATE: if (LOWORD(wParam) != WA_INACTIVE) currentFocusIx = 0; return DefWindowProc(hWnd, message, wParam, lParam); case WM_NCACTIVATE: if (gdi_main && gdi_main->hasToolbar()) gdi_main->activateToolbar(wParam != 0); return DefWindowProc(hWnd, message, wParam, lParam); case WM_NOTIFY: { LPNMHDR pnmh = (LPNMHDR) lParam; if (pnmh->hwndFrom==hMainTab && gdi_main && gEvent) { if (pnmh->code==TCN_SELCHANGE) { int id=TabCtrl_GetCurSel(hMainTab); for (list<TabObject>::iterator it=tabList->begin();it!=tabList->end();++it) { if (it->id==id) { try { gdi_main->setWaitCursor(true); it->loadPage(*gdi_main); } catch(std::exception &ex) { gdi_main->alert(ex.what()); } gdi_main->setWaitCursor(false); } else { it->leavePage(*gdi_main); } } } else if (pnmh->code==TCN_SELCHANGING) { if (gdi_main == 0) { MessageBeep(-1); return true; } else { if (!gdi_main->canClear()) return true; return false; } } } break; } case WM_USER: //The card has been read and posted to a synchronized //queue by different thread. Read and process this card. { SICard sic; while (gSI && gSI->GetCard(sic)) InsertSICard(*gdi_main, sic); break; } case WM_USER+1: MessageBox(hWnd, "Kommunikationen med en SI-enhet avbröts.", "SportIdent", MB_OK); break; case WM_USER + 3: //OutputDebugString("Get punch from queue\n"); if (autoTask) autoTask->advancePunchInformation(gdi_extra); break; case WM_USER + 4: if (autoTask) autoTask->synchronize(gdi_extra); break; case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // Parse the menu selections: switch (wmId) { case IDM_EXIT: //DestroyWindow(hWnd); PostMessage(hWnd, WM_CLOSE, 0,0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); // TODO: Add any drawing code here... EndPaint(hWnd, &ps); break; case WM_CLOSE: if (!gEvent || gEvent->empty() || gdi_main->ask("Vill du verkligen stänga MeOS?")) DestroyWindow(hWnd); break; case WM_DESTROY: delete gSI; gSI=0; if (gEvent) { try { gEvent->save(); } catch(std::exception &ex) { MessageBox(hWnd, lang.tl(ex.what()).c_str(), "Fel när tävlingen skulle sparas", MB_OK); } try { gEvent->saveRunnerDatabase("database", true); } catch(std::exception &ex) { MessageBox(hWnd, lang.tl(ex.what()).c_str(), "Fel när löpardatabas skulle sparas", MB_OK); } if (gEvent) gEvent->saveProperties(settings); delete gEvent; gEvent=0; } PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }
LRESULT CALLBACK WorkSpaceWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; LONG ix = GetWindowLong(hWnd, GWL_USERDATA); gdioutput *gdi = 0; if (ix < LONG(gdi_extra.size())) gdi = gdi_extra[ix]; if (gdi) { LRESULT res = gdi->ProcessMsg(message, lParam, wParam); if (res) return res; } switch (message) { case WM_CREATE: break; case WM_SIZE: //SCROLLINFO si; //si.cbSize=sizeof(si); //si.fMask=SIF_PAGE|SIF_RANGE; int nHeight; nHeight = HIWORD(lParam); int nWidth; nWidth = LOWORD(lParam); updateScrollInfo(hWnd, *gdi, nHeight, nWidth); /* int maxx, maxy; gdi->clipOffset(nWidth, nHeight, maxx, maxy); si.nMin=0; if (maxy>0) { si.nMax=maxy+nHeight; si.nPos=gdi->GetOffsetY(); si.nPage=nHeight; } else { si.nMax=0; si.nPos=0; si.nPage=0; } SetScrollInfo(hWnd, SB_VERT, &si, true); si.nMin=0; if (maxx>0) { si.nMax=maxx+nWidth; si.nPos=gdi->GetOffsetX(); si.nPage=nWidth; } else { si.nMax=0; si.nPos=0; si.nPage=0; } SetScrollInfo(hWnd, SB_HORZ, &si, true); */ InvalidateRect(hWnd, NULL, true); break; case WM_KEYDOWN: //gdi->keyCommand(; break; case WM_VSCROLL: { int nScrollCode = (int) LOWORD(wParam); // scroll bar value //int hwndScrollBar = (HWND) lParam; // handle to scroll bar int yInc; int yPos=gdi->GetOffsetY(); RECT rc; GetClientRect(hWnd, &rc); int pagestep = max(50, int(0.9*rc.bottom)); switch(nScrollCode) { // User clicked shaft left of the scroll box. case SB_PAGEUP: yInc = -pagestep; break; // User clicked shaft right of the scroll box. case SB_PAGEDOWN: yInc = pagestep; break; // User clicked the left arrow. case SB_LINEUP: yInc = -10; break; // User clicked the right arrow. case SB_LINEDOWN: yInc = 10; break; // User dragged the scroll box. case SB_THUMBTRACK: { // Initialize SCROLLINFO structure SCROLLINFO si; ZeroMemory(&si, sizeof(si)); si.cbSize = sizeof(si); si.fMask = SIF_TRACKPOS; if (!GetScrollInfo(hWnd, SB_VERT, &si) ) return 1; // GetScrollInfo failed yInc = si.nTrackPos - yPos; break; } default: yInc = 0; } scrollVertical(gdi, yInc, hWnd); gdi->storeAutoPos(gdi->GetOffsetY()); break; } case WM_HSCROLL: { int nScrollCode = (int) LOWORD(wParam); // scroll bar value //int hwndScrollBar = (HWND) lParam; // handle to scroll bar int xInc; int xPos=gdi->GetOffsetX(); switch(nScrollCode) { // User clicked shaft left of the scroll box. case SB_PAGEUP: xInc = -80; break; // User clicked shaft right of the scroll box. case SB_PAGEDOWN: xInc = 80; break; // User clicked the left arrow. case SB_LINEUP: xInc = -10; break; // User clicked the right arrow. case SB_LINEDOWN: xInc = 10; break; // User dragged the scroll box. case SB_THUMBTRACK: { // Initialize SCROLLINFO structure SCROLLINFO si; ZeroMemory(&si, sizeof(si)); si.cbSize = sizeof(si); si.fMask = SIF_TRACKPOS; if (!GetScrollInfo(hWnd, SB_HORZ, &si) ) return 1; // GetScrollInfo failed xInc = si.nTrackPos - xPos; break; } //xInc = HIWORD(wParam) - xPos; //break; default: xInc = 0; } SCROLLINFO si; si.cbSize=sizeof(si); si.fMask=SIF_ALL; GetScrollInfo(hWnd, SB_HORZ, &si); if (si.nPage==0) xInc = 0; int a=si.nMax-signed(si.nPage-1) - xPos; if ((xInc = max( -xPos, min(xInc, a)))!=0) { xPos += xInc; RECT ScrollArea, ClipArea; GetClientRect(hWnd, &ScrollArea); ClipArea=ScrollArea; gdi->SetOffsetX(xPos); ScrollWindowEx (hWnd, -xInc, 0, 0, &ClipArea, (HRGN) NULL, (LPRECT) NULL, SW_INVALIDATE|SW_SCROLLCHILDREN); si.cbSize = sizeof(si); si.fMask = SIF_POS; si.nPos = xPos; SetScrollInfo(hWnd, SB_HORZ, &si, TRUE); UpdateWindow (hWnd); } break; } case WM_MOUSEWHEEL: { int dz = GET_WHEEL_DELTA_WPARAM(wParam); scrollVertical(gdi, -dz, hWnd); gdi->storeAutoPos(gdi->GetOffsetY()); } break; case WM_TIMER: if (wParam == 1001) { double autoScroll, pos; gdi->getAutoScroll(autoScroll, pos); SCROLLINFO si; si.cbSize = sizeof(si); si.fMask = SIF_ALL; GetScrollInfo(hWnd, SB_VERT, &si); int dir = gdi->getAutoScrollDir(); int dy = 0; if ((dir<0 && si.nPos <= si.nMin) || (dir>0 && (si.nPos + int(si.nPage)) >= si.nMax)) { autoScroll = -autoScroll; gdi->setAutoScroll(-1); // Mirror double nextPos = pos + autoScroll; dy = int(nextPos - si.nPos); gdi->storeAutoPos(nextPos); //gdi->setData("AutoScroll", -int(data)); } else { double nextPos = pos + autoScroll; dy = int(nextPos - si.nPos); gdi->storeAutoPos(nextPos); //gdi->setData("Discrete", DWORD(nextPos*1e3)); } scrollVertical(gdi, dy, hWnd); } else MessageBox(hWnd, "Runtime exception", 0, MB_OK); break; case WM_ACTIVATE: { int fActive = LOWORD(wParam); if (fActive != WA_INACTIVE) currentFocusIx = ix; return DefWindowProc(hWnd, message, wParam, lParam); } case WM_USER + 2: if (gdi) LoadPage(*gdi, TabType(wParam)); break; case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // Parse the menu selections: switch (wmId) { case 0: break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); RECT rt; GetClientRect(hWnd, &rt); if (gdi && (ps.rcPaint.right|ps.rcPaint.left|ps.rcPaint.top|ps.rcPaint.bottom) != 0 ) gdi->draw(hdc, rt, ps.rcPaint); /*{ HANDLE icon = LoadImage(hInst, (LPCTSTR)IDI_MEOS, IMAGE_ICON, 64, 64, LR_SHARED); DrawIconEx(hdc, 0,0, (HICON)icon, 64, 64, 0, NULL, DI_NORMAL | DI_COMPAT); }*/ EndPaint(hWnd, &ps); break; case WM_ERASEBKGND: return 0; break; case WM_DESTROY: if (ix > 0) { gdi->makeEvent("CloseWindow", "meos", 0, 0, false); gdi_extra[ix] = 0; delete gdi; while(!gdi_extra.empty() && gdi_extra.back() == 0) gdi_extra.pop_back(); } break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }