Prośba o sprawdzenie programu

0

www.pliki.orge.pl/test.exe

Napisalem biblioteke, ktora zamienia menu programu zapisane w zasobach na OwnerDraw (w WinApi).

Chodzi mi o to, zeby ktos sprawdzil, czy dziala to u niego tak jak trzeba - zwlascza chodzi mi o systemy inne niz WinXP oraz o rozne ustawienia systemowe (typu duże czcionki w systemie itd.)

0

Windows Media Center Edition 2005 [spolszczony] - działa jak trzeba, mimo iż męczyłem go na wszelkie znane mi sposoby i style wyglądu. Ładnie to wygląda, swoją drogą.

0

Na Windows XP SP2 (schemat Luna, oliwkowozielony, standardowe rozmiary czcionek) wszystko działa dobrze.

Wirtualizowany (więc nie wiem czy tak samo zachowuje się prawdziwy) Windows Millenium Edition generuje błąd:

user image

0

Ładnie to wygląda, swoją drogą.

Office2003 ;)

Mysle, ze pod XP/NT/2000 powinno raczej byc ok.... dobrze by bylo jeszcze sprawdzic ME i starsze (pod 9x mialem problem z wyswietlaniem zaznaczenia i nie wiem czy do konca udalo mi sie go rozwiazac).

0

Win 98 SE (normalny, nie wirtualny) -> to samo co u Ktosia na wirtualnym ME

0

Mysle ze to dlatego, ze program byl skompresowany FSG. Tutaj jest wersja nie skompresowana:

www.pliki.orge.pl/menu.exe

Sprobujcie tego, powinno sie uruchamiac.

0

Wine 0.9.7 pod FreeBSD:
http://www.daminet.pl/~wolverine/testowy.png (kursor myszki jest na jakims elemencie - nic po najechaniu sie nie zmienia [cos tam miga, ze niby chce])

0

Wersja nieskompresowana - bez zmian.

0

Wine 0.9.7 pod FreeBSD

To moze wynikac z tego, ze WinE czegos nie obsluguje.... pewnie jak nastawisz emulacje WinXP/2000 to bedzie ok - jak ustawie w WinXP zgodnosc z win95/98/Me to tez mam tak samo :| A wynika to z tego problemu, o ktorym wczesniej pisalem i nie wiem jak to obejsc - jak sie nie uda to moze kod tu wrzuce - chodzi o to, ze w Win 9x/Me wartosc jednej zmiennej, ktora wskazuje czy item jest zaznaczony ma inna wartosc, niz pod XP/2000/NT - stad wlasnie problemy. Ja mam XP i nie moge sprawdzic sam.

Szczawik napisał(a)

Wersja nieskompresowana - bez zmian.

Czyli tez wszystko ok? Jezeli nieskompresowane tez sie nie uruchamia pod Me/9x, to chyba juz bedzie wina kompilatora, albo nie wiem sam :|

Moze jeszcze by ktos sprobowal odpalic pod 9x/Me nieskompresowana wersje, wtedy bede wszystko wiedziec.

0
othello napisał(a)

Moze jeszcze by ktos sprobowal odpalic pod 9x/Me nieskompresowana wersje, wtedy bede wszystko wiedziec.

U mnie pod Win 98 SE wersja nieskompresowana zachowuje się dokładnie tak samo jak skompresowana - czyli nie uruchamia się, z komunikatem jak wyżej u Ktosia.

0

Ostatnia rzecz, ktora mi przychodzi do glowy: prawdopodobnie wersje starsze niz Win2000 nie obsluguja zasobow o ID wiekszym niz 32768 - a ikony itemow mialy takie ID.

Ostateczna wersja:

www.pliki.orge.pl/menu2.exe

Chodzilo mi jedynie o sprawdzenie, czy widac zaznaczenie pod kazda wersja Win, ta sprawa z uruchamianiem wyszla przy okazji..........

Jezeli teraz tez sie nie odpali pod win 9x/Me to juz koncza mi sie pomysly :| Format exeka jest przeciez taki sam dla kazdej wersji win o ile wiem :|

0

No więc po kolei (win 98 SE):

Program się wreszcie uruchamia:
user image

Po zmianie wielkości czcionki menu w trakcie działania programu:
user image

