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
#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;
LRESULT CALLBACK WindowProcedure( HWND, UINT, WPARAM, LPARAM );
char szClassName[] = "WindowsApp";
int WINAPI WinMain( HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil )
{ HWND hwnd; MSG messages; WNDCLASSEX wincl; wincl.hInstance = hThisInstance; wincl.lpszClassName = szClassName; wincl.lpfnWndProc = WindowProcedure; wincl.style = CS_DBLCLKS; wincl.cbSize = sizeof( WNDCLASSEX ); wincl.hIcon = LoadIcon( NULL, IDI_APPLICATION ); wincl.hIconSm = LoadIcon( NULL, IDI_APPLICATION ); wincl.hCursor = LoadCursor( NULL, IDC_ARROW ); wincl.lpszMenuName = NULL; wincl.cbClsExtra = 0; wincl.cbWndExtra = 0; wincl.hbrBackground =( HBRUSH ) COLOR_BACKGROUND; if( !RegisterClassEx( & wincl ) ) return 0; hwnd = CreateWindowEx( 0, szClassName, "Windows App", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 544, 375, HWND_DESKTOP, NULL, hThisInstance, NULL ); 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 ) ); ShowWindow( hwnd, nFunsterStil ); while( GetMessage( & messages, NULL, 0, 0 ) ) { TranslateMessage( & messages ); DispatchMessage( & messages ); } return messages.wParam; }
LRESULT CALLBACK WindowProcedure( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { switch( message ) { 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: if( wParam == 10 ) { 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 ); break; default: return DefWindowProc( hwnd, message, wParam, lParam ); } return 0; }
Plik klasy_funkcje.hpp
#include <windows.h> #include <commctrl.h> #ifndef klasy_funkcje_hpp #define klasy_funkcje_hpp extern HWND hStatic1_2;
class element { public: element(); ~element(); int liczba; element * nastepny; };
class list : public element { public: list(); ~list(); 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 ); void porzadkuj( list * nazwa_listy1, list * nazwa_listy2, list * nazwa_listy3 ); void wypelnij();
#endif
plik klasy_funkcje.cpp
#include "klasy_funkcje.hpp" #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? |