Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Pisanie po oknie c++

Ostatnio zmodyfikowano 2020-03-29 16:17
Autor Wiadomość
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 ?

C/C++
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 );
        }
    }
}
P-176567
pekfos
» 2020-03-28 18:41:56
C/C++
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.
P-176568
sewek14
Temat założony przez niniejszego użytkownika
» 2020-03-28 22:02:14
Dodałem coś takiego i nadal nie działa

C/C++
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 );
P-176571
pekfos
» 2020-03-28 22:07:52
Wciąż podajesz niezainicjalizowane wartości.
P-176572
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

C/C++
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ż

C/C++
DrawText( memHDC, "Text Out String", - 1, & rc, DT_TOP | DT_LEFT );
oraz
C/C++
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 ?
P-176573
pekfos
» 2020-03-29 11:55:47
Spróbuj ustawić czcionkę i flagę DT_NOCLIP. Podaj też co zwraca DrawText().
P-176574
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

C/C++
int error = DrawText( memHDC, TEXT( "Text Out String" ), - 1, & rc, DT_NOCLIP );

cout << error << endl;
P-176575
pekfos
» 2020-03-29 14:32:31
Trzeba ustawić kolor tekstu
C/C++
SetTextColor( memHDC, 0x00000000 );
Cały kod (na bazie przykładu z » Kurs WinAPI, C++ » PodstawyPodstawy WinAPI lekcja):
C/C++
#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 )
{
   
    // WYPEŁNIANIE STRUKTURY
    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 );
   
    // REJESTROWANIE KLASY OKNA
    if( !RegisterClassEx( & wc ) )
    {
        MessageBox( NULL, "Wysoka Komisja odmawia rejestracji tego okna!", "Niestety...",
        MB_ICONEXCLAMATION | MB_OK );
        return 1;
    }
   
    // TWORZENIE OKNA
    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 ); // Pokaż okienko...
    UpdateWindow( hwnd );
   
    // Pętla komunikatów
    while( GetMessage( & Komunikat, NULL, 0, 0 ) )
    {
        TranslateMessage( & Komunikat );
        DispatchMessage( & Komunikat );
    }
    return Komunikat.wParam;
}

// OBSŁUGA ZDARZEŃ
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;
}
P-176576
« 1 » 2
  Strona 1 z 2 Następna strona