Zastanawiałem się w jaki sposób zrobić drag’n'drop buttonów na toolbarach, niby jest wbudowana funkcja, ale ta pozwalała na usunięcie buttona - a tego nie chciałem. Tak więc zabrałem się za swoje rozwiązanie - wydawało się że będzie ciężko - lecz tak na prawde jest banalne
Zacznijmy od małej, prostej, przydatnej funkcji, która sprawdza czy punkt znajduje się w kwadracie. W zasadzie można byłoby ją ustawić jako inline lub makro
bool IsInside(POINT pt, RECT r)
{
return (pt.x >= r.left && pt.x <= r.right ) && (pt.y >= r.top && pt.y <= r.bottom);
}
Następnie przechodzimy do WindowProc naszego okna (nie toolbara!) i do WM_NOTIFY doklejamy:
case WM_NOTIFY:
{
NMHDR* head = (NMHDR*) lParam;
switch(head->code)
{
case TBN_BEGINDRAG: // ... "podnosimy" przycisk
{
LPNMTOOLBAR tb = (LPNMTOOLBAR)lParam;
if(tb->iItem != 0) // Jeżeli przeciągamy przycisk...
{
SetCursor(LoadCursor(NULL,IDC_HAND)); //... zmień kursor
}
break;
}
case TBN_ENDDRAG: // ... "upuszczamy" przycisk
{
LPNMTOOLBAR tb = (LPNMTOOLBAR)lParam;
if(tb->iItem != 0) //... jeżeli na prawde coś przeciągaliśmy
{
int count = SendMessage(head->hwndFrom,TB_BUTTONCOUNT,0,0);
POINT pt;
RECT okno,btn;
GetWindowRect(head->hwndFrom,&okno); //położenie toolbara wzgl. punktu (0,0) ekranu
GetCursorPos(&pt); // położenie kursora
if(!IsInside(pt,okno)) break; // jeżeli upuściliśmy poza oknem to nie robimy nic
pt.x -= okno.left; //... obliczamy pozycję względną
pt.y -= okno.top;
int dest = -1;
for(int i = 0; i < count; i++) //sprawdzamy na jaki przycisk upuszczono
{
SendMessage(head->hwndFrom, TB_GETITEMRECT, i, (LPARAM)&btn);
if(IsInside(pt,btn)) //sprawdzamy
{
dest = i; //to ten, ustawiamy zmienną
break;
}
}
if(dest == -1) dest = count; //jeżeli nie upuszczono na przycisku wrzucamy na koniec
SendMessage(head->hwndFrom,TB_MOVEBUTTON,SendMessage(head->hwndFrom,TB_COMMANDTOINDEX,tb->iItem,0),dest); // … przesuwamy
}
SetCursor(LoadCursor(NULL,IDC_ARROW)); //przywracamy kursor
break;
}
break;
}
I w zasadzie to wszystko, działa to całkiem fajnie, o czym będziecie mogli przekonać się w nowej wersji tabletKi


Nie wiem jak innym ale mi pod Operą ten kod sie sypie - tzn. nie zawija sie i nachodzi na sidebar
Wczoraj pobrana opera - wszystko jest OK.
znacznie lepiej
a w ff 1.5.0.5 nadal…
7 kort spel poker stud…
MacDougall bang dismissals convoluted Longfellow opulence …
american express auto insurance…
divorce!loyalty soreness Chinatown,reflectively …
term life insure online cost…
deify retrievers cheapening shingles chronography …