verijon Temat założony przez niniejszego użytkownika |
Winapi - błąd programu do rysowania koloru RGB » 2014-02-11 23:27:36 Mam problem, uczę się winapi, zaczynam rozdział o grafice i jest program pobierający kolor piksela w formacie RGB i wyświetlający jako kolor tła okna. Postanowiłem przerobić, żeby można było samemu wpisać wartość każdego z koloru (od 0 do 255), wszystko się skompilowało, ale po naciśnięciu prawego przycisku, gdzie miały zajść obliczenia wywala błąd visual c++ "Debug Assertion Failed", może dam kod, bo długo się nad tym męczę i nie wiem gdzie popełniłem błąd. (nie wiem jak wywołać case WM_PAINT, zmienna g_rysuj miała mieć zostać użyta do tego) #define ID_TEXT1 501 #define ID_TEXT2 502 #define ID_TEXT3 503
#include <string> #include <sstream> #include <cstdlib> #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <windowsx.h>
std::string g_strKlasaOkna = "od0dogk_ColorPicker_Window"; HWND g_hwndOkno = NULL;
HDC g_hdcEkran = NULL;
int g_r, g_g, g_b; LPSTR Bufor1, Bufor2, Bufor3; bool g_rysuj = 0;
COLORREF g_clKolor = RGB( 255, 255, 255 );
LRESULT CALLBACK WindowEventProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch( uMsg ) { case WM_RBUTTONDOWN: g_r = atoi( Bufor1 ); g_g = atoi( Bufor2 ); g_b = atoi( Bufor3 ); g_clKolor = RGB( g_r, g_g, g_b ); GlobalFree( Bufor1 ); GlobalFree( Bufor2 ); GlobalFree( Bufor3 ); g_rysuj = 1; break; case WM_LBUTTONDOWN: SetCapture( hWnd ); SetCursor( LoadCursor( NULL, IDC_CROSS ) ); return 0; case WM_MOUSEMOVE: if( GetCapture() == hWnd ) { POINT ptKursor; ptKursor.x = GET_X_LPARAM( lParam ); ptKursor.y = GET_Y_LPARAM( lParam ); ClientToScreen( hWnd, & ptKursor ); g_clKolor = GetPixel( g_hdcEkran, ptKursor.x, ptKursor.y ); InvalidateRect( hWnd, NULL, TRUE ); } return 0; case WM_LBUTTONUP: ReleaseCapture(); SetCursor( LoadCursor( NULL, IDC_ARROW ) ); return 0; case WM_PAINT: { { PAINTSTRUCT ps; HDC hdcOkno; hdcOkno = BeginPaint( hWnd, & ps ); RECT rcObszarKlienta; GetClientRect( hWnd, & rcObszarKlienta ); HBRUSH hbrPedzel = CreateSolidBrush( g_clKolor ); FillRect( hdcOkno, & rcObszarKlienta, hbrPedzel ); DeleteObject( hbrPedzel ); EndPaint( hWnd, & ps ); if( g_rysuj == 1 ) g_rysuj = 0; } { std::stringstream Strumien; Strumien << "RGB: " <<( int ) GetRValue( g_clKolor ) << ", " <<( int ) GetGValue( g_clKolor ) << ", " <<( int ) GetBValue( g_clKolor ); SetWindowText( hWnd, Strumien.str().c_str() ); } return 0; } case WM_DESTROY: ReleaseDC( NULL, g_hdcEkran ); PostQuitMessage( 0 ); return 0; } return DefWindowProc( hWnd, uMsg, wParam, lParam ); }
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow ) { WNDCLASSEX KlasaOkna; ZeroMemory( & KlasaOkna, sizeof( WNDCLASSEX ) ); KlasaOkna.cbSize = sizeof( WNDCLASSEX ); KlasaOkna.hInstance = hInstance; KlasaOkna.lpfnWndProc = WindowEventProc; KlasaOkna.lpszClassName = g_strKlasaOkna.c_str(); KlasaOkna.hCursor = LoadCursor( NULL, IDC_ARROW ); KlasaOkna.hIcon = LoadIcon( NULL, IDI_APPLICATION ); RegisterClassEx( & KlasaOkna ); g_hwndOkno = CreateWindowEx( WS_EX_TOOLWINDOW, g_strKlasaOkna.c_str(), NULL, WS_OVERLAPPED | WS_BORDER | WS_CAPTION | WS_SYSMENU, 0, 0, 140, 190, NULL, NULL, hInstance, NULL ); ShowWindow( g_hwndOkno, nCmdShow ); UpdateWindow( g_hwndOkno ); HWND hText1 = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 1, 105, 130, 20, g_hwndOkno,( HMENU ) ID_TEXT1, hInstance, NULL ); SetWindowText( hText1, "red" ); DWORD dlugosc1 = GetWindowTextLength( hText1 ); LPSTR Bufor1 =( LPSTR ) GlobalAlloc( GPTR, dlugosc1 + 1 ); GetWindowText( hText1, Bufor1, dlugosc1 + 1 ); HWND hText2 = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 1, 125, 130, 20, g_hwndOkno,( HMENU ) ID_TEXT2, hInstance, NULL ); SetWindowText( hText2, "green" ); DWORD dlugosc2 = GetWindowTextLength( hText2 ); LPSTR Bufor2 =( LPSTR ) GlobalAlloc( GPTR, dlugosc2 + 1 ); GetWindowText( hText2, Bufor2, dlugosc2 + 1 ); HWND hText3 = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 1, 145, 130, 20, g_hwndOkno,( HMENU ) ID_TEXT3, hInstance, NULL ); SetWindowText( hText3, "blue" ); DWORD dlugosc3 = GetWindowTextLength( hText3 ); LPSTR Bufor3 =( LPSTR ) GlobalAlloc( GPTR, dlugosc3 + 1 ); GetWindowText( hText3, Bufor3, dlugosc3 + 1 ); g_hdcEkran = GetDC( NULL ); MSG msgKomunikat; while( GetMessage( & msgKomunikat, NULL, 0, 0 ) ) { TranslateMessage( & msgKomunikat ); DispatchMessage( & msgKomunikat ); } return static_cast < int >( msgKomunikat.wParam ); }
Na pewno dałoby się lepiej napisać, ale na razie chcę, żeby chociaż działał. Bardzo odwdzięczę się za każdą pomoc. |
|
Monika90 |
» 2014-02-12 00:05:03 Zmienne globalne Bufor1,2,3 są równe NULL, ponieważ nigdy niczego do nich nie przypisujesz. |
|
verijon Temat założony przez niniejszego użytkownika |
» 2014-02-12 10:23:18 Ok wielkie dzięki, już nie wywala błędów :) Ale nie działa rysowanie koloru, może pokażę kod: #define ID_TEXT1 501 #define ID_TEXT2 502 #define ID_TEXT3 503
#include <string> #include <sstream> #include <cstdlib> #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <windowsx.h>
std::string g_strKlasaOkna = "od0dogk_ColorPicker_Window"; HWND g_hwndOkno = NULL;
HDC g_hdcEkran = NULL;
int g_r, g_g, g_b; LPSTR Bufor1 =( LPSTR ) malloc( 1111 ); LPSTR Bufor2 =( LPSTR ) malloc( 1111 ); LPSTR Bufor3 =( LPSTR ) malloc( 1111 ); bool g_rysuj = 0;
COLORREF g_clKolor = RGB( 255, 255, 255 );
LRESULT CALLBACK WindowEventProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch( uMsg ) { case WM_RBUTTONDOWN: g_r = atoi( Bufor1 ); g_g = atoi( Bufor2 ); g_b = atoi( Bufor3 ); g_clKolor = RGB( g_r, g_g, g_b ); GlobalFree( Bufor1 ); GlobalFree( Bufor2 ); GlobalFree( Bufor3 ); g_rysuj = 1; { { PAINTSTRUCT ps; HDC hdcOkno; hdcOkno = BeginPaint( hWnd, & ps ); RECT rcObszarKlienta; GetClientRect( hWnd, & rcObszarKlienta ); HBRUSH hbrPedzel = CreateSolidBrush( g_clKolor ); FillRect( hdcOkno, & rcObszarKlienta, hbrPedzel ); DeleteObject( hbrPedzel ); EndPaint( hWnd, & ps ); if( g_rysuj == 1 ) g_rysuj = 0; } { std::stringstream Strumien; Strumien << "RGB: " <<( int ) GetRValue( g_clKolor ) << ", " <<( int ) GetGValue( g_clKolor ) << ", " <<( int ) GetBValue( g_clKolor ); SetWindowText( hWnd, Strumien.str().c_str() ); } return 0; } break; case WM_LBUTTONDOWN: SetCapture( hWnd ); SetCursor( LoadCursor( NULL, IDC_CROSS ) ); return 0; case WM_MOUSEMOVE: if( GetCapture() == hWnd ) { POINT ptKursor; ptKursor.x = GET_X_LPARAM( lParam ); ptKursor.y = GET_Y_LPARAM( lParam ); ClientToScreen( hWnd, & ptKursor ); g_clKolor = GetPixel( g_hdcEkran, ptKursor.x, ptKursor.y ); InvalidateRect( hWnd, NULL, TRUE ); } return 0; case WM_LBUTTONUP: ReleaseCapture(); SetCursor( LoadCursor( NULL, IDC_ARROW ) ); return 0; case WM_PAINT: { { PAINTSTRUCT ps; HDC hdcOkno; hdcOkno = BeginPaint( hWnd, & ps ); RECT rcObszarKlienta; GetClientRect( hWnd, & rcObszarKlienta ); HBRUSH hbrPedzel = CreateSolidBrush( g_clKolor ); FillRect( hdcOkno, & rcObszarKlienta, hbrPedzel ); DeleteObject( hbrPedzel ); EndPaint( hWnd, & ps ); if( g_rysuj == 1 ) g_rysuj = 0; } { std::stringstream Strumien; Strumien << "RGB: " <<( int ) GetRValue( g_clKolor ) << ", " <<( int ) GetGValue( g_clKolor ) << ", " <<( int ) GetBValue( g_clKolor ); SetWindowText( hWnd, Strumien.str().c_str() ); } return 0; } case WM_DESTROY: ReleaseDC( NULL, g_hdcEkran ); PostQuitMessage( 0 ); return 0; } return DefWindowProc( hWnd, uMsg, wParam, lParam ); }
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow ) { WNDCLASSEX KlasaOkna; ZeroMemory( & KlasaOkna, sizeof( WNDCLASSEX ) ); KlasaOkna.cbSize = sizeof( WNDCLASSEX ); KlasaOkna.hInstance = hInstance; KlasaOkna.lpfnWndProc = WindowEventProc; KlasaOkna.lpszClassName = g_strKlasaOkna.c_str(); KlasaOkna.hCursor = LoadCursor( NULL, IDC_ARROW ); KlasaOkna.hIcon = LoadIcon( NULL, IDI_APPLICATION ); RegisterClassEx( & KlasaOkna ); g_hwndOkno = CreateWindowEx( WS_EX_TOOLWINDOW, g_strKlasaOkna.c_str(), NULL, WS_OVERLAPPED | WS_BORDER | WS_CAPTION | WS_SYSMENU, 0, 0, 140, 190, NULL, NULL, hInstance, NULL ); ShowWindow( g_hwndOkno, nCmdShow ); UpdateWindow( g_hwndOkno ); HWND hText1 = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 1, 105, 130, 20, g_hwndOkno,( HMENU ) ID_TEXT1, hInstance, NULL ); SetWindowText( hText1, "red" ); DWORD dlugosc1 = GetWindowTextLength( hText1 ); LPSTR Bufor1 =( LPSTR ) GlobalAlloc( GPTR, dlugosc1 + 1 ); GetWindowText( hText1, Bufor1, dlugosc1 + 1 ); HWND hText2 = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 1, 125, 130, 20, g_hwndOkno,( HMENU ) ID_TEXT2, hInstance, NULL ); SetWindowText( hText2, "green" ); DWORD dlugosc2 = GetWindowTextLength( hText2 ); LPSTR Bufor2 =( LPSTR ) GlobalAlloc( GPTR, dlugosc2 + 1 ); GetWindowText( hText2, Bufor2, dlugosc2 + 1 ); HWND hText3 = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 1, 145, 130, 20, g_hwndOkno,( HMENU ) ID_TEXT3, hInstance, NULL ); SetWindowText( hText3, "blue" ); DWORD dlugosc3 = GetWindowTextLength( hText3 ); LPSTR Bufor3 =( LPSTR ) GlobalAlloc( GPTR, dlugosc3 + 1 ); GetWindowText( hText3, Bufor3, dlugosc3 + 1 ); g_hdcEkran = GetDC( NULL ); MSG msgKomunikat; while( GetMessage( & msgKomunikat, NULL, 0, 0 ) ) { TranslateMessage( & msgKomunikat ); DispatchMessage( & msgKomunikat ); } return static_cast < int >( msgKomunikat.wParam ); } Chwilowo przekopiowałem z WM_PAINT do WM_RBUTTONDOWN, ale to nie powinno mieć znaczenia. //Edit |
|
« 1 » |