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

[WinAPI] Dziwne zachowanie się backspace

Ostatnio zmodyfikowano 2016-02-19 15:49
Autor Wiadomość
oigi333
Temat założony przez niniejszego użytkownika
[WinAPI] Dziwne zachowanie się backspace
» 2016-02-18 22:40:04
Podczas kasowania danych z edit'a litery zostają dalej wyświetlane:
http://imgur.com/zdbzjG3
C/C++
#include <windows.h>
#include <cstring>
#include "notatnik.h"

using namespace std;
HBRUSH g_hBrush = CreateSolidBrush( 0x444444 );
LPSTR NazwaKlasy = "Klasa Okienka";
MSG Komunikat;
HWND hwnd;
HWND hText;
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );
HINSTANCE lol;
int width;
int height;
LPSTR Version = "0.5.1";
HMENU hMenu;
HFONT g_hfnNowy = NULL;

void WczytajPlik( char * x, HWND text )
{
    LPSTR Bufor;
    DWORD dwRozmiar, dwPrzeczyt;
    HANDLE hPlik;
   
    hPlik = CreateFile(( LPCSTR ) x, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL );
    if( hPlik == INVALID_HANDLE_VALUE )
    {
        MessageBox( NULL, "Nie można otworzyć pliku.", "A to pech!", MB_ICONEXCLAMATION );
        PostQuitMessage( 0 ); // Zakończ program
    }
   
    dwRozmiar = GetFileSize( hPlik, NULL );
    if( dwRozmiar == 0xFFFFFFFF )
    {
        MessageBox( NULL, "Nieprawidłowy rozmiar pliku!", "Niedobrze...", MB_ICONEXCLAMATION );
        PostQuitMessage( 0 ); // Zakończ program
    }
   
    Bufor =( LPSTR ) GlobalAlloc( GPTR, dwRozmiar + 1 );
    if( Bufor == NULL )
    {
        MessageBox( NULL, "Za mało pamięci!", "Ale wiocha...", MB_ICONEXCLAMATION );
        PostQuitMessage( 0 ); // Zakończ program
    }
   
    if( !ReadFile( hPlik, Bufor, dwRozmiar, & dwPrzeczyt, NULL ) )
    {
        MessageBox( NULL, "Błąd czytania z pliku", "Dupa blada!", MB_ICONEXCLAMATION );
        PostQuitMessage( 0 ); // Zakończ program
    }
   
    Bufor[ dwRozmiar ] = 0; // dodaj zero na końcu stringa
    SetWindowText( text, Bufor ); // zrób coś z tekstem, np. wyświetl go
   
    GlobalFree( Bufor ); // Zwolnij bufor
    CloseHandle( hPlik ); // Zamknij plik
}
void ZapiszPlik( char * x, HWND text )
{
    LPSTR Bufor;
    DWORD dwRozmiar, dwZapisane;
    HANDLE hPlik;
   
    hPlik = CreateFile(( LPCSTR ) x, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL );
    if( hPlik == INVALID_HANDLE_VALUE )
    {
        MessageBox( NULL, "Nie można otworzyć pliku.", "A to pech!", MB_ICONEXCLAMATION );
        PostQuitMessage( 0 ); // Zakończ program
    }
   
    dwRozmiar = GetWindowTextLength( text );
    if( dwRozmiar == 0 )
    {
        MessageBox( NULL, "Nieprawidłowy rozmiar pliku!", "Niedobrze...", MB_ICONEXCLAMATION );
        PostQuitMessage( 0 ); // Zakończ program
    }
   
    Bufor =( LPSTR ) GlobalAlloc( GPTR, dwRozmiar + 1 );
    if( Bufor == NULL )
    {
        MessageBox( NULL, "Za mało pamięci!", "Ale wiocha...", MB_ICONEXCLAMATION );
        PostQuitMessage( 0 ); // Zakończ program
    }
   
    GetWindowText( text, Bufor, dwRozmiar ); // skopiuj do bufora tekst z jakiegoś okna
    Bufor[ dwRozmiar ] = 0; // dodaj zero na końcu stringa
   
    if( !WriteFile( hPlik, Bufor, dwRozmiar, & dwZapisane, NULL ) )
    {
        MessageBox( NULL, "Błąd zapisu do pliku", "Dupa blada!", MB_ICONEXCLAMATION );
        PostQuitMessage( 0 ); // Zakończ program
    }
   
    GlobalFree( Bufor ); // Zwolnij bufor
    CloseHandle( hPlik ); // Zamknij plik
}
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( GetModuleHandle( NULL ), MAKEINTRESOURCE( 1111 ) );
    wc.hCursor = LoadCursor( NULL, IDC_ARROW );
    wc.hbrBackground =( HBRUSH )( COLOR_WINDOW + 1 );
    wc.lpszMenuName = NULL;
    wc.lpszClassName = NazwaKlasy;
    wc.hIconSm = LoadIcon( GetModuleHandle( NULL ), MAKEINTRESOURCE( 2503 ) );
   
    // REJESTROWANIE KLASY OKNA
    if( !RegisterClassEx( & wc ) )
    {
        MessageBox( NULL, "Wysoka Komisja odmawia rejestracji tego okna!", "Niestety...",
        MB_ICONEXCLAMATION | MB_OK );
        return 1;
    }
   
    // TWORZENIE OKNA
    hMenu = LoadMenu( hInstance, MAKEINTRESOURCE( 200 ) );
   
    char tryy[ 64 ];
    strcpy( tryy, "Notatnik " );
    strcat( tryy, Version );
    hwnd = CreateWindowEx( WS_EX_CLIENTEDGE, NazwaKlasy, tryy, WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, CW_USEDEFAULT, 750, 500, NULL, hMenu, hInstance, NULL );
   
    if( hwnd == NULL )
    {
        MessageBox( NULL, "Okno odmówiło przyjścia na świat!", "Ale kicha...", MB_ICONEXCLAMATION );
        return 1;
       
    }
    hText = CreateWindowEx( 0, "EDIT", NULL, WS_CHILD | WS_VISIBLE |
    WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL, 0, 0, 740, 500, hwnd, NULL, hInstance, NULL );
   
    ShowWindow( hwnd, nCmdShow ); // Pokaż okienko...
    UpdateWindow( hwnd );
    lol = hInstance;
    RECT rect;
    if( GetWindowRect( hwnd, & rect ) )
    {
        width = rect.right - rect.left;
        height = rect.bottom - rect.top;
    }
    // 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_CTLCOLOREDIT:
        {
            HWND hCtl =( HWND ) lParam;
            HDC hDC =( HDC ) wParam;
           
            if( hCtl == hText )
            {
                SetBkMode( hDC, TRANSPARENT );
                SetTextColor( hDC, 0xffffff );
                return( LRESULT ) g_hBrush;
            }
        }
        break;
    case WM_COMMAND:
        {
            if( LOWORD( wParam ) == 103 ) //Koniec
                 PostQuitMessage( 0 );
            else if( LOWORD( wParam ) == 108 ) //O autorze
            {
                MessageBox( NULL, "Autorem jest Ignacy Kucharski",
                "O AUTORZE", NULL );
            }
            else if( LOWORD( wParam ) == 109 ) //o Programie
            {
                char str[ 64 ];
                strcpy( str, "Program powstał w 2/2016. Wersja: " );
                strcat( str, Version );
                MessageBox( NULL, str,
                "O Programie", NULL );
            }
            else if( LOWORD( wParam ) == 110 ) //Dla idiotów
            {
                MessageBox( NULL, "Serio nie umiesz z notatnika korzystać? :-)3",
                "O Korzystaniu z programu", NULL );
            }
            else if( LOWORD( wParam ) == 101 ) //Wczytywanie
            {
                OPENFILENAME ofn;
                char sNazwaPliku[ MAX_PATH ] = "";
               
                ZeroMemory( & ofn, sizeof( ofn ) );
                ofn.lStructSize = sizeof( ofn );
                ofn.lpstrFilter = "Pliki tekstowe (*.txt)\0*.txt\0Wszystkie pliki\0*.*\0";
                ofn.nMaxFile = MAX_PATH;
                ofn.lpstrFile = sNazwaPliku;
                ofn.lpstrDefExt = "txt";
                ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
                if( GetOpenFileName( & ofn ) )
                {
                    WczytajPlik( sNazwaPliku, hText );
                }
            }
            else if( LOWORD( wParam ) == 100 ) //Nowy plik
            {
                SetWindowText( hText, "" );
            }
            else if( LOWORD( wParam ) == 102 ) //Zapisywanie
            {
                OPENFILENAME ofn;
                char sNazwaPliku[ MAX_PATH ] = "";
               
                ZeroMemory( & ofn, sizeof( ofn ) );
                ofn.lStructSize = sizeof( ofn );
                ofn.lpstrFilter = "Pliki tekstowe (*.txt)\0*.txt\0Wszystkie pliki\0*.*\0";
                ofn.nMaxFile = MAX_PATH;
                ofn.lpstrFile = sNazwaPliku;
                ofn.lpstrDefExt = "txt";
                ofn.Flags = OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY;
                if( GetSaveFileName( & ofn ) )
                {
                    ZapiszPlik( sNazwaPliku, hText );
                }
            }
            else if( LOWORD( wParam ) == 104 ); //Wytnij
            else if( LOWORD( wParam ) == 105 ); //Kopiuj
            else if( LOWORD( wParam ) == 106 ); //Wklej
            else if( LOWORD( wParam ) == 107 )
            {
               
                CHOOSEFONT cfnt;
                LOGFONT lf;
                ZeroMemory( & cfnt, sizeof( CHOOSEFONT ) );
                cfnt.lStructSize = sizeof( CHOOSEFONT );
                cfnt.hwndOwner = hwnd;
                cfnt.Flags = CF_EFFECTS | CF_FORCEFONTEXIST | CF_SCREENFONTS;
                cfnt.lpLogFont = & lf;
               
                if( !ChooseFont( & cfnt ) )
                {
                    DWORD dwErr = CommDlgExtendedError();
                    if( dwErr ) MessageBox( hwnd, "Straszliwy błąd dialogu!", NULL, MB_ICONEXCLAMATION );
                   
                }
                else
                {
                    if( g_hfnNowy != NULL )
                         DeleteObject( g_hfnNowy );
                   
                    g_hfnNowy = CreateFontIndirect( cfnt.lpLogFont );
                    if( g_hfnNowy != NULL )
                         SendMessage( hText, WM_SETFONT,( WPARAM ) g_hfnNowy, MAKELPARAM( TRUE, 0 ) );
                   
                }
            }
           
        }
        break;
       
       
    case WM_CLOSE:
        DestroyWindow( hwnd );
        break;
       
    case WM_DESTROY:
        {
            if( g_hfnNowy != NULL ) DeleteObject( g_hfnNowy );
           
            PostQuitMessage( 0 );
        }
        break;
       
       
    case WM_SIZE:
        {
           
            MoveWindow( hText, 0, 0, LOWORD( lParam ), HIWORD( lParam ), TRUE );
            break;
        }
       
       
        default:
        return DefWindowProc( hwnd, msg, wParam, lParam );
    }
   
    return 0;
}


[ code src = "C++" ]
[/code]
P-145009
Monika90
» 2016-02-19 13:53:19
To z powodu
SetBkMode( hDC, TRANSPARENT );
, zastąp to tym
SetBkColor( hDC, 0x444444 );
 i powinno być dobrze.


C/C++
LPSTR NazwaKlasy = "Klasa Okienka";
LPSTR Version = "0.5.1";
A to jest źle (błąd typu) i uniemożliwia skompilowanie programu, zastąp to tym
C/C++
PCSTR NazwaKlasy = "Klasa Okienka";
PCSTR Version = "0.5.1";
P-145022
oigi333
Temat założony przez niniejszego użytkownika
» 2016-02-19 15:49:39
Teraz działa dzięki :)
P-145036
« 1 »
  Strona 1 z 1