Po ponownym uruchomieniu programu przy zmienionej czcionce:
user image

Nie wiem czy o to Ci chodziło, jeśli sprawdzałem coś nie tak to sorry...

0

Ok, jezeli nie ma tego, o czym ktos pisal wyzej pod Wine - czyli jesli jest zaznaczenie w menu pod kursorem myszy to wszystko wyglada raczej ok - w sumie nikt nie bedzie zmienial czcionek w systemie w czasie, gdy program jest uruchomiony- a wyswietlanie paska po lewej przy bardzo duzych czcionkach do poprawienia (stosunkowo latwo zreszta).
Ale teraz sprawdzilem u siebie pod Win98 i wyglada na to ze jest wszystko w porzadku.

Jeszcze tylko chetnie bym sie przekonal, jak to dziala pod WinMe.

Wiem, ze przynudzam troche ale jezeli juz mam to stosowac w moich programach, to musze miec pewnosc ze zawsze dziala jak trzeba - zywkle menu zawsze sie dobrze wyswietli, a tutaj nie jest to pewne dopoki sie nie sprawdzi.

0

Na moim Windows Millenium (oczywiście na maszynie wirtualnej, ale działa jak trzeba :-)) wszystko było dobrze.

Normalnie:
user image

Zmiana czcionki na dużą:
user image

Jak wyżej, ale w trakcie działania programu (i nieco większa czcionka):
user image

Czasami przy szybkim "lataniu" kursorem na miejscu, gdzie są glyphy pojawiał się czarny kwadracik, który znikał prawie natychmiast. tak jak by system nie nadążał z odrysowywaniem, to może być wina sterownika od karty graficznej.

Chcesz, aby sprawdzić na Windows 95, którego będę instalował za niedługo?

0

Chcesz, aby sprawdzić na Windows 95, którego będę instalował za niedługo?

No jasne, gdybys mial chwile czasu.

Dziwne troche z ta zmiana czcionek w trakcie dzialania programu - jak zmienialem czcionki w XP w czasie gdy program byl uruchomiony, to menu bylo przeskalowane juz od razu - widze ze w 98/Me i pewnie 95 tak juz nie jest i nie mam pojecia dlaczego :|
Z tego samego powodu zrezygnowalem ze zmieniania glownych itemow w menu - bo w winach z rodziny 9x w ogole jakies herezje wychodzily - rozwiniety popup zaslanial pasek z glownymi pozycjami menu.. Ale widze ze ta tendencja jest powszechna jak patrze na rozne programy.

Czesto drazni mnie to, ze okazuje sie niejednokrotnie, ze to co napisze nie dziala na starszym Win, bo wtedy jeszcze czegos tam nie bylo, albo cos dzialalo inaczej :/ A te roznice sa pomiedzy 9x/Me a NT/2000/XP (w sumie nie dziwne dlaczego taki podzial...)

0

no ale w XP trochę dłużej trwa zmiana czcionki ...
powiedz jak ci się uda zainstalować Windows 95 na czymś co ma mniej niż 8 lat, bo mi się nie udało za nic

0

Udało mi się na czymś z tego roku - Microsoft Virtual Server 2005 R2 ;)

Niestety, program się wysypuje po kilkukrotnym użyciu menu (ewentualnie przejściu z jednego do drugiego):
user image

Choć menu normalnie w miarę działa:
user image

Aczkolwiek jednak nie ma etykiet większości elementów menu:
user image

Windows 95 OSR2

[Added]
Ale chyba działanie na Windows 95 możesz sobie odpuścić, 11 lat w świecie informatyki to prawie wiek.

0

Hmm, szkoda ze u mnie taki problem nie wystapil, moglbym sprawdzic debuggerem gdzie jest problem..... byc moze to cos z allokacja pamieci na napisy w menu ? :| Tylko czemu nie wykrzaczalo sie to u mnie pod XP..?

Aczkolwiek jednak nie ma etykiet większości elementów menu

Ale nie ma juz od razu, czy dopiero po kilkakrotnym użyciu menu? Wyglada tak od razu po uruchomieniu, czy dopiero po jakims czasie sie wykrzacza? Bo widze jeszcze jakies problemy z narysowaniem zanzaczenia? :| Jakis dziwny kolor, niejednolity brush..?

