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. #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 ); }
|
|
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: 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; }
|
|
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? |
|
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. |
|
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 ;/ #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 ); }
|
|
steckel Temat założony przez niniejszego użytkownika |
» 2009-09-12 18:00:24 Dzięki! |
|
manfred |
» 2009-09-12 10:26:12 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? |
|
manfred |
» 2009-09-12 11:22:41 Dochodzi, tylko twoje okno musi mieć focus, a nie kontrolka edit. |
|
« 1 » 2 |