Avatar billede medions Nybegynder
16. april 2003 - 12:49 Der er 14 kommentarer og
1 løsning

Tilføjning af textbox + tekst!

Jeg er helt ny inden for dette...

Jeg har flg. kode:

#include <windows.h>

/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

/*  Make the class name into a global variable  */
char szClassName[ ] = "WindowsApp";

int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)

{
    HWND hwnd;              /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */

    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);

    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default color as the background of the window */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;

    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx (
          0,                  /* Extended possibilites for variation */
          szClassName,        /* Classname */
          "Windows App",      /* Title Text */
          WS_OVERLAPPEDWINDOW, /* default window */
          CW_USEDEFAULT,      /* Windows decides the position */
          CW_USEDEFAULT,      /* where the window ends up on the screen */
          544,                /* The programs width */
          375,                /* and height in pixels */
          HWND_DESKTOP,        /* The window is a child-window to desktop */
          NULL,                /* No menu */
          hThisInstance,      /* Program Instance handler */
          NULL                /* No Window Creation data */
          );

    /* Make the window visible on the screen */
    ShowWindow (hwnd, nFunsterStil);

    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 0, 0))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }

    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}


/*  This function is called by the Windows function DispatchMessage()  */

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)                  /* handle the messages */
    {
        case WM_DESTROY:
            PostQuitMessage (0);      /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}



Nu vil jeg så gerne vide hvordan jeg tilføjer noget tekst og en tekstbox -evt. en Messagebox ved klik på en knap, så jeg lige har noget at gå ud fra.

//>Rune
Avatar billede soreno Praktikant
16. april 2003 - 13:00 #1
Har du læst denne tutorial:
http://www.winprog.org/tutorial/

?
Avatar billede medions Nybegynder
16. april 2003 - 13:05 #2
Hej Søren
Nej, det har jeg dog ikke, men vi gøre det!

Men det ville være til stor hjælp hvis lige du gad og tilføje en Button, og når man så klikker på den kommer der en messagebox med Hello World... Det ville hjælpe mig meget på vej!

(kender godt til C++, men kun til Konsol!)

//>Rune
Avatar billede soreno Praktikant
16. april 2003 - 13:09 #3
Hmm, det er lidt mere kompliceret end som så.
Jeg har et dialog eksempel..

------------main.cpp
#include <windows.h>
#include "resource.h"

BOOL CALLBACK MainDlgProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam);

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
  DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(ID_DIALOG_MAIN), NULL, MainDlgProc);
  return 0;
}

BOOL CALLBACK MainDlgProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
  switch(Message)
  {
      case WM_INITDIALOG:
        break;

      case WM_COMMAND:
        switch(LOWORD(wParam))
        {
            case ID_DIALOG_BUTTON_LUK:
              MessageBox(hwnd, "Bøøøh!", "Info:", MB_OK);
              break;
        }
        break;
   
      case WM_CLOSE:
        EndDialog(hwnd, 0);
        break;

      case WM_DESTROY:
        PostQuitMessage(0);
        break;
     
      default:
        return FALSE;
  }
  return TRUE;
}

------------resource.h
#define ID_DIALOG_MAIN 100
#define ID_DIALOG_BUTTON_LUK 101

------------resource.rc
#include <windows.h>

100 DIALOGEX 0, 0, 103, 126
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Main"
FONT 8, "Helv"
BEGIN
    PUSHBUTTON      "Ok", 101, 28, 106, 40, 14
END

-------------
Kompilering foregår sådan:
windres --include-dir --use-temp-file -I rc -O coff -i "resource.rc" -o "resource.o"
g++ -c Main.cpp -s -mwindows
g++ -o Main.exe "main.o" "resource.o" $(LIBTRAY) -s -mwindows
Avatar billede soreno Praktikant
16. april 2003 - 13:13 #4
Der var en copy/paste fejl..

Kompilering foregår sådan:
windres --include-dir --use-temp-file -I rc -O coff -i "resource.rc" -o "resource.o"
g++ -c Main.cpp -s -mwindows
g++ -o Main.exe "main.o" "resource.o" -s -mwindows


