Witam serdecznie.
Edit.Poprawione
Próbuję od podstaw utworzyć własną kontrolkę sugerując się znalezionym u was artykułem "Własne Kontrolki 2" znalezionym w dziale Kursy.
Mój problem polega na tym że aby po wprowadzeniu jakiejś zmiany w WM_PAINT kontrolki ujrzeć efekty muszę zmienić klasę okna jaką nadaje mojej kontrolce.
Nie do końca rozumiem czemu się tak dzieje. Ciągła zmiana nazwy to nie rozwiązanie proszę o sugestie.
main.cpp
#include <windows.h>
#include "AngleControl.h"
LRESULT CALLBACK WndProc( HWND , UINT , WPARAM , LPARAM );
HINSTANCE HINST;
LPSTR NazwaKontrolki = "Test2";
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
LPSTR NazwaKlasy = "Test";
HINST = hInstance;
WNDCLASSEX wc;
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 = NazwaKlasy;
wc.hIconSm = LoadIcon( NULL, IDI_APPLICATION );
if( !RegisterClassEx( & wc ) )
{
MessageBox( NULL, "Błąd rejestracji okna głównego.", "Error", MB_ICONEXCLAMATION | MB_OK );
return 1;
}
HWND hwnd;
hwnd = CreateWindowEx( WS_EX_CLIENTEDGE, NazwaKlasy, "Testowe", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 500, 500, NULL, NULL, hInstance, NULL );
if( hwnd == NULL )
{
MessageBox( NULL, "Nie utworzono okna.", "Error", MB_ICONEXCLAMATION );
return 1;
}
ShowWindow( hwnd, nCmdShow );
UpdateWindow( hwnd );
MSG Komunikat;
while( GetMessage( & Komunikat, NULL, 0, 0 ) )
{
TranslateMessage( & Komunikat );
DispatchMessage( & Komunikat );
}
return Komunikat.wParam;
return 0;
}
LRESULT CALLBACK WndProc( HWND g_hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
switch( msg )
{
case WM_CREATE:
if( !RejestrujPrzycisk( HINST ) )
{
MessageBox( g_hwnd, "Nie udało się zarejestrować klasy przycisku.", "Yh...", MB_ICONSTOP );
DestroyWindow( g_hwnd );
}
HWND hControl;
hControl = CreateWindowEx( 0, NazwaKontrolki, NULL,WS_CHILD | WS_VISIBLE, 0, 0, 50, 50, g_hwnd, NULL, HINST, NULL );
if (hControl == NULL)
DestroyWindow( g_hwnd );
break;
case WM_CLOSE:
DestroyWindow( g_hwnd );
break;
case WM_DESTROY:
PostQuitMessage( 0 );
break;
default:
return DefWindowProc( g_hwnd, msg, wParam, lParam );
}
return 0;
}
AngleControl.h
int max=50;
BOOL RejestrujPrzycisk( HINSTANCE );
LRESULT CALLBACK ControlProc( HWND , UINT , WPARAM , LPARAM );
BOOL RejestrujPrzycisk( HINSTANCE hInst )
{
WNDCLASS wc;
wc.style = 0; // stylowy kibel? ;-)
wc.lpszMenuName = NULL;
wc.lpszClassName = NazwaKontrolki;
wc.hInstance = hInst;
wc.lpfnWndProc = ControlProc;
wc.cbWndExtra = 0;
wc.cbClsExtra = 0;
wc.hIcon = NULL;
wc.hCursor = NULL;
wc.hbrBackground =( HBRUSH ) GetStockObject( NULL_BRUSH );
if( !RegisterClass( & wc ) ) return FALSE;
return TRUE;
}
LRESULT CALLBACK ControlProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
switch( msg )
{
case WM_CREATE:
SetWindowPos( hwnd, NULL, 0, 0, max, max, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER );
HRGN hRgn;
hRgn = CreateEllipticRgn( 0, 0, max - 1, max - 1 );
SetWindowRgn( hwnd, hRgn, FALSE );
break;
case WM_PAINT:
PAINTSTRUCT ps;
HDC hdcOkno;
hdcOkno = GetDC(hwnd);
HBRUSH PedzelZiel, Pudelko;
HPEN OlowekCzerw, Piornik;
PedzelZiel = CreateSolidBrush( 0x00FFFF );
OlowekCzerw = CreatePen( PS_DOT, 1, 0x0000FF );
Pudelko =( HBRUSH ) SelectObject( hdcOkno, PedzelZiel );
Piornik =( HPEN ) SelectObject( hdcOkno, OlowekCzerw );
Ellipse( hdcOkno, 0, 0, 50, 50 );
SelectObject( hdcOkno, Pudelko );
SelectObject( hdcOkno, Piornik );
DeleteObject( OlowekCzerw );
DeleteObject( PedzelZiel );
EndPaint( hwnd, & ps );
ReleaseDC( hwnd, hdcOkno );
break;
case WM_CLOSE:
DestroyWindow( hwnd );
break;
case WM_DESTROY:
PostQuitMessage( 0 );
break;
default:
return DefWindowProc( hwnd, msg, wParam, lParam );
}
return 0;
}