Avatar billede dcgeek Nybegynder
31. juli 2002 - 14:48 Der er 2 kommentarer og
1 løsning

Simple Win

I Dev-C++ er der et eksempel på et vindue, som er blevet oprettet.
Men hvad nu hvis man gerne vil bygge videre på denne kode, og indsætte Buttons, give dem funktionskald osv. så bliver koden hurtigt uoverskuelig. Findes der ikke en metode at gøre det sådan, at jeg har al Window-implementations i en fil, og så kan jeg derefter oprette en ny selvstændig *.c fil, og indsætte kode til et oprette en Button, og give den nogle funktioner?
Jeg vil gerne se noget kode til at kunne gøre det!

Kildekoden til at oprette et Window er:

/* Creation of a simple Windows API program */

#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;
}

Kildekoden ligger i OpretWindow.cpp.
Jeg laver så min egen test.cpp, og skriver koden:

FuktionTilAtOpretteEn_Button1()
{
blablabla;
}

EnProcedureForEt_Button1Click()
//Altså når brugeren klikker på en nyoprettet Button1!
{
blabla();
}
Avatar billede kamikaze Nybegynder
02. august 2002 - 10:17 #1
Dette er blot standard windows kode. Hvis applikationen også skal kunne noget, bliver der MEGET mere kode og den bliver MEGET mere uoverskuelig. Jeg tror at det du leder efter er nogle klasser der wrapper windows-koden (altså pakker den ind og gemmer den væk)?!?

Hvis det er det du leder efter skulle du kigge på MFC - Microsoft Foundation Classes.
Avatar billede dcgeek Nybegynder
02. august 2002 - 12:45 #2
Jeg kan ikke bruge MFC,da GNU-compileren, som følger med Dev-C++ ikke understøtter MFC.
Avatar billede ultik Nybegynder
02. august 2002 - 17:20 #3
// main.cpp - et simpelt windows-program, der benytter sig af win32 API
#include "windows.h"

HWND mWnd;
HINSTANCE hInst;

#define CMD_SHOW    1002
#define CMD_SHOWDLG    1003
#define EDT_SHOW    2344
#define LST_SHOW    3400

void ShowError(void)
{
    LPVOID lpMsgBuf;
    FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER |
        FORMAT_MESSAGE_FROM_SYSTEM |
        FORMAT_MESSAGE_IGNORE_INSERTS,
        NULL,
        GetLastError(),
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
        (LPTSTR) &lpMsgBuf,
        0,
        NULL
    );
    // Display the string.
    MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION );
    // Free the buffer.
    LocalFree( lpMsgBuf );
}

int MessageLoop()
{
  MSG msg;

  while (GetMessage(&msg, NULL, 0, 0) == TRUE) {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
  }

  return msg.wParam;
}

HWND eWnd, bWnd, lWnd;

LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg , WPARAM wParam , LPARAM lParam )
{
    //
    switch(msg)
    {
    case WM_COMMAND:
        switch((int)wParam)
        {
            case CMD_SHOW:
                // der er trykket på min knap
                char input[255];
                GetDlgItemText(hWnd,EDT_SHOW,input, 255);
                //MessageBox(0,input,"Test",0);
                SendDlgItemMessage(hWnd, LST_SHOW, LB_ADDSTRING, NULL, (LPARAM)input);
                break;
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    }
    return DefWindowProc(hWnd, msg, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hCurrent, HINSTANCE hPrevious, LPSTR cmdline, int showstyle)
{
    WNDCLASS myWindow;
    // sæt klassen op
    hInst = hCurrent;
    myWindow.style = CS_HREDRAW | CS_VREDRAW;
    myWindow.lpfnWndProc = MainWndProc;
    myWindow.cbClsExtra =0;
    myWindow.cbWndExtra = 0;
    myWindow.hInstance = hCurrent;
    myWindow.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    myWindow.hCursor = LoadCursor(NULL, IDC_ARROW);
    myWindow.hbrBackground = (HBRUSH) COLOR_WINDOW;
    myWindow.lpszMenuName = NULL;
    myWindow.lpszClassName = "QCCMyWindow";
    // registrer den
    if (RegisterClass(&myWindow) == 0)
    {
        // Der er sket en fejl....
        ShowError();
        return 1;
    }
    // Lav vinduet....
    mWnd = CreateWindow("QCCMyWindow",
                        "Hello Windows World",
                        WS_DLGFRAME | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
                        CW_USEDEFAULT, CW_USEDEFAULT, (15*8)+60,(15*8)+100,
                        NULL, NULL, hCurrent, NULL);

    if (!mWnd)
    {
        // Der er sket en fejl....
        ShowError();
        return 1;
    }


    eWnd = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT","TEST",WS_CHILD | WS_VISIBLE,2,200,75,20,mWnd,(HMENU) EDT_SHOW,hInst,NULL);
    CreateWindowEx(WS_EX_WINDOWEDGE, "BUTTON","Show Dialog",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,0,0,100,20,mWnd,(HMENU) CMD_SHOWDLG,hInst,NULL);
    lWnd = CreateWindowEx(WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE, "LISTBOX","Hmm",WS_CHILD | LBS_NOTIFY | 0 | WS_VISIBLE, 0,0,200,200,mWnd, (HMENU) LST_SHOW, hInst, NULL);

    ShowWindow(mWnd, SW_SHOW);
    UpdateWindow(mWnd);
    // Kør message-loopet..
    return MessageLoop();
}

Dette program skulle køre ( jeg har ikke testet siden jeg smed sourcen sammen, men kan ikke lige finde problemer med den... ) Det du skal lege med er CreateWindow-funktionen... basalt set så sætter du hvad den skal sende som en parameter til overvinduets WindowProcedure... så tjekker du parametrene i den... hvis der er klikket på en knap sendes den som en WM_COMMAND, med den anden parameter værende den custom-værdi du selv har sat... Tjek denne URL for en reference:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/createwindow.asp

basalt sagt, er det bare "classname" parameteren der angiver hvilken komponent den skal lave..
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