Avatar billede sniperdog Nybegynder
11. december 2002 - 23:34 Der er 19 kommentarer og
2 løsninger

Menulinie der skal kunne trækkes rundt på skærmen + Anden Cursor!

hvordan jeg kan Trække et helt vindue rundt på skærmen....

Jeg har fjernet Borderen nemlig så den er "none" (eller hvad det nu lige er det hedder), og det virker også fint, men nu kan jeg jo ikke flytte vinduet derhen hvor jeg gerne vil have det, hvilket er lidt trist... :)

Det i så lige skal hjælpe mig med er hvordan jeg kan komme til at gøre det, uden at sætte den grimme Windows standart til...?? Evnt. så den kan trækkes på en: Shape eller en Label?

Vil også gerne lige vide hvordan jeg kan indsætte en anden Cursor, også her vil jeg gerne slippe af med dem i Windows, cursoren må meget gerne være animeret.

Benytter Borland Builder 5.0

Håber i kan hjælpe, er nybegynder så fjoller lidt rundt i det :)

Casper
Avatar billede jpk Nybegynder
17. december 2002 - 08:51 #1
Fremgangsmetoden du skal bruger er følgende:

1) Ved tryk på venstre museknap tjekker du om punktet ligger inden for det område, på vinduet, hvor du tillader at man kan trække det
2) Hvis ja, sætter du en variabel til true (lav fx en bool m_bMove, så du sætter "m_bMove=true;")
3) Når museknappen slippes sætter du "m_bMove=false;"

Så er alt du skal gøre, at tjekke i din mousemove handler om m_bMove er true og i så fald flytte vinduet sammen med musen (fx med MoveWindow eller SetWindowPos)
Avatar billede tam Nybegynder
17. december 2002 - 13:05 #2
Du skal håndtere det event der hedder WM_NCHITTEST. Hvis du så returnerer HTCAPTION vil du kunne trække vinduet :-)

- Anders
Avatar billede sniperdog Nybegynder
17. december 2002 - 13:30 #3
hmm... okay, fatter ærlig talt ikke lige hvad du mener Tam :) Men jpk forstår jeg da lidt mere af, jeg har kun arbejdet med programmering et par uger så jeg har stadig ikke helt fundet ud af hvordan det hele fungerer, kan du ikke uddybe det noget mere og vise hvad det er jeg skal skrive for at det kommer til at fungere?

og hvordan sætter jeg egentlig et animeret gif ind?

Giver gerne flere point hvis det kan hjælpe lidt på det ;)
Avatar billede jpk Nybegynder
17. december 2002 - 16:04 #4
Det er faktisk ikke nogen dårlig idé den tam kommer med.

Når han skriver du skal håndtere WM_NCHITTEST er det fordi det er id'et på den message der skal håndteres. På samme måde sendes der fx en message med id'et WM_LBUTTONDOWN når du trykker på venstre museknap.

Nu kan jeg ikke lige huske hvordan man gør i Builder, men du skal altså have genereret en kodestump hvor du kan agere på den message.
På samme måde som du gør når du fx vil fange et museklik, skal du vælge at fange denne event. Den metode du skal have fat i kan fx hedde OnNcHitTest (det gør den i VC++), prøv at kigge metoderne igennem og kig efter en hvis navn ligner...
Avatar billede sniperdog Nybegynder
18. december 2002 - 11:14 #5
hm... ved stadig ik helt om jeg forstår det :)

Hvis jeg nu har en shape som jeg gerne vil trække, kan jeg så ikke skrive det ind under "onMouseDown", og så... ehh... ja'e.... hvad så :)

