Port interfejsu Ribbon dla XP

0

Ostatnio zainteresowałem się ribbonem. Zainstalowałem win7 w virtual pc, skopiowałem tam gotowe sample i kolejno uruchamiałem. Fajnie by było, gdyby nie zalewała mnie krew z powodu ilości czasu potrzebnego na zainstalowanie systemu i jego uruchamianie/przywracanie stanu, lub nawet skokowe i mozolne ruchy myszy.

Wpadłem na pomysł by napisać wrappera ribbona dla XP na którym sobie siedzę. Nic prostszego, w jeden dzień napisałem dll ze wszystkimi interfejsami z uiribbon.h (sporo metod zwraca E_NOTIMPL). Drugiego dnia dodałem parsera xml (msxml3) który tworzy listę Command'ów i Tab'ów, oraz prosty handler WM_PAINT który rusuje tylko klikane zakładki i ten ładny gradient.

IUIImageFromBitmap mam kompletne, w sumie tam jest tylko jedna metoda. To samo z IUIImage.
IUIFramework po części działa. Metody Initialize, LoadUI, GetView i Destroy działają na tyle, by sample z MSDN się "uruchomiły".
LoadUI działa troszkę inaczej niż powinno. Zamiast ładować UI z zasobów lub skompilowanego xml'a, szuka pliku xml w katalogu programu i stąd odczytuje całą konfigurację.

Mam też wątek który kolejno "klika" wszystkie Command'y (odpala metodę handler->Execute).
W samplu Gallery przez kilka sekund widać jak na oknie pojawiają się kolorowe kwadraty, ale po chwili znikają, pewnie dlatego że do currentValue wstawiam przypadkowe liczby.

Odnoszę wrażenie że porwałem się z motyką na czołg, wiedząc że jestem dopiero na etapie ogarniania jak ten ribbon działa. A gdzie jeszcze mi do kompletnej implementacji grafiki i kolekcji properties.

Co myślicie o tym projekcie?
Załączam foto tego co mi już działa: http://i40.tinypic.com/21alstl.png

0

Odnoszę wrażenie że porwałem się z motyką na czołg, wiedząc że jestem dopiero na etapie ogarniania jak ten ribbon działa.

Tez tak mysle. Zalezy co chcesz osiagnac - jezeli dla cwiczen to ok. Ja tez kiedys pisalem menu a'la Office 2003 w WinApi i nawet ukończyłem i działało.

Pisanie wlasnego ribona mija sie raczej z celem tym bardziej, ze wystarczy MFC z Visual Studio 2008 SP1 i masz działające wstążki pod XP - mozesz korzystac do woli pod MFC.

A jezeli chcesz uzywac bez MFC to tez latwiej napisac jakiegos wrappera korzystajacego z tego i zamknać go w dll-ce niz od poczatku implementowac rysowanie tych cudów.

0

Z drugiej strony z tymi Ribbonami to są podobno jakieś problemy, patenty czy te sprawy, nie orientuję się dokładnie, bo ich nie używam, to nie czułem potrzeby, ale nawet tu się przewijała dyskusja o tym.
A zrobienie samemu, czegoś na styl ribbonów, może być ciekawe. Na jedną osobę może faktycznie lekko za dużo, ale w parę osób, w wolnych chwilach dla rozrywki, opensource'owo - czemu nie? Mi się idea podoba :)

0

Jakoś ze dwa dni temu wysłałem sampla na forum z aktywnym adminem z USA, dodałem notkę o daniu cynku if Law breaking, no i jak na razie nikt mi go nie dał.

Mam małe pytanie odnośnie automatycznego poszerzenia buttona. Wiadomo że button ma tekst i ewentualnie jakąś ikonkę. Ikonka jest, tekst też jest, ale trzeba dopasować szerokość buttona do szerokości tekstu, pozwalając na jednokrotne złamanie tekstu (dwie linie).
Napisałem funkcję która wyszukuje najdłuższego wyrazu w pixelach i tej wartości używam do ewentualnego poszerzenia buttona:

// w HDC jest docelowy font
void ComputeTextWidths(HDC hdc, LPWSTR pwsztext, int *ppTextWidth, int *ppMaxWordWidth)
{
	*ppMaxWordWidth = 0; // łamany tekst pod ikoną
	*ppTextWidth = 0; // tekst na prawo od ikony

	RECT rc;
	if (pwsztext)
	{
		DrawTextW(hdc, pwsztext, wcslen(pwsztext), &rc, DT_SINGLELINE|DT_CALCRECT);
		*ppTextWidth = rc.Width();

		BSTR bstrText = SysAllocString(pwsztext);

		WCHAR *token = wcstok(bstrText, L" ");
		while (token)
		{
			DrawTextW(hdc, token, wcslen(token), &rc, DT_SINGLELINE|DT_CALCRECT);
			*ppMaxWordWidth = __max(*ppMaxWordWidth, rc.Width());
			token = wcstok(NULL, L" ");
		}
		SysFreeString(bstrText);
	}
}

Macie jakieś lepsze sugestie (oprócz dodatkowych separatorów dla wcstok) ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1