05. februar 2006 - 23:26Der er
56 kommentarer og 1 løsning
Applikation til ombytning af museknapper
Hej Experter
Jeg står overfor at skulle bruge en lille applikation til en touchscreen, hvor jeg gerne vil have et lille flytbart vindue,som man kan trykke på, hvorefter det næste tryk bliver et højre-klik. Det andet tryk skal igen være et venstre klik.
Det burde være let at instalere en hook og lave en lille windows applikation med en knap til formålet. Kan du selv kode eller er du ude efter en færdig løsning? Har du en C++ compiler? Hvilken?
Så for sivan bertel. Jeg har programmeret meget i java, men skal lige prøve det her også. Jeg står lidt overfor at skulle beslutte mig til hvilken compiler/IDe jeg skal bruge til at skrive kode med anvendelse af win api. Jeg har valget imellem Visual studio 2005 (Kan hente det fra Uni), dev c++ eller eclipse med plugin. Angående ovenstående kode, er det noget du lige har strikket sammen eller har fundet et sted?
Det er et par "samples" fra min hjemmeside der er blevet sat sammen.
Med hensyn til IDE/compiler: Download dev-cpp (med mingw compiler) det er det letteste. Hvis du vælger VisualC++ skal du også downloade "platform sdk", som alene er 300MByte. Jeg har ikke brugt eclipse.
Hej Bertel... Nu er jeg ny på området, men kan egentlig godt følge tankegangen med apiet. Jeg får dog følgende fejl ved kompilering af min fil mouse.cpp
In function `void SendKey(bool, LONG, LONG, DWORD)': 17 `INPUT' undeclared (first use this function) (Each undeclared identifier is reported only once for each function it appears in.) 17 expected `;' before "Input" 18 `Input' undeclared (first use this function)
19 `INPUT_MOUSE' undeclared (first use this function) 28 `SendInput' undeclared (first use this function) In function `LRESULT LowLevelMouseProc(int, WPARAM, LPARAM)': 38 `LLMHF_INJECTED' undeclared (first use this function)
Det kører nu, men har et problem med at kommandoprompten vises i baggrunden. Har bestilt win api bogen, men indtil den kommer har du så et tip til at fjerne den? Ellers kan du bare smide et svar..Jeg siger tak for hjælpen
Du skal fortælle compileren at du vil lave en windows aspp og ikke en console app. I nogle versioner af dev-cpp kan du gøre det under: Options -> Compiler Options -> Linker -> "Compile for Win32 (no console)" Det er kommandolinien option -mwindows der skal sættes.
Nu er jeg igennem de første 50 sider i tutorialen fra winprog, men har et spørgsmål. Jeg ønsker at lave applikationen således at jeg laver to billeder, hvori der stå v og h, som venstre og højre. Jeg har så planer om at markere henholdsvis venstre og højre med en farve på de to forskellige billeder. Jeg vil så blot skifte billedet når man trykke, altså i stedet for at skrive idle!
Beklager min vage formulering. Prøver lige igen. Jeg ønsker at lave vinduet således at man kan se hvilken museknap der er trykket ned. Jeg havde forestillet mig at lave to forskellige billeder. Disse kan findes på http://www.control.aau.dk/~05gr551/
Når man trykker skal billeder skfifte til højre. Hvordan gøres dette i C? i java ville man jo bare venstre.visible = false;
kan du give et lille eksempel på hvordan man indsætter et billede og skifter det?
Start med at lave dine png billeder om til bmp, windows er ikke så god til .png.
Så lave du to globale variable til at holde et håndtag til dine billeder: HANDLE LeftImage, HoejreImage;
I starten af main kan du så læse dine .bmp billeder: HoejreImage = LoadImage(0, "hoejre.bmp", IMAGE_BITMAP, 150, 100, LR_LOADFROMFILE); LeftImage = LoadImage(0, "left.bmp", IMAGE_BITMAP, 150, 100, LR_LOADFROMFILE);
Når du opretter knappen skal du fortælle windows at knappen skal være med bitmap: CreateWindow("BUTTON", "Push Me", WS_CHILD | WS_VISIBLE | BS_BITMAP, 5, 5, 160, 110, hwndDlg, (HMENU)(IDC_BUTTON1), InstanceHandle, 0); Samtidig justeres størrelsen så den passer på knappen.
Så kan du skifte billede med: SendDlgItemMessage(WindowHandle, IDC_BUTTON1, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM )LeftImage);
Hvis ikke det skal virke som en knap vil jeg foreslå at du laver det om til en static, dvs opretter den på samme måde som IDC_STATIC_1, men give den SS_ICON style.
Så kan du sætte bitmap med STM_SETIMAGE
Du skal så fange WM_LBUTTONDOWN i DialogProc og sætte state og skifte billede der.
Det virker ikke helt.. HVad har jeg gjort forkert. Hvis jeg skal finde et godt sted at finde de forskellige parameter er det så msdn? Er det forresten muligt at fjerne titellinjen, altså den blå bjælke!
Der hvor du opretter "knappen" skal du bruge SS_BITMAP: CreateWindow("STATIC", "Push Me", WS_CHILD | WS_VISIBLE | SS_BITMAP, 5, 5, 160, 110, hwndDlg, (HMENU)(IDC_BUTTON1), InstanceHandle, 0);
Og så skal du ændre den linie i main hvor du sætter den første bitmap til: SendDlgItemMessage(WindowHandle, IDC_BUTTON1, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM )HoejreImage); dvs STM_SETIMAGE og ikke BM_SETIMAGE
Men det er det ikke, du skal fjerne den igen lige efter: SetWindowLong(WindowHandle, GWL_STYLE, GetWindowLong(WindowHandle, GWL_STYLE) & ~(WS_CAPTION | WS_SYSMENU));
Hej Bertel...Tak for hjælpen...Jeg har været inde og kigge på msdn og ville finde noget omkring hvordan man lavede en popup menu når man højreklikkede, men kan ikke finde det derinde. OG et andet sidste spørgsmål før jeg lukker er om det er muligt at indsætte en ny bjælke foroven med mit eget grafik, som har samme egenskab som den tidligere, altså at man kan flytte rundt på vinduet.
Med hensyn til "bjælke", du kan gøre det på to måder: 1: Sætte den til at have WS_CAPTION style og selv tegne bjælken ved WM_NCPAINT 2: Lave hele applikationen som et billede. Så skal du selv flytte. Option 1 er nok det letteste men option 2 giver nok det bedste resultat.
Hvis vi starter med at lave et par id'er til vores menu items: #define IDC_MENU_1 1202 #define IDC_MENU_2 1203
Kan vi lave en funktion til at lave popup menuen: void CreatePop(int x, int y) { HMENU PopupMenu = CreatePopupMenu(); POINT p = {x, y}; ClientToScreen(WindowHandle, &p); AppendMenu(PopupMenu, MF_STRING, IDC_MENU_1, "Menu 1"); AppendMenu(PopupMenu, MF_STRING, IDC_MENU_2, "Menu 2"); TrackPopupMenu(PopupMenu, TPM_LEFTALIGN | TPM_LEFTBUTTON, p.x, p.y, 0, WindowHandle, 0); } Og kalde den fra WM_RBUTTONDOWN: case WM_RBUTTONDOWN: CreatePop(LOWORD(lParam), HIWORD(lParam)); break; Så mangler vi blot at fange beskeden der kommer når brugeren vælger et menu item: case WM_COMMAND: switch(LOWORD(wParam)) { case IDC_MENU_1: MessageBox(WindowHandle, "Menu 1", "Whatever", MB_OK); break; case IDC_MENU_2: MessageBox(WindowHandle, "Menu 2", "Whatever", MB_OK); break; } break;
Tak bertel. Rigtig god guide til popup, men som jeg forstår WM_NCPAINT, så er det en funktion jeg kan opfange i DialogProc. Eer det rigtigt? Når jeg så modtager denne kan jeg tegne en bjælke i mit tegneprogram og indsætte denne når en kald fra WM_NCPAINT kommer? Vil gerne have et lille eksempel? og ps skal jeg fjerne SetWindowLong(WindowHandle, GWL_STYLE, GetWindowLong(WindowHandle, GWL_STYLE) & ~(WS_CAPTION | WS_SYSMENU))
Man burde kunne tegne caption ved WM_NCPAINT, men det virker ikke! Måske fordi windows VIL have alle captions til at se ens ud og derfor selv tegner den og ignorerer det man selv tegner.
Så du er nok nødt til lave applikationen uden caption og så selv flytte boxen når brugeren trækker i den.
Sad lige og legede lidt. Fik lavet en applikation med min egen version af en caption (et billede, top.bmp som forventes at være 150*50 px) Den kan flyttes ved at trække i toppen.
Mit problem ligger i at jeg skal have lavet billedet transperant. Billderne ligger som transperante billeder i ovenstående fil, altså som png billeder. Hvordan kan jeg sætte disse ind og lade applikationen være transperant?
Ohh tak... ser simplere ud, men kan ikke compile, får et mærkeligt output
Compiler: Default compiler Executing g++.exe... g++.exe "C:\Documents and Settings\Karsten\Desktop\TestTRans\mouse.cpp" -o "C:\Documents and Settings\Karsten\Desktop\TestTRans\mouse.exe" -g3 -I"I:\Programmer\Dev-Cpp\lib\gcc\mingw32\3.4.2\include" -I"I:\Programmer\Dev-Cpp\include\c++\3.4.2\backward" -I"I:\Programmer\Dev-Cpp\include\c++\3.4.2\mingw32" -I"I:\Programmer\Dev-Cpp\include\c++\3.4.2" -I"I:\Programmer\Dev-Cpp\include" -L"I:\Programmer\Dev-Cpp\lib" -g3 In file included from I:/Programmer/Dev-Cpp/include/windows.h:52, from C:\Documents and Settings\Karsten\Desktop\TestTRans\mouse.cpp:2: I:/Programmer/Dev-Cpp/include/wingdi.h:2498: error: typedef `ABORTPROC' is initialized (use __typeof__ instead) I:/Programmer/Dev-Cpp/include/wingdi.h:2498: error: `HDC' was not declared in this scope I:/Programmer/Dev-Cpp/include/wingdi.h:2498: error: expected primary-expression before "int" I:/Programmer/Dev-Cpp/include/wingdi.h:2499: error: typedef `MFENUMPROC' is initialized (use __typeof__ instead) I:/Programmer/Dev-Cpp/include/wingdi.h:2499: error: `HDC' was not declared in this scope
I:/Programmer/Dev-Cpp/include/wingdi.h:2499: error: expected primary-expression before '*' token I:/Programmer/Dev-Cpp/include/wingdi.h:2499: error: expected primary-expression before ',' token I:/Programmer/Dev-Cpp/include/wingdi.h:2499: error: expected primary-expression before '*' token I:/Programmer/Dev-Cpp/include/wingdi.h:2499: error: expected primary-expression before ',' token I:/Programmer/Dev-Cpp/include/wingdi.h:2499: error: expected primary-expression before "int" I:/Programmer/Dev-Cpp/include/wingdi.h:2499: error: expected primary-expression before ')' token I:/Programmer/Dev-Cpp/include/wingdi.h:2500: error: typedef `ENHMFENUMPROC' is initialized (use __typeof__ instead) I:/Programmer/Dev-Cpp/include/wingdi.h:2500: error: `HDC' was not declared in this scope I:/Programmer/Dev-Cpp/include/wingdi.h:2500: error: expected primary-expression before '*' token I:/Programmer/Dev-Cpp/include/wingdi.h:2500: error: expected primary-expression before ',' token I:/Programmer/Dev-Cpp/include/wingdi.h:2500: error: expected primary-expression before '*' token I:/Programmer/Dev-Cpp/include/wingdi.h:2500: error: expected primary-expression before ',' token I:/Programmer/Dev-Cpp/include/wingdi.h:2500: error: expected primary-expression before "int" I:/Programmer/Dev-Cpp/include/wingdi.h:2500: error: expected primary-expression before ')' token I:/Programmer/Dev-Cpp/include/wingdi.h:2529: error: `HDC' was not declared in this scope I:/Programmer/Dev-Cpp/include/wingdi.h:2530: error: `HDC' was not declared in this scope I:/Programmer/Dev-Cpp/include/wingdi.h:2538: error: `HDC' was not declared in this scope I:/Programmer/Dev-Cpp/include/wingdi.h:2538: error: expected primary-expression before "int" I:/Programmer/Dev-Cpp/include/wingdi.h:2538: error: expected primary-expression before "int" I:/Programmer/Dev-Cpp/include/wingdi.h:2538: error: expected primary-expression before ',' token I:/Programmer/Dev-Cpp/include/wingdi.h:2538: error: expected primary-expression before ',' token I:/Programmer/Dev-Cpp/include/wingdi.h:2538: error: expected primary-expression before ')' token I:/Programmer/Dev-Cpp/include/wingdi.h:2538: error: initializer expression list treated as compound expression I:/Programmer/Dev-Cpp/include/wingdi.h:2540: error: `HDC' was not declared in this scope I:/Programmer/Dev-Cpp/include/wingdi.h:2540: error: expected primary-expression before "int" I:/Programmer/Dev-Cpp/include/wingdi.h:2540: error: expected primary-expression before "int" I:/Programmer/Dev-Cpp/include/wingdi.h:2540: error: expected primary-expression before "int" I:/Programmer/Dev-Cpp/include/wingdi.h:2540: error: expected primary-expression before "int" I:/Programmer/Dev-Cpp/include/wingdi.h:2540: error: expected primary-expression before "int" I:/Programmer/Dev-Cpp/include/wingdi.h:2540: error: expected primary-expression before "int" I:/Programmer/Dev-Cpp/include/wingdi.h:2540: error: expected primary-expression before "int" I:/Programmer/Dev-Cpp/include/wingdi.h:2540: error: expected primary-expression before "int" I:/Programmer/Dev-Cpp/include/wingdi.h:2540: error: initializer expression list treated as compound expression I:/Programmer/Dev-Cpp/include/wingdi.h:2541: error: `HDC' was not declared in this scope I:/Programmer/Dev-Cpp/include/wingdi.h:2541: error: expected primary-expression before "int" I:/Programmer/Dev-Cpp/include/wingdi.h:2541: error: expected primary-expression before "int"
I:/Programmer/Dev-Cpp/include/wingdi.h:2541: error: expected primary-expression before "int" I:/Programmer/Dev-Cpp/include/wingdi.h:2541: error: expected primary-expression before "int" I:/Programmer/Dev-Cpp/include/wingdi.h:2541: error: expected primary-expression before "int" I:/Programmer/Dev-Cpp/include/wingdi.h:2541: error: expected primary-expression before "int" I:/Programmer/Dev-Cpp/include/wingdi.h:2541: error: expected primary-expression before "int" I:/Programmer/Dev-Cpp/include/wingdi.h:2541: error: expected primary-expression before "int" I:/Programmer/Dev-Cpp/include/wingdi.h:2541: error: initializer expression list treated as compound expression I:/Programmer/Dev-Cpp/include/wingdi.h:2542: error: `HDC' was not declared in this scope I:/Programmer/Dev-Cpp/include/wingdi.h:2543: error: `HDC' was not declared in this scope I:/Programmer/Dev-Cpp/include/wingdi.h:2543: error: expected primary-expression before "int" I:/Programmer/Dev-Cpp/include/wingdi.h:2543: error: expected primary-expression before "int" I:/Programmer/Dev-Cpp/include/wingdi.h:2543: error: expected primary-expression before "int" I:/Programmer/Dev-Cpp/include/wingdi.h:2543: error: expected primary-expression before "int"
I:/Programmer/Dev-Cpp/include/wingdi.h:2543: error: `HDC' was not declared in this scope I:/Programmer/Dev-Cpp/include/wingdi.h:2543: error: expected primary-expression before "int" I:/Programmer/Dev-Cpp/include/wingdi.h:2543: error: expected primary-expression before "int" I:/Programmer/Dev-Cpp/include/wingdi.h:2543: error: expected primary-expression before ')' token I:/Programmer/Dev-Cpp/include/wingdi.h:2543: error: initializer expression list treated as compound expression I:/Programmer/Dev-Cpp/include/wingdi.h:2544: error: `HDC' was not declared in this scope I:/Programmer/Dev-Cpp/include/wingdi.h:2545: error: `HDC' was not declared in this scope I:/Programmer/Dev-Cpp/include/wingdi.h:2545: error: expected primary-expression before ',' token I:/Programmer/Dev-Cpp/include/wingdi.h:2545: error: expected primary-expression before ',' token
I:/Programmer/Dev-Cpp/include/wingdi.h:2545: error: expected primary-expression before ')' token I:/Programmer/Dev-Cpp/include/wingdi.h:2545: error: initializer expression list treated as compound expression I:/Programmer/Dev-Cpp/include/wingdi.h:2546: error: `HDC' was not declared in this scope I:/Programmer/Dev-Cpp/include/wingdi.h:2546: error: expected primary-expression before "int" I:/Programmer/Dev-Cpp/include/wingdi.h:2546: error: expected primary-expression before "int" I:/Programmer/Dev-Cpp/include/wingdi.h:2546: error: expected primary-expression before "int" I:/Programmer/Dev-Cpp/include/wingdi.h:2546: error: expected primary-expression before "int" I:/Programmer/Dev-Cpp/include/wingdi.h:2546: error: expected primary-expression before "int" I:/Programmer/Dev-Cpp/include/wingdi.h:2546: error: expected primary-expression before "int"
I:/Programmer/Dev-Cpp/include/wingdi.h:2546: error: expected primary-expression before "int" I:/Programmer/Dev-Cpp/include/wingdi.h:2546: error: expected primary-expression before "int" I:/Programmer/Dev-Cpp/include/wingdi.h:2546: error: initializer expression list treated as compound expression I:/Programmer/Dev-Cpp/include/wingdi.h:2547: error: `HDC' was not declared in this scope I:/Programmer/Dev-Cpp/include/wingdi.h:2547: error: expected primary-expression before "const" I:/Programmer/Dev-Cpp/include/wingdi.h:2547: error: initializer expression list treated as compound expression I:/Programmer/Dev-Cpp/include/wingdi.h:2548: error: `HDC' was not declared in this scope
I:/Programmer/Dev-Cpp/include/wingdi.h:2549: error: `HDC' was not declared in this scope I:/Programmer/Dev-Cpp/include/wingdi.h:2550: error: `HDC' was not declared in this scope I:/Programmer/Dev-Cpp/include/wingdi.h:2551: error: `HDC' was not declared in this scope I:/Programmer/Dev-Cpp/include/wingdi.h:2551: error: `HDC' was not declared in this scope I:/Programmer/Dev-Cpp/include/wingdi.h:2551: error: expected primary-expression before ')' token I:/Programmer/Dev-Cpp/include/wingdi.h:2551: error: initializer expression list treated as compound expression
I:/Programmer/Dev-Cpp/include/wingdi.h:2563: error: `HDC' was not declared in this scope I:/Programmer/Dev-Cpp/include/wingdi.h:2563: error: expected primary-expression before "int" I:/Programmer/Dev-Cpp/include/wingdi.h:2563: error: expected primary-expression before "int" I:/Programmer/Dev-Cpp/include/wingdi.h:2563: error: initializer expression list treated as compound expression I:/Programmer/Dev-Cpp/include/wingdi.h:2564: error: expected constructor, destructor, or type conversion before "CreateCompatibleDC" I:/Programmer/Dev-Cpp/include/wingdi.h:2564: error: expected `,' or `;' before "CreateCompatibleDC" I:/Programmer/Dev-Cpp/include/wingdi.h:2565: error: expected constructor, destructor, or type conversion before "CreateDCA" I:/Programmer/Dev-Cpp/include/wingdi.h:2565: error: expected `,' or `;' before "CreateDCA" I:/Programmer/Dev-Cpp/include/wingdi.h:2566: error: expected constructor, destructor, or type conversion before "CreateDCW" I:/Programmer/Dev-Cpp/include/wingdi.h:2566: error: expected `,' or `;' before "CreateDCW" I:/Programmer/Dev-Cpp/include/wingdi.h:2567: error: `HDC' was not declared in this scope I:/Programmer/Dev-Cpp/include/wingdi.h:2567: error: expected primary-expression before "const" I:/Programmer/Dev-Cpp/include/wingdi.h:2567: error: expected primary-expression before ',' token I:/Programmer/Dev-Cpp/include/wingdi.h:2567: error: expected primary-expression before ',' token
Kanon..så spiller det...nu har jeg taget mit billede og lagt farven 0C 0C 0C ind hvor djeg ønsker at det skal være transperant. Du skriver i din tutorial at denne farve skal være grå, men for mig er den sort og faktum er at denne farve ikke bliver fjernet.
Selvfølgelig...Har haft problemet med den streg hele dagen. Har prøveet at resize vinduerne og billederne. Intet ved hjælper. Ved det tidligere eksempel som denne tråd startede med, gik det væk når jeg draggede med den. Det er mega træls. Hvad kan det stamme fra?
Ha...hvor er det store videnskabelige bevis? -:) Jeg tjekker det lige og så tror jeg snart det er lukke tid. Tusind tak..din hjælp har være uvurderlig. Havde godtnok ikke troet at denne verden var så forskellig som swing, men dejligt at se at tingene går stærkt iforhold til java
Nu har du både en back-bitmap som er den du bruger i DrawWindow og en left og en right bitmap som er den du skifter mellem. Men de dækker så vidt jeg kan se det samme område... Så du skal have DrawWindow til at tegne med enten left eller right bitmap efter hvad der er valgt. DrawWindow skal nok også tegne knappen (som såvidt jeg kan se altid bruge samme bitmap).
Ohh ja det er rigtigt...Den bedste måde ville vel være kun at ændre back-bitmap.ik? men kan man skifte dem løbende? og hvordan switcher jeg i drawWindow, ligesom i LRESUÆT?
Puha nu er det ved at ligne noget. Har to sidste problemer. Jeg bruger knappen til som en lukknappe, som du nok kan se udfra koden, men jeg sætter et rundt baggrundbillede ind (bare et kryds). Jeg kan godt lide knappe effekten, men kan ikke lide at baggrunden på mit billede er en knap. Vi ldet være avanceret at lave det således at knappen var rund og passede til mit runde billede?
Jeg har lidt problemer med applikatoinen. Når jeg bevæger den hurtigt rundt med musen, forsvinder den bare. Noget forslag
Med hensyn til knappen: Man kan ikke lave en bitmap der er rund og bruge den som knap. Du kan lave en firkant med samme farve som baggrunden, og lave en rund knap på den. Eller fange WM_CTLCOLORBTN og tegne knappen der.
Jeg har oplevet en enkelt gang at den forsvinder når man bevæger den rundt. Jeg vil foreslå at du checker om x og y er større end 0 og mindre en skærmens størrelse inden du flytter den. Du kan bruge GetSystemMetrics til at finde ud af hvor stor skærmen er.
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.