Hvis du henter lcc:
http://www.cs.virginia.edu/~lcc-win32/

Så følger der en resourceeditor med som du kan bruge til at lave din egen "resource.rc" fil. Editoren hedder wedit.
Avatar billede medions Nybegynder
16. april 2003 - 13:13 #5
Hmm jeg bruger Dev-C++! -den kompilere det vel selv?
-Hm hvis nu kun jeg skal ha' en "label" indeholdende noget tekst på min kode, ville det være advanceret?

//>Rune
Avatar billede soreno Praktikant
16. april 2003 - 13:14 #6
Jeg ved ikke hvordan man kompilerer med resourcefiler i dev-cpp.
Avatar billede medions Nybegynder
16. april 2003 - 13:21 #7
Jeg har fundet du af hvordan kan får en MessageBox frem ved at klikke på selveste formen... Tror du så ikke du kan finde frem til at placere en knap på formen? -forgår det ikke på nogle lunde sammme måde?

#include <windows.h>

/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

/*  Make the class name into a global variable  */
char szClassName[ ] = "WindowsApp";

int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)

{
    HWND hwnd;              /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */

    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);

    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default color as the background of the window */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;

    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx (
          0,                  /* Extended possibilites for variation */
          szClassName,        /* Classname */
          "Windows App",      /* Title Text */
          WS_OVERLAPPEDWINDOW, /* default window */
          CW_USEDEFAULT,      /* Windows decides the position */
          CW_USEDEFAULT,      /* where the window ends up on the screen */
          544,                /* The programs width */
          375,                /* and height in pixels */
          HWND_DESKTOP,        /* The window is a child-window to desktop */
          NULL,                /* No menu */
          hThisInstance,      /* Program Instance handler */
          NULL                /* No Window Creation data */
          );

    /* Make the window visible on the screen */
    ShowWindow (hwnd, nFunsterStil);

    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 0, 0))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }
    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}


/*  This function is called by the Windows function DispatchMessage()  */

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)                  /* handle the messages */
    {
        case WM_DESTROY:
            PostQuitMessage (0);      /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
   
      //Ved klik på formen, kommer der en MessageBox.
      case WM_LBUTTONDOWN:
              MessageBox(hwnd, "Du klikkede på formen!", "Info:", MB_OK);
              break;
       
    }
    return 0;
}

//>Rune
Avatar billede soreno Praktikant
16. april 2003 - 13:28 #8
Jeg skal til at ud af døren..

Hvis det haster så kig her:
http://www.winprog.org/tutorial/app_one.html
Avatar billede medions Nybegynder
16. april 2003 - 15:06 #9
Hmm jeg har nu dette (copy / pasted fra eks. her på E)

#include <windows.h>
#define IDC_MAIN_EDIT    101
#define ID_FILER_EXIT 9001
#define ID_FUNKTIONER_HentData 9002
#define ID_FUNKTIONER_Indstillinger 9003


/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

/*  Make the class name into a global variable  */
char szClassName[ ] = "WindowsApp";

int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)

{
    HWND hwnd;              /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */

    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);

    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default color as the background of the window */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;

    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx (
          0,                  /* Extended possibilites for variation */
          szClassName,        /* Classname */
          "NET Danmark",      /* Title Text */
          WS_OVERLAPPEDWINDOW, /* default window */
          CW_USEDEFAULT,      /* Windows decides the position */
          CW_USEDEFAULT,      /* where the window ends up on the screen */
          544,                /* The programs width */
          375,                /* and height in pixels */
          HWND_DESKTOP,        /* The window is a child-window to desktop */
          NULL,                /* No menu */
          hThisInstance,      /* Program Instance handler */
          NULL                /* No Window Creation data */
          );

    /* Make the window visible on the screen */
    ShowWindow (hwnd, nFunsterStil);

    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 0, 0))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }
    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}