Chyba podam czesc kodu na forum, moze gdzies robie jakis blad i dlatego nie dziala....... bo jezeli chodzi o sam sposob rozwiania problemu to raczej ide dobra droga (tak mi sie wydaje)

0

Nie ma od razu po załadowaniu, jak by nie mogło odczytać znaków bo pokazuje się tylko jakieś takie "t" jak widać na screenie.

Dziwny kolor spowodowany jest 16-kolorową paletą barw, bo nie mam sterowników do karty graficznej.

0

Hmm, moze sprobuje jeszcze uzyc innego kompilatora - to bylo kompilowane pod LCC.

Albo, byc moze zle allokuje pamiec na itemy. Kazdy item jest reprezentowany przez strukture: ID, caption itd......Jest tworzona tablica takich struktur (dynamicznie) i wydaje mi sie ze to tu lezy problem.

Jak bede w domu, to podam tu kod, moze ktos mi wyjasni czy cos robie zle..... bo zdecydowanie musi byc cos nie tak.

0

Ok..dorwalem wlasnie ten kod ktory pisalem, wkleje tutaj czesc - moze ktos, kto zna sie lepiej podpowie mi co przeoczylem... a wiec oto jak to dziala:

//Zmienne globalne
int ilosc;                     //ilosc itemow w popupie
MenuItem *items;       //tablica z itemami popupa
MenuParams p;          //parametry menu do wyswietlenia

W komunikacie WM_INITMENUPOPUP jest pobierane info o itemach, a nastepnie jest ustawiany styl OwnerDraw w taki sposob:

//Funkcja wyznaczająca tablicę itemów z wybranego popupa i ustawiajaca styl OwnerDraw
void handle_InitPopup(WPARAM wParam, LPARAM lParam)
{
 
 if((BOOL) HIWORD(lParam))  //Nie ruszamy menu systemowego okna
    return;
 
 HMENU sub = (HMENU) wParam;


 ilosc = GetMenuItemCount(sub);

 //Allokacja tablicy itemów
 MenuItem *menuItems = (MenuItem *)calloc(ilosc,sizeof(MenuItem));


 MENUITEMINFO mi;  //do pobrania info o menu
 mi.cbSize = sizeof(MENUITEMINFO);
 mi.fMask = MIIM_TYPE | MIIM_ID | MIIM_STATE;
 mi.dwTypeData = "";


 for(int i=0;i<ilosc;i++)
    {

	 GetMenuItemInfo(sub,i,TRUE,&mi);
     menuItems[i].ID = mi.wID;
	 GetMenuString(sub,menuItems[i].ID,&menuItems[i].Caption,256,MF_BYCOMMAND);
	 mi.fType = mi.fType | MFT_OWNERDRAW;
	 SetMenuItemInfo(sub,i,TRUE,&mi);                   //Ustawianie OwnerDraw
	 menuItems[i].isSep = mi.fType&MFT_SEPARATOR;       //Sprawdzanie czy item jest separatorem
     menuItems[i].isGrayed = mi.fState&MFS_GRAYED;
    }

 items = menuItems;


}

Jak widac, wszystko bardzo prosto, nie ma co wiecej komentowac

Dalej, rysowanie itemow, czyli obsluga WM_DRAWITEM:

