Avatar billede exp-ralle Nybegynder
15. september 2002 - 13:21 Der er 12 kommentarer og
1 løsning

Knap i ren kode

Hejsa...

Hvordan laver jeg en knap til et C++ program?

Jeg sidder i Dev-C++ og kan derfor ikke bare indsætte den som i Delphi.
Avatar billede exp-ralle Nybegynder
15. september 2002 - 13:56 #2
Det vil ikke virke...
Her er koden jeg kopierer ind i min .cpp fil:

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
    100,        // button height
    hwnd,      // parent window
    NULL,      // No menu
    (HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE),
    NULL);      // pointer not needed

Her er compiler loggen:

Executing  g++.exe...
g++.exe "C:\Documents and Settings\MigSelv\Skrivebord\knap.cpp" -o "C:\Documents and Settings\MigSelv\Skrivebord\knap.exe"  -s  -I"C:\Programmer\Dev-CPP\include"  -I"C:\Programmer\Dev-CPP\include\g++-3"  -I"C:\Programmer\Dev-CPP\include"  -L"C:\Programmer\Dev-CPP\lib"
C:\Documents and Settings\MigSelv\Skrivebord\knap.cpp:1: ANSI C++ forbids declaration `hwndButton' with no type
C:\Documents and Settings\MigSelv\Skrivebord\knap.cpp:4: `WS_VISIBLE' was not declared in this scope
C:\Documents and Settings\MigSelv\Skrivebord\knap.cpp:4: `WS_CHILD' was not declared in this scope
C:\Documents and Settings\MigSelv\Skrivebord\knap.cpp:4: `BS_DEFPUSHBUTTON' was not declared in this scope
C:\Documents and Settings\MigSelv\Skrivebord\knap.cpp:12: `hwnd' was not declared in this scope
C:\Documents and Settings\MigSelv\Skrivebord\knap.cpp:13: `NULL' was not declared in this scope
C:\Documents and Settings\MigSelv\Skrivebord\knap.cpp:14: `HINSTANCE' was not declared in this scope
C:\Documents and Settings\MigSelv\Skrivebord\knap.cpp:14: parse error before `('

Execution terminated
Avatar billede soreno Praktikant
15. september 2002 - 14:20 #3
du har lavet en variabel uden at fortælle hvilken type det skal være, prøv:
HWND hwndButton = CreateWindow(...

generelt så kig altid på den øverste fejl som compileren hoster op med.
Avatar billede soreno Praktikant
15. september 2002 - 14:21 #4
desuden skal du huske at inkludere windows.h, altså

#include <windows.h> //bør vist nok stå øverst i din inklude liste
Avatar billede exp-ralle Nybegynder
15. september 2002 - 14:30 #5
Får nu følgene fejl:

14 C:\Documents and Settings\MigSelv\Skrivebord\knap.cpp
`hwnd' was not declared in this scope

og

16 C:\Documents and Settings\MigSelv\Skrivebord\knap.cpp
`hwnd' was not declared in this scope

PS. Er lige startet på C++ idag så jeg er ret newbie...
Avatar billede exp-ralle Nybegynder
15. september 2002 - 14:31 #6
BTW. Min kode er nu:

#include <windows.h>

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
    100,        // button height
    hwnd,      // parent window
    NULL,      // No menu
    (HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE),
    NULL);      // pointer not needed
Avatar billede soreno Praktikant
15. september 2002 - 14:36 #7
er der ikke mere kode ???
Avatar billede exp-ralle Nybegynder
15. september 2002 - 14:45 #8
Nop, det er bare en test, jeg skal nemlig lave en knap.
Hvis du kender en nemmere måde så sige endelig til...
Avatar billede soreno Praktikant
15. september 2002 - 14:48 #9
nemmere er det ikke... :-)
men mere korrekt:
#include <windows.h>

const char g_szClassName[] = "myWindowClass";
HWND hwndButton;

// Step 4: the Window Procedure
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
  switch(msg)
  {
      case WM_CREATE:
        hwndButton = CreateWindow("BUTTON", "OK", WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, 10, 10, 100, 100, hwnd, NULL, NULL, NULL);
        break;
       
      case WM_CLOSE:
        DestroyWindow(hwnd);
        break;
       
      case WM_DESTROY:
        PostQuitMessage(0);
        break;
       
      default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
  }
  return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                  LPSTR lpCmdLine, int nCmdShow)
{
  WNDCLASSEX wc;
  HWND hwnd;
  MSG Msg;
 
  //Step 1: Registering the Window Class
  wc.cbSize        = sizeof(WNDCLASSEX);
  wc.style        = 0;
  wc.lpfnWndProc  = WndProc;
  wc.cbClsExtra    = 0;
  wc.cbWndExtra    = 0;
  wc.hInstance    = hInstance;
  wc.hIcon        = LoadIcon(NULL, IDI_APPLICATION);
  wc.hCursor      = LoadCursor(NULL, IDC_ARROW);
  wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
  wc.lpszMenuName  = NULL;
  wc.lpszClassName = g_szClassName;
  wc.hIconSm      = LoadIcon(NULL, IDI_APPLICATION);
 
  if(!RegisterClassEx(&wc))
  {
      MessageBox(NULL, "Window Registration Failed!", "Error!",
                MB_ICONEXCLAMATION | MB_OK);
      return 0;
  }
 
  // Step 2: Creating the Window
  hwnd = CreateWindowEx(
      WS_EX_CLIENTEDGE,
      g_szClassName,
      "The title of my window",
      WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 300, 300,
      NULL, NULL, hInstance, NULL);
 
  if(hwnd == NULL)
    {
      MessageBox(NULL, "Window Creation Failed!", "Error!",
                  MB_ICONEXCLAMATION | MB_OK);
      return 0;
    }
 
  ShowWindow(hwnd, nCmdShow);
  UpdateWindow(hwnd);
 
  // Step 3: The Message Loop
  while(GetMessage(&Msg, NULL, 0, 0) > 0)
  {
      TranslateMessage(&Msg);
      DispatchMessage(&Msg);
  }
  return Msg.wParam;
}

koden er et lettere modificeret eksempel fra:
http://www.winprog.org/tutorial/
Avatar billede exp-ralle Nybegynder
15. september 2002 - 14:50 #10
Okay, tak tak... men kandet slet ikke laves nemmere?
Det er ret meget kode for én knap synes jeg...
Avatar billede exp-ralle Nybegynder
15. september 2002 - 14:53 #11
kan det even
Avatar billede soreno Praktikant
15. september 2002 - 14:55 #12
det er vist det simpleste man kan lave:

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
  MessageBox(NULL, "Bøøøøøhhh!", "Besked fra program:", MB_OK);
  return 0;
}
Avatar billede exp-ralle Nybegynder
15. september 2002 - 15:02 #13
Ok
Du for pointene, tak for hjælpen
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