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 #define ID_BUTTON_WRITE 101 #define ID_BUTTON_CLOSE 102
ID button'ów. 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. 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ć? |
|
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. |
|
carlosmay Temat założony przez niniejszego użytkownika |
» 2015-08-21 13:43:17 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 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? |
|
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ć. |
|
carlosmay Temat założony przez niniejszego użytkownika |
» 2015-08-21 14:35:13 Dzięki. |
|
« 1 » |