/*  This function is called by the Windows function DispatchMessage()  */
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)                  /* handle the messages */
    {
    case WM_CLOSE:
        //MessageBox(hwnd, "Farvel!", "Boxnavn", MB_OK | MB_ICONERROR);
        PostQuitMessage (0);      /* send a WM_QUIT to the message queue */
    break;
    default:                      /* for messages that we don't deal with */
        return DefWindowProc (hwnd, message, wParam, lParam);
       
    case WM_LBUTTONDOWN:
        MessageBox(hwnd, "Du klikkede på formen!", "Info:", MB_OK);
        break;

    case WM_CREATE:
    {
// Menu Start_____________________________________________________

        HMENU hMenu, hSubMenu;
        HICON hIcon, hIconSm;

        hMenu = CreateMenu();

        //**Filer
        hSubMenu = CreatePopupMenu();
        AppendMenu(hSubMenu, MF_STRING, ID_FILER_EXIT, "L&uk");
        AppendMenu(hMenu, MF_STRING | MF_POPUP, (UINT)hSubMenu, "&Filer");

        //**Funktioner
        hSubMenu = CreatePopupMenu();
        AppendMenu(hSubMenu, MF_STRING, ID_FUNKTIONER_HentData, "&Hent data");
        AppendMenu(hSubMenu, MF_STRING, ID_FUNKTIONER_Indstillinger, "&Indstillinger");
        AppendMenu(hMenu, MF_STRING | MF_POPUP, (UINT)hSubMenu, "F&unktioner");

        SetMenu(hwnd, hMenu);

//____***

HWND hwndButton = CreateWindow(
    "BUTTON",  // predefined class
    "OK",      // button text
    WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,  // styles

    // Size and position values are given explicitly, because
    // the CW_USEDEFAULT constant gives zero values for buttons.
    10,        // starting x position
    10,        // starting y position
    100,        // button width
    20,        // button height
    hwnd,      // parent window
    NULL,      // No menu
    (HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE),
    NULL);      // pointer not needed
//____***
    }
    break;



    case WM_COMMAND:
        switch(LOWORD(wParam))
        {
            case ID_FILER_EXIT:
              PostQuitMessage(0); //Luk programmet
            break;
            case ID_FUNKTIONER_HentData:
              MessageBox(hwnd, "Henter data", "Hent data", MB_OK);
            break;
        }
    break;

// Menu Slut________________________________________________________       
    }
    return 0;
}

-hvordan fanger jeg nu at der er blevet klikket på knappen?

//>Rune
Avatar billede soreno Praktikant
16. april 2003 - 15:17 #10
sådan:
#include <windows.h>
#define IDC_MAIN_EDIT    101
#define ID_FILER_EXIT 9001
#define ID_FUNKTIONER_HentData 9002
#define ID_FUNKTIONER_Indstillinger 9003
#define ID_DAMN_KNAP 102

/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

/*  Make the class name into a global variable  */
char szClassName[ ] = "WindowsApp";

int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)

{
    HWND hwnd;              /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */

    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);

    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default color as the background of the window */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;

    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx (
          0,                  /* Extended possibilites for variation */
          szClassName,        /* Classname */
          "NET Danmark",      /* Title Text */
          WS_OVERLAPPEDWINDOW, /* default window */
          CW_USEDEFAULT,      /* Windows decides the position */
          CW_USEDEFAULT,      /* where the window ends up on the screen */
          544,                /* The programs width */
          375,                /* and height in pixels */
          HWND_DESKTOP,        /* The window is a child-window to desktop */
          NULL,                /* No menu */
          hThisInstance,      /* Program Instance handler */
          NULL                /* No Window Creation data */
          );

    /* Make the window visible on the screen */
    ShowWindow (hwnd, nFunsterStil);

    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 0, 0))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }
    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}


