15. marts 2004 - 15:18Der er
16 kommentarer og 1 løsning
Grafik i titlebar i MDI Child vindue
Hejsa - så har jeg brug for hjælp fra de rigtig skrappe!!
Jeg har fået en lille opgave, jeg ikke selv tror på umiddelbart kan løses. Men håber da, at een her har løsningen.
Scenarie: Vi har en tabel, tabelX, med data, nøgle, farvekode, procentsats.
Når jeg åbner mit child-vindue, skal jeg ud fra nøglen herpå lave et opslag i denne tabelX (det kan jeg sagtens finde ud af :-)). Data skal så bruges til en slags "trafik-lys" - en slags progress-bar, hvor "baren" skal have den farve, som farvekoden i tabelX angiver, og den skal være så mange procent "udfyldt" som procentsatsen fra tabelX angiver. Altså - der er ingen beregninger, det skal bare vises.
Men nu kommer så problemet - det ønskes vist i titlebaren.
Jeg har bare indført et par variabler (nPercentage og color) som du skal give de rigtige værdier. Du skal dog bemærke at det nok ikke er en god ide at hente værdierne fra en database hver gang, da det vil sløve funktionen en del og den bliver kaldt mange gange!
Du skal desuden, i PreCreateWindow, fjerne titlen, så den ikke tegnes i vinduet:
Hep. Du skriver, jeg skal fjerne titlen. Men jeg skal jo gerne stadig have det med i title-baren, som der er i dag. Vinduet har faktisk en sigende caption. Jeg forestiller mig, at denne "farvelade" skal ligge ovre til højre, lige ved siden af knapperne til minimer, windowiser og luk?? Men ellers tester jeg lige dit eksempel i morgen, når jeg er tilbage på jobbet - og vender så frygteligt tilbage :-)
Angående det at hente data fra DB. Det forestiller jeg mig heller ikke, at vi gør hele tiden. Vi læser i forvejen en masse data, der skal præcenteres i vinduet, og det vil blive i denne sammenhæng, at "farvelade"-data læses også - og gemmes i member-vaiable.
// Calculate space used by icons and text CString strTitle; GetWindowText(strTitle); int nOccupiedSpace = GetSystemMetrics(SM_CXSIZE) + GetSystemMetrics(SM_CXBORDER) + GetSystemMetrics(SM_CXFRAME) + pDC->GetTextExtent(strTitle).cx + (rcWindow.Width() - rcDraw.right); if(nOccupiedSpace + nProgressWidth < rcWindow.Width()) // Only draw if space enough { // Values from DB int nPercentage = 33; COLORREF color = RGB(255, 0, 0);
Du skal så bare lade være med at fjerne FWS_ADDTOTITLE style'en. Som du kan se, har jeg tilføjet kode, så progress bar'en kun tegnes, hvis der er plads nok.
Hejsan. Så er han på jobbet - og prøver at få den anden udgave af løsningen til at fungere. Jeg har impelementeret void CChildFrame::OnNcPaint(), og i .h-filen defineret en virtual metode - altså override OnNcPaint. Men jeg må mangle et eller andet - min OnNcPaint bliver _ikke_ kaldt. ??? Er der et sted, jeg skal angive (i ressourcen) at den er userdrawn, for at det vil virke?
Ja, men bliver den message ikke postet af CMDIChildWnd? Jeg har overstyret metoden - men den blive ikke kaldt. (Har selvfølgelig sat et breakpoint, og prøvet at checke det) Det er lavet på samme måde som min CChildFrame::PreCreateWindow(CREATESTRUCT& cs), og den bliver kaldt.
Arhh - det prøves lige. Jeg læste dit "override OnNvPaint" i dit oprindelige svar som, at det var en virtuel metode, jeg skulle overstyre. Hep - vender tilbage ....
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.