Jeg kan ikke få dette til at virke...måske forkert fremgangsmåde ?
Jeg prøver at hente et icons Cpoint ind i variabel for derefter at finde ud af om den er inden for et af mine rect[x][y]. .......... fremgangsmåden er således at jeg har et stort rect (som er kaldet rectlayer) som derefter bliver indelt i rect[x][y] således.
nu har jeg behov for at finde ud af om mit icon ( m_hIconposition ) er inde for i et af områderne (rect[x][y]). og hvis det er så skal den komme med en afxmessagebox der fortæller hvilket af rect[][] den er i.
er der nogle forslag til hvorledes dette kan gøre så det virker
int idx=0; int idy =0; int nWidth = rectlayer.Width(); // Width to be divided amongst rects int nHeight = rectlayer.Height(); // Height to be divided amongst rects
if(rect[2][2].PtInRect(ptl) && rect[2][2].PtInRect(pbr)) { // iconet er inden for rect[x][y] FillRect(dc,&rect[x][y],(HBRUSH)GetStockObject(WHITE_BRUSH)); AfxMessageBox("bingo"); }
Jeg kan umiddelbart finde følgende småfejl: 1. Ifølge min lommeregner giver 404/60 6 og ikke 5*5 = 25 2. Det giver ingen mening at kalde NormalizeRect for rect[nRects][nRects], dette object findes ikke. Jeg har på fornemmelsen at du ønsker at kalde NormalizeRect for alle rect'er i rect, i så fald må du gøre det i en løkke. 3: Det samme gælder for smallrect, men her kader du NormalizeRect for smallrect[nRects][nRects], hvor du vist mente smallrect[nsmallRects][nsmallRects] (hvilket, af samme grunde som nævnt ovenfor, heller ikke er rigtigt) 4: Herefter har du følgende: m_st1.GetWindowRect(&rect[nRects][nRects]); m_st1.GetWindowRect(&smallrect[nsmallRects][nsmallRects]); Hvilket ikke går da det sidst element i hhv rect & smallrect er rect[nRects - 1][nRects - 1] & smallrect[nsmallRects - 1][nsmallRects - 1] 5: Samme fejl gør sig gældende for kaldene til ScreenToClient. 6: I loopen genbruger du rectlayer i kaldet til GetWindowRect, hvilket medfører at rectlayer i dit kald til rect[x][y].SetRect er resultatet fra m_st1.GetWindowRect(&rectlayer); & ScreenToClient(rectlayer); første gang og resultatet fra ::GetWindowRect((HWND )m_hIconposition, &rectlayer); for resten. 7: rectidx, devidensmallHeight & devidensmallWidth bruges ikke. 8: Linien: if(rect[2][2].PtInRect(ptl) && rect[2][2].PtInRect(pbr)) burde vist være: if(rect[x][y].PtInRect(ptl) && rect[x][y].PtInRect(pbr))
øj det var mange fejl tak for inputtet jeg løber det lige igennem en gang til. Med hensyn til if(rect[2][2].PtInRect(ptl) && rect[2][2].PtInRect(pbr)) Så lavede jeg den for at teste på det ene specifikke felt, men desværre fungerede det ikke, men ok nu retter jeg lige de fejl du nævner og så må vi se på det derfra.
disee fejl du her nævner, kan det være årsagen til at jeg ikke for det ønskede ud af min if(rect[x][y].PtInRect(ptl) && rect[x][y].PtInRect(pbr)) funktionen skulle være at se om iconet er inden for rect[x][y], men der er ingen reaktion synlig.
if(rect[x][y].PtInRect(ptl) && rect[x][y].PtInRect(pbr)) { // finder ud af om iconet er inden for rect[x][y]. FillRect(dc,&rect[x][y],(HBRUSH)GetStockObject(WHITE_BRUSH)); AfxMessageBox("bingo"); }
1: Du starter med at finde rect af m_st1 (hvad er det?) med GetWindowRect(), så justerer du dette rect med ScreenToClient(). Du bruger aldrig resultatet før du kalder ::GetWindowRect((HWND )m_hIconposition, &rectlayer), og dermed overskriver m_st1's rect. 2: Du udregner nRects som 404/60, hvor får du disse tal fra? 3: Dernæst udregner du bredden & højden af dit icon, (du har lige kaldt ::GetWindowRect), jeg tror at du ønsker at udregne bredden & højden af m_st1's vindue. 4: I loopen sætter du rect[x][y], hvad er grunden til at du lægger rectlayer.top/rectlayer.left til værdierne? Skulle rectlayer være icon'ets eller m_st1's rect? Jeg tror at du skulle lade være med at lægge rectlayer.xxx til. 5: Dernæst finder du TopLeft & BottonRight punkterne for det rect du lige har beregnet, og bruger disse til at checke om icon'et ligger inden for rect'et. Jeg tror det burde være icon'ets rect. DVS du checker om rect[x][y] ligger inden for rect[x][y], det gør det ikke pga. definitionen af PtInRect: "Determines whether the specified point lies within CRect. A point is within CRect if it lies on the left or top side or is within all four sides. A point on the right or bottom side is outside CRect."
Det går fremad, der er kun 5 punkter denne gang ;-)
1) m_st1 er et billede. Det er dette billede jeg loader ind i en frame vindue i et rect som jeg så kalder rectStaticClient. 2) const int nRects = billedestørrelse/minutter; dvs. reactlayer bliver delt op i yderliger 36 felter ( rect[x][y] ). jeg kunne lige så godt have skrevet const int nRects = 36; men da jeg nogle gange bruger større eller mindre billeder har jeg valgt at gøre således indtil vidrer. 3) dette er jeg ikke helt klar over hvorledes skal gøres endnu, menningen er at jeg skal finde iconts midtpunkt, da det er det jeg ønsker at finde ud af om er inden for et af rect[x][y] felterne. Jeg regner med at jeg skal regne mig frem til dette punkt. Da jeg ikke nogle steder har kunne finde information om hvorvidt der er en struct der henter denne information. Eller måske bare skal finde ud af om icont`s rect`s centrum ( r) er inden for rect[x][y]. 4) rectlayer er m_st1`s rect. iconets rect er som omtalt i 3 CRect r; omhvorvidt jeg skal lægge rectlayer.xxx til så kan jeg ikke få det til at virke korrekt uden. hvis jeg ikke lægger rectlayer til så kommer rect[x][y] det forkerte sted på skærmen. 5) AHA ! jamen så forstå jeg bedre der intet sker når jeg gør således
if(rect[x][y].PtInRect(ptl) && rect[x][y].PtInRect(pbr)) { // finder ud af om iconet er inden for rect[x][y]. FillRect(dc,&rect[x][y],(HBRUSH)GetStockObject(WHITE_BRUSH)); AfxMessageBox("bingo"); }
jamen så er jeg helt blank på icon området igen, øv. Nå men så skal der knokles virdre på det også.....jeg vender tilbage når jeg har læst noget mere på lektien.
1: m_st1 kan ikke være et billede, man kan ikke kalde GetWindowRect() for et billede, det kan man kun gøre for et vindue. Jeg kan ikke se nogen rectStaticClient i koden. Du henter rect'et for m_st1 (hvad er det?), og læser det ind i rectlayer. 2: Nej, nRects er ikke 36, det er 6 (6*6 = 36). Hvad har 60 minutter at gøre med billed størelsen? 3:Ikonets midtpunkt kan findes som: CRect IconRect; ::GetWindowRect((HWND )m_hIconposition, &IconRect); POINT IconMidtPunkt; IconMidtPunkt.x = (IconRect.left + IconRect.Right)/2; IconMidtPunkt.y = (IconRect.top + IconRect.bottom)/2;
::ScreenToClient(m_hWnd, &IconMidtPunkt); Dette punkt kan så bruges i din test (if(rect[x][y].PtInRect(IconMidtPunkt)) Hvordan er Icon'et iøvrigt konstrueret? 4: Nej når du er i loopen er CRect r ikke icon'ets rect, rectlayer er ikke m_st1's rect, det er icon'ets rect.
Det ville være en hjælp hvis du kunne oplyse icon'ets rect, m_st1's rect hvad rect[x][y] bliver i loopen (nogle få værdier) samt hvad du udregner icon'ets midtpunkt til at være.
if(m_hBmpNew != NULL ) DeleteObject(m_hBmpNew); sourcex=sourcey=0;// if(file.IsEmpty()) AfxMessageBox("Vælg billede..."); else{ if(file.Right(3)!="bmp") AfxMessageBox("Vælg et Bitmap billede..."); else { m_hBmpNew = (HBITMAP) LoadImage( AfxGetInstanceHandle(), // handle to instance file, // name or identifier of the image (root is where project is) IMAGE_BITMAP, // image types 0, // desired width 0, // desired height LR_LOADFROMFILE); if( m_hBmpNew == NULL ){ AfxMessageBox("Load of waypoints Failed");}
// put the HBITMAP info into the CBitmap (but not the bitmap itself) else{ m_st1.GetClientRect( &rectStaticClient ); rectStaticClient.NormalizeRect(); m_size.cx=rectStaticClient.Size().cx; m_size.cy=rectStaticClient.Size().cy; m_size.cx = rectStaticClient.Width(); // zero based m_size.cy = rectStaticClient.Height(); // zero based
2) jeg har godt nok ikke regnet det efter før nu, og jeg kan da godt se at 404/60 ikke er 36, men det er det antal rects Rect[][] laver i alt (som er en fejl ) og det er jo selvfølgelig fordi den runder op ( 404/60 er 6.7 ) så den laver så 6*6 felter ( derfor sagde jeg 36 da det var hvad jeg umiddelbart havde takt nig frem til og ikke tænkte nærmære over ) , men det var meningen den skulle dele HELE billedet op i disse rect[x][y] og ikke kun clint området ( m_st1 ) ( jeg har en Hscrool/Vscroll på billedet ) så det er ikke alt der er synligt. 60 minutter er hvad hvert enkelt rect[][] står for, programmet skal visualisere hændelser ( forestil dig billedet er papiret i en plotter på en måde og nålen bevæger sig op og ned i et bestemt interval, svært at forklare på skrift uden at skrive en hel stil :O) )
int rectidx; int devidensmallWidth = 30 ; // angiver antal felter på x axis int devidensmallHeight = 30 ; // angiver antal felter på y axis CString strPosition; int idx=0; int idy =0;
const int nRects = 404/60; const int nsmallRects = 60/2;
if(rect[x][y].PtInRect(IconMidtPunkt)) { // finder ud af om iconet er inden for rect[x][y]. FillRect(dc,&rect[x][y],(HBRUSH)GetStockObject(BLACK_BRUSH)); AfxMessageBox("Icon fundet"); }
Jeg er ked at at sige det, men jeg synes at jeg har været tålmodig: Jeg tror ikke det her fører nogen steder hen. Lad mig foreslå dig at: 1. Læse en grundbog i C 2. Læse et par grundbøger i C++ 3. Tage et grundkursus i C/C++ 4. Læse et par grundbøger om windows programmering 5. Tage et kursus i windows programmering. 6. Lære at bruge en debugger, dvs. lære at sætte breakpoints, single steppe, indspicere variable osv.
Så ville du måske lære at: 1: Der er forskel på at skrive: if (m_state=0) og if (m_state==0) 2: m_hIconposition er ikke et vindue, det giver ingen mening at forsøge at kalde GetWindowRect() på noget der ikke er et vindue.
helt i orden bertel.. Jeg er glad for den hjælp du har givet mig indtil nu, det har været inspirerende og givet stuff til eftertanke.
1) jeg er klar over forskellen på == og =, og det er ganske rigtigt også en fejl jeg har skrevet =. Det er nok sket iforbindelse med en replace action. Jeg har bare ikke kigget næremere på det da jeg jo havde lavet den del korrekt en gang og nok fokuseret mere på den nye udfordring med rect`s
2) m_hIconposition er ganske rigtigt ikke et vindue, men det menet jeg heller ikke jeg har sagt.
anyway, alt i alt synes jeg det går ganske godt fremad, jeg startede på c++ for cirka 4 mdr. siden i mine sparsomme aften timer.
jeg vil selvfølge følge dine råd og fortsætte med at lære, men kurser bliver det ikke til da det som sagt kun er en hobby.
tak for støtten, jeg håber ikke du er blevet gråhåret på grund af mig hehe ;)
Som tilføjelse til Bertel's så stol på din compiler, læs dens advarsler, fx. kan den advare imod både imod potentielle fejl og uhensigtsmæssigheder: brug af identifier før initialisering (unitialiserede variable). udtrykket kunne misforstås (fx. enkelt = i if). struct overført som værdi (passed by value). variable ikke brugt.
ps. God vane ved 'if' er at sætte konstant værdien forrest så du omgående får tæsk for at lave if (noget = 1) lav istedet altid if (1 = noget) så får du altid at vide at det går ikke. Og lad være med at brug tal til at beskrive tilstande istedet for "if (m_state==0)" brug "if (mNoDocument == m_state)" hvor mNoDocument så kan være en enum, const eller define hvad der du er mest passende, jeg bruger for det meste enum da den hjælper med at gøre tilstandene unikke.
>seqmose. Jeg vil naturligvis tilslutte mig din anbefaling af at studere alle warnings fra compileren (og enable så mange som muligt). Jeg synes personligt at det er svært at læse "if (7 == x)" og endnu mere varianten "if (7 > x)". Og da moderne kompilere giver dig en warning hvis du kommer til at skrive "if (x = 9)", foretrækker jeg at skrive "if (x == 9)". I koden ovenfor ville jeg have skrevet "if (!state)" og "if (state)" da state (så vidt jeg kan se) kun kan have to værdierne 0 og 1.
ville det nok være mere læseligt, specielt hvis constanten siger hvad det er vi tester på.
Synes godt om
Ny brugerNybegynder
Din løsning...
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.