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

WinApi - zamykanie okna

Ostatnio zmodyfikowano 2009-09-12 17:55
Autor Wiadomość
steckel
Temat założony przez niniejszego użytkownika
WinApi - zamykanie okna
» 2009-09-12 09:57:38
Próbuję napisać prosty programik w WinApi, lecz niestety od razu się zamyka, a nie powinien.
C/C++
#include "main.hpp"

HWND hWnd;
HWND hMessageBox;
HWND hChatBox;

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
    InitWindow( 400, 500, "Chat" );
    MSG message;
    while( GetMessage( & message, NULL, 0, 0 ) )
    {
        TranslateMessage( & message );
        DispatchMessage( & message );
    }
    return message.wParam;
}

void InitWindow( int width, int height, std::string name )
{
    HINSTANCE hProg = GetModuleHandle( 0 );
    WNDCLASSEX wc;
    wc.cbSize = sizeof( WNDCLASSEX );
    wc.style = 0;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hProg;
    wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
    wc.hCursor = LoadCursor( NULL, IDC_ARROW );
    wc.hbrBackground =( HBRUSH )( COLOR_WINDOW + 1 );
    wc.lpszMenuName = NULL;
    wc.lpszClassName = "window";
    wc.hIconSm = LoadIcon( NULL, IDI_APPLICATION );
    RegisterClassEx( & wc );
    hWnd = CreateWindowEx( 0, "WndClass", name.c_str(), WS_OVERLAPPEDWINDOW,
    0, 0, width, height, 0, 0, hProg, 0 );
    ShowWindow( hWnd, 5 );
    UpdateWindow( hWnd );
    hMessageBox = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL, 5, height - 120, width - 20, 80, hWnd, NULL, hProg, NULL );
    hChatBox = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL, 5, 5, width - 20, height - 140, hWnd, NULL, hProg, NULL );
}

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;
        default:
        return DefWindowProc( hwnd, msg, wParam, lParam );
    }
    return 0;
}

void Copy() {
    DWORD dlugosc = GetWindowTextLength( hMessageBox );
    LPSTR Bufor =( LPSTR ) GlobalAlloc( GPTR, dlugosc + 1 );
    GetWindowText( hMessageBox, Bufor, dlugosc + 1 );
    SetWindowText( hChatBox, Bufor );
    GlobalFree( Bufor );
}
P-10183
steckel
Temat założony przez niniejszego użytkownika
» 2009-09-12 11:18:37
Dzięki!
Teraz przerobiłem funkcję proceduralną tak, aby po wciśnięciu klawisza Enter tekst został skopiowany z dolnego pola na górne. Nie wiem czemu program tam nie dochodzi:
C/C++
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_KEYDOWN:
        switch(( int ) wParam )
        {
        case VK_RETURN:
            Copy();
            break;
        case VK_ESCAPE:
            DestroyWindow( hwnd );
            break;
        }
        break;
        default:
        return DefWindowProc( hwnd, msg, wParam, lParam );
    }
    return 0;
}
P-10185
steckel
Temat założony przez niniejszego użytkownika
» 2009-09-12 14:43:22
Więc muszę pisać obsługę zdarzeń dla każdej z kontrolek czy może da się to napisać jakoś globalnie?
P-10193
steckel
Temat założony przez niniejszego użytkownika
» 2009-09-12 16:07:44
Możesz podać przykład? Nie mam pojęcia jak się to robi.
P-10195
steckel
Temat założony przez niniejszego użytkownika
» 2009-09-12 17:08:22
Przeczytałem rozdział o subclassingu pojedynczego okna i napisałem kod, lecz niestety program się wysypuje ;/
C/C++
#include "main.hpp"

HWND hWnd;
HWND hMessageBox;
HWND hChatBox;
WNDPROC g_OldWndProc;

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
    InitWindow( 400, 500, "Chat" );
    MSG message;
    while( GetMessage( & message, NULL, 0, 0 ) )
    {
        TranslateMessage( & message );
        DispatchMessage( & message );
    }
    return message.wParam;
}

void InitWindow( int width, int height, std::string name )
{
    HINSTANCE hProg = GetModuleHandle( 0 );
    WNDCLASSEX wc;
    wc.cbSize = sizeof( WNDCLASSEX );
    wc.style = 0;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hProg;
    wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
    wc.hCursor = LoadCursor( NULL, IDC_ARROW );
    wc.hbrBackground =( HBRUSH )( COLOR_WINDOW + 1 );
    wc.lpszMenuName = NULL;
    wc.lpszClassName = "WndClass";
    wc.hIconSm = LoadIcon( NULL, IDI_APPLICATION );
    RegisterClassEx( & wc );
    hWnd = CreateWindowEx( 0, "WndClass", name.c_str(), WS_OVERLAPPEDWINDOW,
    0, 0, width, height, 0, 0, hProg, 0 );
    ShowWindow( hWnd, 5 );
    UpdateWindow( hWnd );
    hMessageBox = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL, 5, height - 120, width - 20, 80, hWnd, NULL, hProg, NULL );
    hChatBox = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL, 5, 5, width - 20, height - 140, hWnd, NULL, hProg, NULL );
    SetWindowLong( hMessageBox, GWL_WNDPROC,( LONG ) NewWndProc );
    g_OldWndProc =( WNDPROC ) SetWindowLong( hMessageBox, GWL_WNDPROC,( LONG ) NewWndProc );
}

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_KEYDOWN:
        switch(( int ) wParam )
        {
        case VK_RETURN:
            Copy();
            break;
        case VK_ESCAPE:
            DestroyWindow( hwnd );
            break;
        }
        break;
        default:
        return DefWindowProc( hwnd, msg, wParam, lParam );
    }
    return 0;
}

void Copy() {
    DWORD dlugosc = GetWindowTextLength( hMessageBox );
    LPSTR Bufor =( LPSTR ) GlobalAlloc( GPTR, dlugosc + 1 );
    GetWindowText( hMessageBox, Bufor, dlugosc + 1 );
    SetWindowText( hChatBox, Bufor );
    GlobalFree( Bufor );
}

LRESULT CALLBACK NewWndProc( HWND hwnd, UINT mesg, WPARAM wParam, LPARAM lParam )
{
    switch( mesg )
    {
    case WM_KEYDOWN:
        {
            CallWindowProc( WndProc, hwnd, mesg, wParam, lParam );
        }
        break;
    }
    return CallWindowProc( g_OldWndProc, hwnd, mesg, wParam, lParam ); //tu się odzywa debugger
}
P-10196
steckel
Temat założony przez niniejszego użytkownika
» 2009-09-12 18:00:24
Dzięki!
P-10197
manfred
» 2009-09-12 10:26:12
C/C++
wc.lpszClassName = "window";
//...
hWnd = CreateWindowEx( 0, "WndClass", name.c_str(), WS_OVERLAPPEDWINDOW,
0, 0, width, height, 0, 0, hProg, 0 );
Nie uważasz, że nazwa klasy okna powinna być w obu miejscach ta sama?
P-19300
manfred
» 2009-09-12 11:22:41
Dochodzi, tylko twoje okno musi mieć focus, a nie kontrolka edit.
P-19301
« 1 » 2
  Strona 1 z 2 Następna strona