06. februar 2004 - 15:25Der er
2 kommentarer og 1 løsning
Visual C++ 6
Det er nok mig der er dybt debil men....
Jeg har kodet i C# og i C++ hvor jeg brugte Borland C++ Builder 6. Nu vil jeg så prøve at bruge Visual C++ 6.0, men jeg kan ikke engang finde ud af at lave to skide editboxe hvor når man trykker på ok Vil det der står i Edit1 bliver kopieret over i Edit2.
ER det bare mig eller er Visual C++ 6.0 en tung dame at danse med i forhold til Borland?
1) Gå op i File -> New -> Fanebladet Projects og vælg ”Win32 Application” 2) Vælg ”Empty Project” 3) Gå igen op i File -> New -> Fanebladet Files og vælg Ressource Script, kald dette for Resourcescript1 4) Højreklik på den lille gule mappe midt på skærmen og vælg ”Insert” 5) Vælg her ”Dialog” og tryk på knappen ”New” 6) Tilføj en knap fra Controls panelet. 7) Dobbelt klik på den og tildel den ID’et ” IDC_KNAP1” 8) Gå nu op i File -> New –Fanebladet Files og vælg ”C++ Source File” kald denne for main.cpp 9) I denne fil skriver du nedenstående:
/* Hver gang brugeren klikker på en knap, bevæger musen - et eller andet, kaldes denne funktionen DialogProc, istedet for DialogProc kunne der fx. stå Main eller noget helt andet.
hwndDlg: Er handlet på dialogen hvori det foregår. I dette tilfælde vil det stort set altid være handlet til den samme ene dialog, som vi har lavet.
uMsg: Er et id der angiver hvad der er hændt.
wParam og lParam: Har forskellige betydninger alt efter hvilket id uMsg har. Dog er det reelt sådan at wParam er af typen WPARAM, der er lig DWORD, der er lig unsigned long int. Altså reelt er tal. lParam er af typen LPARAM, der er LPVOID eller void *, der altså er en pointer til en ting. Det hænder dog at det ikke altid er således at de bruges, men så vidt muligt er det sådan.
WM_CLOSE: Er beskeden, der sendes til en dialog, når en bruger eller program anmoder, venligt, om at lukke vinduet. Den bliver eksempelvis sendt hvis du trykker på krydset i øverste højre højrne. Ved WM_CLOSE har lParam og wParam ingen værdi andet end 0 og NULL
EndDialog(hwndDlg, 0); Fortæller Windows at dialogen skal lukkes og at den skal returnere 0
Når en bruger trykker på en knap på den ene eller anden måde, sendes signalet WM_COMMAND til DialogProc. Altså tilføjes den til switch-sætningen: case WM_COMMAND: break;
Ved WM_COMMAND beskeden, er WPARAM delt op således at bit 0-15 angiver id'et på knappen, der blev aktiveret og bit 16-31 angiver hvordan den blev aktiveret.
lParam er handlet på knappen - altså reelt en HWND
LOWORD er en macro, der automatisk tager bit 0-15 af wParam. Alternativt kunne man skrive: if (wParam & 0x0000FFFF == IDC_KNAP1)
TEXT er en macro, der sikre at din kode kan compiles både som ANSI og som UNICODE. Den vil altså automatisk lave dine tekststrenge derefter. Windows har tre forskellige typer tekst-strenge:
case WM_COMMAND: //Hvis der bliver trykket på IDC_KNAP1 if (LOWORD(wParam) == IDC_KNAP1) { int tal1, tal2; TCHAR buffer1[12], buffer2[12]; GetDlgItemText(hwndDlg, IDC_EDIT1, (LPTSTR)&buffer1, sizeof(buffer1)/sizeof(TCHAR) - 1); GetDlgItemText(hwndDlg, IDC_EDIT2, (LPTSTR)&buffer2, sizeof(buffer2)/sizeof(TCHAR) - 1); tal1 = StrToInt((LPCTSTR)&buffer1); tal2 = StrToInt((LPCTSTR)&buffer2); wsprintf((LPTSTR)&buffer1, "%i", tal1 + tal2); MessageBox(hwndDlg, (LPCTSTR)&buffer1, TEXT("Muha"), MB_ICONINFORMATION); } break; } return 0; }
/* Vi starter med en WinMain (lige efter vores DialogProc): Igen fire argumenter: hInstance er handlet til selve processen (programmet) som ofte skal bruges for at fortælle Windows hvilken process ting og sager tilhører hPrevInstance er der vist ingen, der ved hvad ideen var med. Tror at de lavede det af hensyn til fremtiden, men faktum er at de ikke bruger den og den har altid værdien NULL. lpCmdLine er kommandolinjen som programmet blev startet med
nShowCmd er et id, der angiver hvordan brugeren anmodede at programmet skulle starte - maksimeret, minimeret osv. */
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nShowCmd) {
/*Vi starter ud med at angive to lokale variabler som vi senere skal bruge (og ligeledes forklarer jeg deres formål senere):*/ HWND hWnd; MSG msg;
/* Først og fremmest vil vi selvfølgelig gerne lave vores dialog. Første argument i CreateDialog skal være handlet på processen, der vil have dialogen. Altså hInstance som blev leveret af WinMain. Næste argument skal være id'et på dialogen. Argumentet er en tekst-streng, men som jeg sagde tidligere er id'erne i resourcen ikke tekst-strenge, men tal. MAKEINTRESOURCE tager id'et og omformer det til en streng på en bestemt måde således at CreateDialog kan se at det er et resource id. Næste argument, NULL, kunne også have været handlet på et andet vindue, hvis vores dialog havde været et undervindue.
Dette gøres ganske enkelt med: */ hWnd = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC)DialogProc); /* Det næste er at vise dialogen. Det gøres med ShowWindow enten: ShowWindow(hWnd, SW_SHOWDEFAULT); eller ShowWindow(hWnd, nShowCmd); */ ShowWindow(hWnd, SW_SHOWDEFAULT);
/* Endelig kommer den vigtigste del - program loopen: msg: Er af typen MSG der er en datastruktur, der angiver bl.a. hWnd, uMsg, wParam og lParam - de argumenter som DialogProc også får.
GetMessage: Gør det at den modtager den næste besked fra systemet og placerer det i strukturen. Andet argument kunne være en restriktion på hvilket vindue den kun skal modtage signaler tid og de sidste to kunne være et max og minimum på hvilke messages id's vi vil modtage, men vi vil gerne modtage det hele.
IsDialogMessage: Gør så det at den undersøger MSG strukturen for at se om brugeren kaldte nogle af de typiske genveje. Eksempelvis at trykke på tabulatoren eller en hotkey som Alt+F (Hvis du eksempelvis angiver "&Hurra" som caption til din knap, vil Alt+H kalde funktionen)
TranslateMessage: Tager input fra keyboardet og laver det om til ASCII tegn.
DispatchMessage: Sender beskeden til DialogProc
IsDialogMessage: Kalder selv DispatchMessage internt hvis en bruger har kaldt en genvejstast osv., så det er kun hvis brugeren IKKE gjorde det, at vi gør det manuelt - derfor if-sætningen.
Når engang vinduet lukkes på den ene eller anden måde, returnerer GetMessage 0 og msg.wParam indeholder retur-koden (Den vi angiver med bl.a. EndDialog).
*/
while (GetMessage(&msg, NULL, 0, 0)) { if (!IsDialogMessage(hWnd, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return msg.wParam; }
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.