sewek14 Temat założony przez niniejszego użytkownika |
Pisanie po oknie c++ » 2020-03-28 17:01:52 Witam. Napisałem program który wyświetla tekst na niewidzialnym oknie, lecz coś nie chce działać. Malowanie kwadratów działa, lecz pisanie już nie. Jaka może być przyczyna ? RECT WBounds; MSG Msg;
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) { switch( msg ) { case WM_PAINT: { PAINTSTRUCT ps; HDC hDC, memHDC; HBITMAP memBitmap; hDC = BeginPaint( hwnd, & ps ); memHDC = CreateCompatibleDC( hDC ); memBitmap = CreateCompatibleBitmap( hDC, win_width, win_height ); SelectObject( memHDC, memBitmap ); FillRect( memHDC, & WBounds, WHITE_BRUSH ); RECT rc; SetTextColor( memHDC, RGB( 255, 255, 255 ) ); DrawText( memHDC, TEXT( "Helllo" ), - 1, & rc, DT_TOP | DT_LEFT ); BitBlt( hDC, 0, 0, win_width, win_height, memHDC, 0, 0, SRCCOPY ); DeleteObject( memBitmap ); DeleteDC( memHDC ); DeleteDC( hDC ); EndPaint( hwnd, & ps ); ValidateRect( hwnd, & WBounds ); } case WM_ERASEBKGND: return 1; case WM_CLOSE: DestroyWindow( hwnd ); break; case WM_DESTROY: PostQuitMessage( 0 ); break; default: return DefWindowProc( hwnd, msg, wParam, lParam ); } return 0; }
int main() { this_thread::sleep_for( chrono::milliseconds( 5000 ) ); HWND WinHWND = FindWindowA( 0, "Google Chrome" ); GetClientRect( WinHWND, & WBounds ); win_width = WBounds.right - WBounds.left; win_height = WBounds.bottom + WBounds.left; WNDCLASSEX WClass; WClass.cbSize = sizeof( WNDCLASSEX ); WClass.style = NULL; WClass.lpfnWndProc = WndProc; WClass.cbClsExtra = NULL; WClass.cbWndExtra = NULL; WClass.hInstance = reinterpret_cast < HINSTANCE >( GetWindowLongA( WinHWND, GWL_HINSTANCE ) ); WClass.hIcon = NULL; WClass.hCursor = NULL; WClass.hbrBackground = WHITE_BRUSH; WClass.lpszMenuName = "Avast"; WClass.lpszClassName = "Avast"; WClass.hIconSm = NULL; RegisterClassExA( & WClass ); HINSTANCE Hinstance = NULL; Win2HWND = CreateWindowExA( WS_EX_TRANSPARENT | WS_EX_TOPMOST | WS_EX_LAYERED, "Avast", "Avast", WS_POPUP, WBounds.left, WBounds.top, WBounds.right - WBounds.left, WBounds.bottom + WBounds.left, NULL, NULL, Hinstance, NULL ); SetLayeredWindowAttributes( Win2HWND, RGB( 255, 255, 255 ), 255, LWA_COLORKEY ); while( 1 ) { this_thread::sleep_for( chrono::milliseconds( 100 ) ); InvalidateRect( Win2HWND, & WBounds, true ); if(( GetMessageA( & Msg, NULL, NULL, NULL ) > 0 ) ) { TranslateMessage( & Msg ); DispatchMessageA( & Msg ); } } }
|
|
pekfos |
» 2020-03-28 18:41:56 RECT rc; SetTextColor( memHDC, RGB( 255, 255, 255 ) ); DrawText( memHDC, TEXT( "Helllo" ), - 1, & rc, DT_TOP | DT_LEFT ); | rc określa pozycję gdzie tekst ma być narysowany, a tu jest niezainicjalizowane. |
|
sewek14 Temat założony przez niniejszego użytkownika |
» 2020-03-28 22:02:14 Dodałem coś takiego i nadal nie działa RECT rc; rc.left = 20; rc.top = 30; SetTextColor( memHDC, RGB( 255, 255, 255 ) ); DrawText( memHDC, TEXT( "Text Out String" ), - 1, & rc, DT_TOP | DT_LEFT );
|
|
pekfos |
» 2020-03-28 22:07:52 Wciąż podajesz niezainicjalizowane wartości. |
|
sewek14 Temat założony przez niniejszego użytkownika |
» 2020-03-29 00:10:51 Ehhh podałem tylko te, gdyż myślałem, że wystarczą tylko kordy jednego punktu. Zainicjowałem resztę wartości, lecz również nie działa RECT rc; rc.left = 20; rc.top = 30; rc.right = 70; rc.bottom = 70; SetTextColor( memHDC, RGB( 255, 255, 255 ) ); DrawText( memHDC, TEXT( "Text Out String" ), - 1, & rc, DT_TOP | DT_LEFT );
użyłem też DrawText( memHDC, "Text Out String", - 1, & rc, DT_TOP | DT_LEFT );
oraz DrawText( hDC, "Text Out String", - 1, & rc, DT_TOP | DT_LEFT );
i również nie działa. Nie wiem w którym kierunku szukać błędu. Może źle inicjuję Recta ? |
|
pekfos |
» 2020-03-29 11:55:47 Spróbuj ustawić czcionkę i flagę DT_NOCLIP. Podaj też co zwraca DrawText(). |
|
sewek14 Temat założony przez niniejszego użytkownika |
» 2020-03-29 13:13:13 Zrobiłem według twoich zaleceń i również nie działa. DrawText zwraca wartość 16 int error = DrawText( memHDC, TEXT( "Text Out String" ), - 1, & rc, DT_NOCLIP );
cout << error << endl;
|
|
pekfos |
» 2020-03-29 14:32:31 Trzeba ustawić kolor tekstu SetTextColor( memHDC, 0x00000000 );
Cały kod (na bazie przykładu z Podstawy WinAPI): #include <windows.h>
LPSTR NazwaKlasy = "Klasa Okienka"; MSG Komunikat;
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { 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, "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, CW_USEDEFAULT, CW_USEDEFAULT, 480, 320, NULL, NULL, hInstance, NULL ); if( hwnd == NULL ) { MessageBox( NULL, "Okno odmówiło przyjścia na świat!", "Ale kicha...", MB_ICONEXCLAMATION ); return 1; } ShowWindow( hwnd, nCmdShow ); 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_CLOSE: DestroyWindow( hwnd ); break; case WM_DESTROY: PostQuitMessage( 0 ); break; case WM_PAINT: { int win_width, win_height; RECT WBounds; GetClientRect( hwnd, & WBounds ); win_width = WBounds.right - WBounds.left; win_height = WBounds.bottom + WBounds.left; PAINTSTRUCT ps; HDC hDC, memHDC; HBITMAP memBitmap; hDC = BeginPaint( hwnd, & ps ); memHDC = CreateCompatibleDC( hDC ); memBitmap = CreateCompatibleBitmap( hDC, win_width, win_height ); SelectObject( memHDC, memBitmap ); FillRect( memHDC, & WBounds, WHITE_BRUSH ); RECT rc; rc.left = 20; rc.top = 30; rc.right = 70; rc.bottom = 70; SetTextColor( memHDC, RGB( 255, 255, 255 ) ); SetTextColor( memHDC, 0x00000000 ); DrawText( memHDC, TEXT( "Helllo" ), - 1, & rc, DT_TOP | DT_LEFT | DT_NOCLIP ); BitBlt( hDC, 0, 0, win_width, win_height, memHDC, 0, 0, SRCCOPY ); DeleteObject( memBitmap ); DeleteDC( memHDC ); DeleteDC( hDC ); EndPaint( hwnd, & ps ); ValidateRect( hwnd, & WBounds ); return 0; } default: return DefWindowProc( hwnd, msg, wParam, lParam ); } return 0; } |
|
« 1 » 2 |