Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[c++][winapi] Pomocy

Ostatnio zmodyfikowano 2011-04-22 13:12
Autor Wiadomość
waldiw
Temat założony przez niniejszego użytkownika
[c++][winapi] Pomocy
» 2011-04-22 12:29:58
Mam projekt składający się z plików:
plik Main.cpp

C/C++
#include <windows.h>
#include "klasy_funkcje.hpp"

using namespace std;

HWND hButton1, hButton2, hStatic1, hStatic1_2, hStatic2, hStatic2_2, hStatic3, hStatic3_2, hCheckbox1, hCheckbox2, hEdit1, hEdit2;
HBRUSH g_hBrush;

/*  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 */
    );
    //*************kontrolki**************************************************
   
    hStatic1 = CreateWindowEx( 0, "STATIC", NULL, WS_CHILD | WS_VISIBLE | SS_LEFT, 10, 10, 60, 18, hwnd, NULL, hThisInstance, NULL );
    SetWindowText( hStatic1, "Lista1:" );
    hStatic1_2 = CreateWindowEx( 0, "STATIC", NULL, WS_CHILD | WS_VISIBLE | SS_LEFT | WS_BORDER, 60, 10, 250, 18, hwnd, NULL, hThisInstance, NULL );
    hStatic2 = CreateWindowEx( 0, "STATIC", NULL, WS_CHILD | WS_VISIBLE | SS_LEFT, 10, 40, 60, 18, hwnd, NULL, hThisInstance, NULL );
    SetWindowText( hStatic2, "Lista2:" );
    hStatic2_2 = CreateWindowEx( 0, "STATIC", NULL, WS_CHILD | WS_VISIBLE | SS_LEFT | WS_BORDER, 60, 40, 250, 18, hwnd, NULL, hThisInstance, NULL );
    hStatic3 = CreateWindowEx( 0, "STATIC", NULL, WS_CHILD | WS_VISIBLE | SS_LEFT, 10, 70, 60, 18, hwnd, NULL, hThisInstance, NULL );
    SetWindowText( hStatic3, "Lista3:" );
    hStatic3_2 = CreateWindowEx( 0, "STATIC", NULL, WS_CHILD | WS_VISIBLE | SS_LEFT | WS_BORDER, 60, 70, 250, 18, hwnd, NULL, hThisInstance, NULL );
    hEdit1 = CreateWindowEx( WS_EX_CLIENTEDGE, WC_EDIT, " ", WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_NUMBER, 320, 10, 70, 18, hwnd, NULL, hThisInstance, 0 );
    hEdit2 = CreateWindowEx( WS_EX_CLIENTEDGE, WC_EDIT, " ", WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_NUMBER, 320, 40, 70, 18, hwnd, NULL, hThisInstance, 0 );
   
    hCheckbox1 = CreateWindowEx( 0, WC_BUTTON, "TXT", WS_CHILD | WS_VISIBLE | BS_CHECKBOX, 10, 180, 50, 18, hwnd,( HMENU ) 1, hThisInstance, 0 );
    CheckDlgButton( hwnd, 1, BST_CHECKED );
    hCheckbox2 = CreateWindowEx( 0, WC_BUTTON, "CSV", WS_CHILD | WS_VISIBLE | BS_CHECKBOX, 10, 160, 50, 18, hwnd,( HMENU ) 2, hThisInstance, 0 );
   
    hButton1 = CreateWindowEx( 0, "BUTTON", "Dodaj", WS_CHILD | WS_VISIBLE, 400, 7, 60, 22, hwnd,( HMENU ) 10, hThisInstance, NULL );
    hButton2 = CreateWindowEx( 0, "BUTTON", "Dodaj", WS_CHILD | WS_VISIBLE, 400, 38, 60, 22, hwnd,( HMENU ) 11, hThisInstance, NULL );
   
   
    g_hBrush = CreateSolidBrush( RGB( 212, 208, 200 ) );
   
   
    //************************************************************************
   
    /* 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_CREATE:
        {
           
        }
        break;
       
    case WM_CTLCOLORSTATIC:
        {
            HWND hCtl =( HWND ) lParam;
            HDC hDC =( HDC ) wParam;
            if( hCtl == hStatic1 )
            {
                SetBkMode( hDC, TRANSPARENT );
                SetTextColor( hDC, RGB( 0, 0, 0 ) );
                return( LRESULT ) g_hBrush;
            }
            if( hCtl == hStatic2 )
            {
                SetBkMode( hDC, TRANSPARENT );
                SetTextColor( hDC, RGB( 0, 0, 0 ) );
                return( LRESULT ) g_hBrush;
            }
            if( hCtl == hStatic3 )
            {
                SetBkMode( hDC, TRANSPARENT );
                SetTextColor( hDC, RGB( 0, 0, 0 ) );
                return( LRESULT ) g_hBrush;
            }
            if( hCtl == hCheckbox1 )
            {
                SetBkMode( hDC, TRANSPARENT );
                SetTextColor( hDC, RGB( 0, 0, 0 ) );
                return( LRESULT ) g_hBrush;
            }
            if( hCtl == hCheckbox2 )
            {
                SetBkMode( hDC, TRANSPARENT );
                SetTextColor( hDC, RGB( 0, 0, 0 ) );
                return( LRESULT ) g_hBrush;
            }
           
        }
        break;
       
    case WM_COMMAND:
       
        //obsługa przycisku
        if( wParam == 10 )
        {
            //SetWindowText( hStatic1, "Napis" );
            //MessageBox( NULL, "Nacisnąłeś przycisk!", "Info", MB_ICONINFORMATION );
            wypelnij();
        }
        if( wParam == 1 )
        {
            if( IsDlgButtonChecked( hwnd, 1 ) == BST_UNCHECKED )
            {
                CheckDlgButton( hwnd, 1, BST_CHECKED );
                CheckDlgButton( hwnd, 2, BST_UNCHECKED );
            }
        }
        if( wParam == 2 )
        {
            if( IsDlgButtonChecked( hwnd, 2 ) == BST_UNCHECKED )
            {
                CheckDlgButton( hwnd, 2, BST_CHECKED );
                CheckDlgButton( hwnd, 1, BST_UNCHECKED );
            }
        }
       
        break;
       
    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;
}
Plik klasy_funkcje.hpp
C/C++
#include <windows.h>
#include <commctrl.h>
#ifndef klasy_funkcje_hpp
#define klasy_funkcje_hpp
extern HWND hStatic1_2;

class element // deklaracja klasy element
{
public:
    element(); // konstruktor
    ~element(); // destruktor
    int liczba; // deklaracja zmiennej liczba     
    element * nastepny; // *nastepny - wskaznik na kolejny element listy
};


class list
    : public element
{
public:
    list(); // konstruktor
    ~list(); // destruktor
    int rozmiar();
    int el_liczba( int nr_el );
    void czysc();
    void dodaj_element( int x );
    void pokaz();
    void sortowanie();
   
private:
    element * poczatek, * koniec;
    int licznik;
};

void polacz( list * nazwa_listy1, list * nazwa_listy2, list * nazwa_listy3 ); // deklaracja funkcji polacz
void porzadkuj( list * nazwa_listy1, list * nazwa_listy2, list * nazwa_listy3 ); // deklaracja funkcji porzadkuj
void wypelnij(); // deklaracja funkcji wpisujacej elementy z klawiatury


#endif


plik klasy_funkcje.cpp

C/C++
#include "klasy_funkcje.hpp" //dolaczenie wlasnej biblioteki funkcje
#include <windows.h>
#include <commctrl.h>

using namespace std;

void wypelnij()
{
    SetWindowText( hStatic1_2, "Napis" );
    MessageBox( NULL, "Nacisnąłeś przycisk!", "Info", MB_ICONINFORMATION );
}

Chcę zadeklarować nową listę funkcją:

   list *Lista1;
   Lista1 = new list;  

i otrzymuję z kompilatora komunikat o błędzie:

  [Linker error] undefined reference to `list::list()'

Kod wstawiałem w WM_CREATE: i w bloku tworzącym kontrolki. W aplikacji konsolowej kod wstawiałem zaraz za instukcją: int main() i wszystko działa. Jak i gdzie to się robi w aplikacji okienkowej?
P-31604
ison
» 2011-04-22 12:35:21
a gdzie definicja konstruktora 'list'?
C/C++
list();
to jest jedynie deklaracja,
zmień na
C/C++
list() { }
lub dopisz definicję w pliku cpp jeśli konstruktor ma robić coś więcej
P-31605
waldiw
Temat założony przez niniejszego użytkownika
» 2011-04-22 13:12:11
Dzięki za wytknięcie błędów:). Całkiem o tym zapomniałem i już myślałem, że przy winapi trzeba jakiejś magicznej sztuczki. Wszystko działą. Narazie ;)
P-31615
« 1 »
  Strona 1 z 1