void handle_DrawItem(LPARAM lParam)
{

DRAWITEMSTRUCT *dis = (LPDRAWITEMSTRUCT) lParam;


HICON pasek = LoadIcon(GetModuleHandle(NULL),MAKEINTRESOURCE(p.backIconID));


SelectObject(dis->hDC,GetMenuFont());

if(dis->CtlType==ODT_MENU)
   {

	FillRect(dis->hDC,&dis->rcItem,CreateSolidBrush(p.BACK_COLOR)); //ustawienie koloru tla menu
	DrawIconEx(dis->hDC,0,dis->rcItem.top,pasek,22,25,0,NULL,DI_NORMAL);


	//Ustawienie koloru tla tekstu
	SetBkColor(dis->hDC,p.BACK_COLOR);



	//Wyswietlenie tekstu menu
    //PodpiszMenu(dis,GetMenu(hwnd),items,ilosc);
    PodpiszMenu(dis,dis->hwndItem,items,ilosc);

	if(dis->itemAction==ODA_SELECT)
	   {

	    if(dis->itemState==zaznaczone)
		   {
			//wybieranie koloru zaznaczenia
			SelectObject(dis->hDC,CreateSolidBrush(p.SEL_COLOR));

			//wybieranie koloru ramki zaznaczenia
			SelectObject(dis->hDC,CreatePen(PS_SOLID,0,p.SEL_FRAME_COLOR));

			//wyswietlanie zaznaczenia
			Rectangle(dis->hDC,dis->rcItem.left,dis->rcItem.top,dis->rcItem.right,dis->rcItem.bottom);

			//wybranie koloru zaznaczenia
            SetBkColor(dis->hDC,p.SEL_COLOR);




		    //Wyswietlenie tekstu menu

            PodpiszMenu(dis,dis->hwndItem,items,ilosc);


			if(dis->itemState==nie_zaznaczone)
			   {FillRect(dis->hDC,&dis->rcItem,CreateSolidBrush(p.BACK_COLOR)); //powrot do koloru tla jesli menu nie jest zaznaczone


			   }




         }

	}

  }


}

No i to w zasadzie wszystko (prawie) - co moglem przeoczyc? Jezeli bedzie trzeba podac wiecej kodu, to wkleje wiecej, nie chcialem pokazywac niepotrzebnych rzeczy.

0
...
FillRect(dis->hDC,&dis->rcItem,CreateSolidBrush(p.BACK_COLOR));
...
SelectObject(dis->hDC,CreateSolidBrush(p.SEL_COLOR));
...
SelectObject(dis->hDC,CreatePen(PS_SOLID,0,p.SEL_FRAME_COLOR));
...
FillRect(dis->hDC,&dis->rcItem,CreateSolidBrush(p.BACK_COLOR));

Te peny i brushe to chyba powinieneś potraktować funkją DeleteObject.

PS. Daj jeszcze funkcje PodpiszMenu ;)

0
0x666 napisał(a)

Te peny i brushe to chyba powinieneś potraktować funkją DeleteObject.

Racja, moglem sam sie tego domyslic [wstyd] Ale o ile to moze wyjasniac czemu program sie zawieszal po pewnym czasie, to nie wyjasnia, dlaczego nie jest poprawnie wyswietlany tekst czasami.....

No ale oto funkcja PodpiszMenu:

void PodpiszMenu(DRAWITEMSTRUCT *dis,HMENU menu, MenuItem *menuItems, int Count)
{
 int id = dis->itemID;

 //Wyszukanie w tablicy itema o wymaganym id
 int numer =0;
 for(;numer<Count;numer++)
     if(menuItems[numer].ID==id)
        break;

 //narysowanie ikony itema
 DrawIconEx(dis->hDC,2,dis->rcItem.top+3,LoadIcon(GetModuleHandle(NULL),MAKEINTRESOURCE(menuItems[numer].ID)),16,16,0,NULL,DI_NORMAL);

 //wyswietlenie tekstu itema
 RECT rcc = dis->rcItem;
 rcc.left+=30;
 rcc.top+=4;

 if(menuItems[numer].isGrayed)
    SetTextColor(dis->hDC,p.INACTIVE_COLOR);
 else
    SetTextColor(dis->hDC,p.FONT_COLOR);

 DrawText(dis->hDC,menuItems[numer].Caption,strlen(menuItems[numer].Caption),&rcc,DT_LEFT|DT_EXPANDTABS);


 //narysowanie linii jesli item jest separatorem
 if(menuItems[numer].isSep)
	{MoveToEx(dis->hDC,30,dis->rcItem.top+3,NULL);
     SelectObject(dis->hDC,CreatePen(PS_SOLID,0,p.SEP_COLOR));
	 LineTo(dis->hDC,dis->rcItem.right,dis->rcItem.top+3);
	}


}

Chyba, ze chodzi tu znowu o ten pen z separatora, ale co by to moglo miec wspolnego z wyswietleniem tekstu.....?

0
void handle_DrawItem(LPARAM lParam)
{
    ...

    if(dis->itemAction==ODA_SELECT)
    {
        if(dis->itemState==zaznaczone) //<--- TU
        {
           SetBkColor(dis->hDC,p.SEL_COLOR);
           PodpiszMenu(dis,dis->hwndItem,items,ilosc);

           if(dis->itemState==nie_zaznaczone) //<--- TU
              FillRect(dis->hDC,&dis->rcItem,CreateSolidBrush(p.BACK_COLOR));

         }
       }
      }
}

