Mój sposób działa sam nie wiem jakim cudem ;/ Obsługa zdarzeń na samym dole.
#include <windows.h>
#include<iostream>
#include<math.h>
#include<string>
#include <commctrl.h>
using namespace std;
LPSTR NazwaKlasy = "Klasa Okienka";
HINSTANCE * hInst;
MSG Komunikat;
SCROLLINFO si;
INT x, y, dx, dy;
char zm[ 500 ];
char zm1[ 500 ];
char zm2[ 500 ];
HWND okienka[ 1000 ];
HWND kontrolka[ 1000 ];
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );
struct typek
{
string nazwa;
double ludnosc;
double podatki;
double technologial;
double technologiam;
double technologiae;
double infrastruktura;
double famunicji;
double kzlota;
double rafinerie;
double fabryki;
double wierzowce;
double lprowincji;
} panstwo[ 100 ];
struct typeczek
{
double ludnosc;
double podatki;
double wzrost_ludnosci;
double rafinerie;
double kzlota;
double famunicji;
double fabryki;
double wierzowce;
char nazwa;
HWND prowincja;
char posiadanie;
char kontrola;
} prow[ 100 ][ 100 ];
HWND wsp[ 100 ][ 100 ];
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
WNDCLASSEX wc;
hInst =& hInstance;
wc.cbSize = sizeof( WNDCLASSEX );
wc.style = 0;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = * hInst;
wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
wc.hCursor = LoadCursor( NULL, IDC_ARROW );
wc.hbrBackground =( HBRUSH )( COLOR_WINDOW + 1 );
wc.lpszMenuName = NULL;
wc.lpszClassName = NazwaKlasy;
wc.hIconSm = LoadIcon( NULL, IDI_APPLICATION );
if( !RegisterClassEx( & wc ) )
{
MessageBox( NULL, "Wysoka Komisja odmawia rejestracji tego okna!", "Niestety...",
MB_ICONEXCLAMATION | MB_OK );
return 1;
}
HWND hwnd;
hwnd = CreateWindowEx( WS_EX_CLIENTEDGE, NazwaKlasy, "Oto okienko", WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL,
CW_USEDEFAULT, CW_USEDEFAULT, 1300, 700, NULL, NULL, * hInst, NULL );
if( hwnd == NULL )
{
MessageBox( NULL, "Okno odmówi³o przyjœcia na œwiat!", "Ale kicha...", MB_ICONEXCLAMATION );
return 1;
}
ShowWindow( hwnd, nCmdShow );
for( x = 0; x <= 10; x++ )
{
sprintf( zm, "%i", x );
wsp[ x ][ y ] = CreateWindowEx( 0, "STATIC", zm, WS_CHILD | WS_VISIBLE,
1 +( x * 100 ), 1, 30, 20, hwnd, NULL, * hInst, NULL );
}
x = 0;
for( y = 0; y <= 10; y++ )
{
sprintf( zm, "%i", y );
wsp[ x ][ y ] = CreateWindowEx( 0, "STATIC", zm, WS_CHILD | WS_VISIBLE,
- 100, 100 +( y * 100 ), 30, 20, hwnd, NULL, * hInst, NULL );
}
for( x = 0; x <= 10; x++ )
{
for( y = 0; y <= 10; y++ )
{
sprintf( zm, "%i", x );
sprintf( zm1, "%i", y );
strcat( zm, ":" );
strcat( zm, zm1 );
prow[ x ][ y ].prowincja = CreateWindowEx( 0, "BUTTON", zm, WS_CHILD | WS_VISIBLE,
1 +( x * 100 ), 100 +( y * 100 ), 90, 90, hwnd, NULL, * hInst, NULL );
}
}
UpdateWindow( hwnd );
while( GetMessage( & Komunikat, NULL, 0, 0 ) )
{
TranslateMessage( & Komunikat );
DispatchMessage( & Komunikat );
}
return Komunikat.wParam;
}
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
switch( msg )
{
case WM_CREATE:
break;
case WM_COMMAND:
for( x = 0; x <= 10; x++ )
{
for( y = 0; y <= 10; y++ )
{
if(( HWND ) lParam == prow[ x ][ y ].prowincja )
{
memset( zm2, 0, sizeof( zm2 ) );
sprintf( zm, "%i", x );
sprintf( zm1, "%i", y );
strcat( zm2, "wsp: " );
strcat( zm2, zm );
strcat( zm2, ":" );
strcat( zm2, zm1 );
SetFocus( hwnd );
okienka[ 0 ] = CreateWindowEx( WS_EX_CLIENTEDGE, NazwaKlasy, "Opcje", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 400, 200, NULL, NULL, * hInst, NULL );
CreateWindowEx( 0, "STATIC", "LALA", WS_CHILD | WS_VISIBLE,
100, 100, 30, 20, okienka[ 0 ], NULL, * hInst, NULL );
kontrolka[ 0 ] = CreateWindowEx( 0, "BUTTON", "X", WS_CHILD | WS_VISIBLE,
10, 10, 30, 20, okienka[ 0 ], NULL, * hInst, NULL );
ShowWindow( okienka[ 0 ], SW_SHOW );
}
}
}
break;
case WM_KEYDOWN:
switch(( int ) wParam )
{
case VK_RIGHT:
if( HIBYTE( GetKeyState( VK_CONTROL ) ) )
{
ScrollWindowEx( hwnd, - 100, 0,( CONST RECT * ) NULL,( CONST RECT * ) NULL,( HRGN ) NULL,( LPRECT ) NULL, SW_SCROLLCHILDREN | SW_INVALIDATE | SW_ERASE );
UpdateWindow( hwnd );
}
else
{
ScrollWindowEx( hwnd, - 10, 0,( CONST RECT * ) NULL,( CONST RECT * ) NULL,( HRGN ) NULL,( LPRECT ) NULL, SW_SCROLLCHILDREN | SW_INVALIDATE | SW_ERASE );
UpdateWindow( hwnd );
}
break;
case VK_LEFT:
if( HIBYTE( GetKeyState( VK_CONTROL ) ) )
{
ScrollWindowEx( hwnd, 100, 0,( CONST RECT * ) NULL,( CONST RECT * ) NULL,( HRGN ) NULL,( LPRECT ) NULL, SW_SCROLLCHILDREN | SW_INVALIDATE | SW_ERASE );
UpdateWindow( hwnd );
}
else
{
ScrollWindowEx( hwnd, 10, 0,( CONST RECT * ) NULL,( CONST RECT * ) NULL,( HRGN ) NULL,( LPRECT ) NULL, SW_SCROLLCHILDREN | SW_INVALIDATE | SW_ERASE );
UpdateWindow( hwnd );
}
break;
case VK_DOWN:
if( HIBYTE( GetKeyState( VK_CONTROL ) ) )
{
ScrollWindowEx( hwnd, 0, - 100,( CONST RECT * ) NULL,( CONST RECT * ) NULL,( HRGN ) NULL,( LPRECT ) NULL, SW_SCROLLCHILDREN | SW_INVALIDATE | SW_ERASE );
UpdateWindow( hwnd );
}
else
{
ScrollWindowEx( hwnd, 0, - 10,( CONST RECT * ) NULL,( CONST RECT * ) NULL,( HRGN ) NULL,( LPRECT ) NULL, SW_SCROLLCHILDREN | SW_INVALIDATE | SW_ERASE );
UpdateWindow( hwnd );
}
break;
case VK_UP:
if( HIBYTE( GetKeyState( VK_CONTROL ) ) )
{
ScrollWindowEx( hwnd, 0, 100,( CONST RECT * ) NULL,( CONST RECT * ) NULL,( HRGN ) NULL,( LPRECT ) NULL, SW_SCROLLCHILDREN | SW_INVALIDATE | SW_ERASE );
UpdateWindow( hwnd );
}
else
{
ScrollWindowEx( hwnd, 0, 10,( CONST RECT * ) NULL,( CONST RECT * ) NULL,( HRGN ) NULL,( LPRECT ) NULL, SW_SCROLLCHILDREN | SW_INVALIDATE | SW_ERASE );
UpdateWindow( hwnd );
}
break;
}
break;
case WM_CLOSE:
DestroyWindow( hwnd );
break;
case WM_DESTROY:
if(( HWND ) lParam == SetFocus( okienka[ 0 ] ) )
PostQuitMessage( 0 );
break;
default:
return DefWindowProc( hwnd, msg, wParam, lParam );
}
return 0;
}