Casper
Avatar billede jpk Nybegynder
18. december 2002 - 11:18 #6
På samme måde som du genererer onMouseDown, kan du da ikke finde noget lign: onNcHitTest?
Avatar billede sniperdog Nybegynder
18. december 2002 - 12:29 #7
nope, det kan jeg nemlig ik, kan heller ik finde det hvis jeg søger efter det i hjælp :(
Avatar billede jpk Nybegynder
18. december 2002 - 12:42 #8
Du kan selvfølgelig gøre som jeg skrev tidligere, nemlig at bruge onMouseDown, onMouseUp og onMove (eller hvad funktionerne kaldes i Builder...)
Avatar billede sniperdog Nybegynder
18. december 2002 - 12:51 #9
jeps, og kan du så lige forklare mig lidt hvordan jeg skal skrive det? :)
Avatar billede jpk Nybegynder
18. december 2002 - 13:08 #10
Okay, har du oprettet handlerne til onMouseDown, onMouseUp og onMove?
Når du har det, så prøv at skrive den kode der er blevet genereret her...
Avatar billede sniperdog Nybegynder
18. december 2002 - 13:21 #11
ehh.... ?? :) ik lige sikker på hvad du mener, jeg kan sq ikke finde ud af hvad det er jeg skal skrive nogen steder, men hvis jeg opretter de 3 events kommer det til at se sådan her ud.... :



void __fastcall TForm1::Shape1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{

}
//---------------------------------------------------------------------------

void __fastcall TForm1::Shape1MouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{

}
//---------------------------------------------------------------------------

void __fastcall TForm1::Shape1MouseUp(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{

}


Er det det du mener???
Avatar billede jpk Nybegynder
18. december 2002 - 13:33 #12
Jep, så skal du have defineret en boolsk variabel i TForm1 klassen. Builder har garanteret noget indbygget funktionalitet til det, fx noget lign "add member variable".
(Du kan naturligvis også vælge at tilføje den manuelt)

Det du skal bruge er noget lign.:
bool m_bMove;

void __fastcall TForm1::Shape1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
  if(true)
  m_bMove = true;
}


void __fastcall TForm1::Shape1MouseUp(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
  m_bMove = false;
}
Avatar billede jpk Nybegynder
18. december 2002 - 13:35 #13
I første omgang bruger vi bare "if(true)" i Shape1MouseDown...
Avatar billede jpk Nybegynder
18. december 2002 - 13:37 #14
For lige at fjerne evt. tvivl herom, skal "bool m_bMove;" være i din .h-fil og det andet i din .cpp-fil!
Avatar billede sniperdog Nybegynder
18. december 2002 - 13:41 #15
oki, det har jeg så gjort nu og hvad skal jeg så skrive for at få det hele til at flytte sig når den er true ?  nu går det fremad ;)

Casper
Avatar billede jpk Nybegynder
18. december 2002 - 13:57 #16
void __fastcall TForm1::Shape1MouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
  if(m_bMove)
  {
    // Vi skal flytte vinduet her
    // Du kan måske bruge SetWindowPos eller MoveWindow (se evt. dokumentation)
    // Det kan også være der er en funktion på din form, der kan flytte den...
  }
}
Avatar billede sniperdog Nybegynder
18. december 2002 - 14:18 #17
hm... der er den her:

MoveWindowOrg
Changes the location of the point (0,0) within a device context.

men det vel ik den, kan ik finde SetWindowPos eller MoveWindow  :(
men hvor skal den ligge under hvis det er? Er det ikke under formen? har prøvet at søge efter det men der finder den heller ik en skid... :(

Og nu skal jeg aflevere om en time :( skynd dig skynd dig ;)

casper
Avatar billede sniperdog Nybegynder
18. december 2002 - 14:19 #18
ja og så er der jo OnDragDrop.... ka det bruges til noget?
Avatar billede sniperdog Nybegynder
18. december 2002 - 14:26 #19
hmm... måske kan det her bruges til noget.. jeg kan godt få den til at starte programmet centreret på skærmen...

Position = poScreenCenter;

kan det omskrives, eller skrives ind sådan at det kommer til at ligge der hvor jeg slipper leftmouse??

måske? :)
Avatar billede jpk Nybegynder
18. december 2002 - 14:35 #20
Det er ikke MoveWindowOrg og ej heller OnDragDrop...

De metoder jeg nævnte tidligere (SetWindowPos og MoveWindow) er standard Windows funktioner og er altså tilgængelige...

Du kan muligvis bruge position, ved det ikke. Du må bare prøve...

Hvis du flytter det til Shape1MouseUp, kan du ikke trække vinduet undervejs, det flytter sig først når du slipper museknappen...
Avatar billede sniperdog Nybegynder
18. december 2002 - 14:50 #21
hm... så'e det sq nok bare mig der er lidt for newbie til det her :)

kan bare ik finde det :(
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester