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

[c++] WinAPI WM_COMMAND: kliknięcie na kontrolkę EDIT zamyka całe okno.

Ostatnio zmodyfikowano 2015-08-21 14:35
Autor Wiadomość
carlosmay
Temat założony przez niniejszego użytkownika
[c++] WinAPI WM_COMMAND: kliknięcie na kontrolkę EDIT zamyka całe okno.
» 2015-08-21 00:06:15
C/C++
#define ID_BUTTON_WRITE 101
#define ID_BUTTON_CLOSE 102
 ID button'ów.

C/C++
void CreateEdit( const HWND & hWnd, const HINSTANCE & hInst, HWND & g_hEdit ) {
    g_hEdit = CreateWindowEx( WS_EX_CLIENTEDGE,( LPCWSTR ) _T( "EDIT" ), NULL,
    WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL,
    10, 10, 500, 300, hWnd, NULL, hInst, NULL );
    if( !g_hEdit )
         SendMessage( hWnd, WM_CLOSE, NULL, NULL );
   
    SetWindowText( g_hEdit, _T( "Wpisz tu coś..." ) );
}

void CreateButton( const HWND & hWnd, const HINSTANCE & hInst, HWND & g_hButW, HWND & g_hButC ) {
    g_hButW = CreateWindowEx( WS_EX_CLIENTEDGE,( LPCWSTR ) _T( "BUTTON" ), _T( "Zapisz tekst" ),
    WS_CHILD | WS_VISIBLE | WS_BORDER, 10, 350, 150, 30,
    hWnd,( HMENU ) ID_BUTTON_WRITE, hInst, NULL );
    if( !g_hButW ) SendMessage( hWnd, WM_CLOSE, NULL, NULL );
   
    g_hButC = CreateWindowEx( WS_EX_CLIENTEDGE,( LPCWSTR ) _T( "BUTTON" ), _T( "Wyjdź" ),
    WS_CHILD | WS_VISIBLE | WS_BORDER, 200, 350, 150, 30,
    hWnd,( HMENU ) ID_BUTTON_CLOSE, hInst, NULL );
    if( !g_hButC ) SendMessage( hWnd, WM_CLOSE, NULL, NULL );
   
}
 funkcje produkujące kontrolki.

C/C++
LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) {
    switch( msg ) {
    case WM_CREATE:
        CreateEdit( hWnd, hInst, g_hEdit );
        CreateButton( hWnd, hInst, g_hBut_write, g_hBut_close );
        break;
    case WM_COMMAND:
        switch( wParam ) {
        case ID_BUTTON_WRITE:
            WriteFile( hFout, g_hEdit, hWnd );
            break;
        case ID_BUTTON_CLOSE:
            DestroyWindow( hWnd );
            break;
        }
    case WM_CLOSE:
        DestroyWindow( hWnd );
        break;
    case WM_DESTROY:
        PostQuitMessage( 0 );
        break;
        default:
        return DefWindowProc( hWnd, msg, wParam, lParam );
    }
    return 0;
}
 obsługa komunikatów.
Gdy dodałem
WM_COMMAND:
 po uruchomieniu pojawia się okienko całe okienko, ale znika gdy tylko kliknę na nie myszką.
Jak wykomentuję cały
WM_COMMAND:
 to okienko nie znika i normalnie można w nim pisać.
Chciałem mieć możliwość zapisania w pliku zawartość pola tekstowego.

Jak to pogodzić?
P-136624
DejaVu
» 2015-08-21 09:20:30
Nie masz słowa kluczowego break dla WM_COMMAND, więc po wykonaniu WM_COMMAND wykonuje WM_CLOSE.
P-136633
carlosmay
Temat założony przez niniejszego użytkownika
» 2015-08-21 13:43:17
C/C++
case WM_COMMAND:
switch( wParam ) {
case ID_BUTTON_WRITE:
    WriteFile( hFout, g_hEdit, hWnd );
    break;
case ID_BUTTON_CLOSE:
    DestroyWindow( hWnd );
    break;
}
break;
Dzięki.

Podpinam pytanie:
Czy taki
C/C++
if( !g_hEdit )
     SendMessage( hWnd, WM_CLOSE, NULL, NULL );
 zapis jest OK? Czy może jednak wystrzegać się go i stosować funkcje zwracające typ
bool
 i dopiero w
WinMain()
 bądź w obsłudze komunikatów
WM_CREATE:
obsługiwać wszelkie błędy?
P-136645
Vister26
» 2015-08-21 14:16:12
Ten sposób jest w porządku, ale znacznie czytelniej byłoby obsługiwać wartości zwracane przez funkcję. Wtedy masz obsługę wszystkich błędów w jednym miejscu i łatwiej ci będzie debugować.
P-136647
carlosmay
Temat założony przez niniejszego użytkownika
» 2015-08-21 14:35:13
Dzięki.
P-136648
« 1 »
  Strona 1 z 1