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 :)