dis->itemState może być kombinacją flag, więc zamiast == daj &.

Zamiast robić coś takiego:

void PodpiszMenu(DRAWITEMSTRUCT *dis,HMENU menu, MenuItem *menuItems, int Count)
{
 int id = dis->itemID;

 int numer =0;
 for(;numer<Count;numer++)
     if(menuItems[numer].ID==id)
        break;
 ...
}

możesz przypisać wskaźnik (lub index) na konkretną MenuItem w DRAWITEMSTRUCT::itemData.

SelectObject(dis->hDC,CreatePen(PS_SOLID,0,p.SEP_COLOR));

Zamiast w tajemniczej strukturze p trzymać (tylko) RGB koloru trzymaj uchwyty do brushy i penów - łatwiej będzie nimi zarządzać ;)

user image
Z tego co tu widać to chyba nie masz zrobionej obsługi komunikatu WM_MEASUREITEM.

Dobra, to na razie tyle ;)

0

Zamiast w tajemniczej strukturze p trzymać (tylko) RGB koloru trzymaj uchwyty do brushy i penów - łatwiej będzie nimi zarządzać

Hmm pomysle nad tym, ale chodzi o to, ze celowo dalem tam tylko kolory - bo ta struktura sluzy do tego, zeby uzytkownik biblioteki mogl podac kolory z poziomu programu - no chyba ze dodam tam jeszcze brushe i peny albo zdefiniuje osobna strukture na nie.

Z tego co tu widać to chyba nie masz zrobionej obsługi komunikatu WM_MEASUREITEM.

Wlasnie, ze mam - tylko tak jak bylo pisane wczesniej - jezeli zmienic czcionki w trakcie, kiedy program jest uruchomiony to nie dziala..... pzoa tym jest ok... czy u ciebie wcale nie zadzialalo??

Oto kod:

void handle_MeasureItem(LPARAM lParam,HWND hwnd)
{

SIZE wym;
char tekst[256];
MEASUREITEMSTRUCT *mis = (LPMEASUREITEMSTRUCT) lParam;


HDC hdc = GetDC(hwnd);
 if(hdc==NULL)
	MessageBox(NULL,"Błąd","",MB_OK);

 HFONT font = GetMenuFont();
 SelectObject(hdc,font);


 int id = mis->itemID;

 //Wyszukanie w tablicy itema o wymaganym id
 int numer =0;
 for(;numer<ilosc;numer++)
     if(items[numer].ID==id)
        break;




 GetTextExtentPoint32(hdc,items[numer].Caption,strlen(items[numer].Caption),&wym);
 ReleaseDC(hwnd,hdc);


 mis->itemWidth = wym.cx+40;
 mis->itemHeight = wym.cy+8;


}

Juz tutaj chyba trudno bylo popelnic jakis blad....?

0

Hmm błędów nie widzę. Oczywiście zrobiłeś to mniej więcej tak:

case WM_MEASUREITEM: 
            handle_MeasureItem(lParam,hwnd);
            return TRUE; 

[???]

czy u ciebie wcale nie zadzialalo??

U mnie działało, ale testowałem to na WinXP więc chyba nie o to chodzi...

0

No dokladnie, robie tak jak napisales. Sprawdzalem pod WinXP i bylo zawsze dobrze - a pod 9x/Me widze ze nie zawsze, o co tu chodzi? :|

Chyba inaczej sie tego nie da zrobic [???]

0

Na Win 2000 SP4 działa ok. Swoją drogą lekkie to :) zaledwie 15kb

0

Na Win 2000 SP4 działa ok. Swoją drogą lekkie to zaledwie 15kb

WinApi i kompilator LCC (do czystego C zawsze polecam - tylko edytor ma toporny ale idzie sie przyzwyczaic).

Gdyby nie ikony w zasobach, to spokojnie mozna zejsc do 7-8 kB, a po spakowaniu FSG jeszcze mniej.

0

Jeszcze jedno pytanie: dałeś InitCommonControlsEx [???]

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