/*  This function is called by the Windows function DispatchMessage()  */
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)                  /* handle the messages */
    {
    case WM_CLOSE:
        //MessageBox(hwnd, "Farvel!", "Boxnavn", MB_OK | MB_ICONERROR);
        PostQuitMessage (0);      /* send a WM_QUIT to the message queue */
    break;
    default:                      /* for messages that we don't deal with */
        return DefWindowProc (hwnd, message, wParam, lParam);
     
    case WM_LBUTTONDOWN:
        MessageBox(hwnd, "Du klikkede på formen!", "Info:", MB_OK);
        break;

    case WM_CREATE:
    {
// Menu Start_____________________________________________________

        HMENU hMenu, hSubMenu;
        HICON hIcon, hIconSm;

        hMenu = CreateMenu();

        //**Filer
        hSubMenu = CreatePopupMenu();
        AppendMenu(hSubMenu, MF_STRING, ID_FILER_EXIT, "L&uk");
        AppendMenu(hMenu, MF_STRING | MF_POPUP, (UINT)hSubMenu, "&Filer");

        //**Funktioner
        hSubMenu = CreatePopupMenu();
        AppendMenu(hSubMenu, MF_STRING, ID_FUNKTIONER_HentData, "&Hent data");
        AppendMenu(hSubMenu, MF_STRING, ID_FUNKTIONER_Indstillinger, "&Indstillinger");
        AppendMenu(hMenu, MF_STRING | MF_POPUP, (UINT)hSubMenu, "F&unktioner");

        SetMenu(hwnd, hMenu);

//____***

HWND hwndButton = CreateWindow(
    "BUTTON",  // predefined class
    "OK",      // button text
    WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,  // styles

    // Size and position values are given explicitly, because
    // the CW_USEDEFAULT constant gives zero values for buttons.
    10,        // starting x position
    10,        // starting y position
    100,        // button width
    20,        // button height
    hwnd,      // parent window
    (HMENU)ID_DAMN_KNAP,      // No menu
    (HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE),
    NULL);      // pointer not needed
//____***
    }
    break;



    case WM_COMMAND:
        switch(LOWORD(wParam))
        {
            case ID_FILER_EXIT:
              PostQuitMessage(0); //Luk programmet
            break;
            case ID_FUNKTIONER_HentData:
              MessageBox(hwnd, "Henter data", "Hent data", MB_OK);
            break;
            case ID_DAMN_KNAP:
                MessageBox(NULL, "Damn knap", "Hejsa fra", MB_OK);
        }
    break;

// Menu Slut________________________________________________________     
    }
    return 0;
}
Avatar billede medions Nybegynder
16. april 2003 - 15:25 #11
Kanont Søren!!

Hvad er det flg. linje gør?
(HMENU)ID_DAMN_KNAP,      // No menu

-før stod der jo bare NULL!

//>Rune
Avatar billede soreno Praktikant
16. april 2003 - 15:30 #12
Definerer en unik id til vinduet (en knap er pr. definition et vindue):

hMenu
Identifies a menu, or specifies a child-window identifier depending on the window style. For an overlapped or pop-up window, hMenu identifies the menu to be used with the window; it can be NULL if the class menu is to be used. For a child window, hMenu specifies the child-window identifier, an integer value used by a dialog box control to notify its parent about events. The application determines the child-window identifier; it must be unique for all child windows with the same parent window.

Jeg satte også denne kode ind:
#define ID_DAMN_KNAP 102

Hvilket er i samme stil som indholdet af "resource.h" fra 13:09:25.
Avatar billede medions Nybegynder
16. april 2003 - 15:32 #13
Kanont! -du skal ha' mange tak!!
Hvor kan jeg se en dokumentation for C++?

//>Rune
Avatar billede soreno Praktikant
16. april 2003 - 15:33 #14
Du kan hente en "help" til win32 apiet her:
http://www.borland.com/devsupport/borlandcpp/patches/BC52HLP1.ZIP

Den er muligvis lidt gammel, så nyere information skal du søge i hos msdn.microsoft.com (men det kan være en pain in the a** at finde det man skal bruge).
Avatar billede medions Nybegynder
16. april 2003 - 15:36 #15
Tak endnu engang ;o)

//>Rune
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