programirer Temat założony przez niniejszego użytkownika |
[C++][winAPI] Ukrywanie okna podrzędnego minimalizuje główne » 2017-02-08 12:26:33 Problem taki jak w tytule, czyli funkcja ShowWindow nie wiedzieć czemu oprócz ukrycia okna podanego w parametrze minimalizuje mi też okno główne. Kod wygląda tak: LRESULT CALLBACK WndProc3( HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam ) { switch( Message ) { case WM_DESTROY: { ShowWindow( hwndUst, SW_HIDE ); break; } default: return DefWindowProc( hwnd, Message, wParam, lParam ); } return 0; } |
|
pekfos |
» 2017-02-08 16:15:22 przy kliknięciu X na oknie podrzędnym (hwndUst) ma je ukryć |
Ma ukryć okno, które zostało zamknięte tym Xem? WM_DESTROY to nie miejsce na to, a z kodu nie można wydedukować, czy hwndUst to właściwy argument. |
|
programirer Temat założony przez niniejszego użytkownika |
» 2017-02-08 16:30:40 Ma ukryć okno, które zostało zamknięte tym Xem? |
Tak dokładnie, czyli okno hwndUst. Jeśli nie WM_DESTROY, to w którym miejscu? WM_CLOSE? Nie ma to wpływu na główny problem minimalizacji innego okna. Co jeszcze z kodu potrzeba? |
|
pekfos |
» 2017-02-08 16:37:46 Pokaż tworzenie okien. |
|
programirer Temat założony przez niniejszego użytkownika |
» 2017-02-09 12:28:24 memset( & wc, 0, sizeof( wc ) ); wc.style = CS_HREDRAW | CS_VREDRAW; wc.cbSize = sizeof( WNDCLASSEX ); wc.lpfnWndProc = WndProc; wc.hInstance = hInstance; wc.hCursor = LoadCursor( NULL, IDC_ARROW );
wc.hbrBackground =( HBRUSH )( COLOR_WINDOW + 1 ); wc.lpszClassName = "WindowClass"; wc.hIcon = LoadIcon( NULL, IDI_APPLICATION ); wc.hIconSm = LoadIcon( NULL, IDI_APPLICATION ); wc.hIcon = LoadIcon( GetModuleHandle( NULL ), MAKEINTRESOURCE( 1284 ) ); wc.hIconSm = LoadIcon( GetModuleHandle( NULL ), MAKEINTRESOURCE( 2503 ) );
INITCOMMONCONTROLSEX iccex; iccex.dwICC = ICC_WIN95_CLASSES; iccex.dwSize = sizeof( INITCOMMONCONTROLSEX ); InitCommonControlsEx( & iccex );
if( !RegisterClassEx( & wc ) ) { MessageBox( NULL, "Window Registration Failed! WindowClass", "Error!", MB_ICONEXCLAMATION | MB_OK ); return 0; }
hwnd = CreateWindowEx( WS_EX_CLIENTEDGE, "WindowClass", "Główne", WS_VISIBLE | WS_CLIPCHILDREN | WS_SYSMENU | WS_MINIMIZEBOX, CW_USEDEFAULT, CW_USEDEFAULT, 500, 120, NULL, NULL, hInstance, NULL );
if( hwnd == NULL ) { MessageBox( NULL, "Window Creation Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK ); return 0; }
memset( & wc, 0, sizeof( wc ) ); wc.cbSize = sizeof( WNDCLASSEX ); wc.lpfnWndProc = WndProc3; wc.hInstance = hInstance; wc.hCursor = LoadCursor( NULL, IDC_ARROW );
wc.hbrBackground =( HBRUSH )( COLOR_WINDOW + 1 ); wc.lpszClassName = "WindowClass3"; wc.hIcon = LoadIcon( NULL, IDI_APPLICATION ); wc.hIconSm = LoadIcon( NULL, IDI_APPLICATION ); wc.hIcon = LoadIcon( GetModuleHandle( NULL ), MAKEINTRESOURCE( 1284 ) ); wc.hIconSm = LoadIcon( GetModuleHandle( NULL ), MAKEINTRESOURCE( 2503 ) );
if( !RegisterClassEx( & wc ) ) { MessageBox( NULL, "Window Registration Failed! WindowClass3", "Error!", MB_ICONEXCLAMATION | MB_OK ); return 0; }
hwndUst = CreateWindowEx( WS_EX_CLIENTEDGE, "WindowClass3", "Podrzędne", WS_DLGFRAME | WS_EX_TOOLWINDOW | WS_EX_TOPMOST | WS_SYSMENU | WS_CAPTION, CW_USEDEFAULT, CW_USEDEFAULT, 460, 350, hwnd, NULL, hInstance, NULL );
|
|
pekfos |
» 2017-02-09 12:44:39 Na pewno właściwie podałeś WndProc3? Dodałem niezbędne fragmenty i kod działa jak należy. #include <windows.h> #include <commctrl.h>
MSG Komunikat;
HWND hwnd, hwndUst;
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ); LRESULT CALLBACK WndProc3( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { WNDCLASSEX wc; memset( & wc, 0, sizeof( wc ) ); wc.style = CS_HREDRAW | CS_VREDRAW; wc.cbSize = sizeof( WNDCLASSEX ); wc.lpfnWndProc = WndProc; wc.hInstance = hInstance; wc.hCursor = LoadCursor( NULL, IDC_ARROW ); wc.hbrBackground =( HBRUSH )( COLOR_WINDOW + 1 ); wc.lpszClassName = "WindowClass"; wc.hIcon = LoadIcon( NULL, IDI_APPLICATION ); wc.hIconSm = LoadIcon( NULL, IDI_APPLICATION ); wc.hIcon = LoadIcon( GetModuleHandle( NULL ), MAKEINTRESOURCE( 1284 ) ); wc.hIconSm = LoadIcon( GetModuleHandle( NULL ), MAKEINTRESOURCE( 2503 ) ); INITCOMMONCONTROLSEX iccex; iccex.dwICC = ICC_WIN95_CLASSES; iccex.dwSize = sizeof( INITCOMMONCONTROLSEX ); InitCommonControlsEx( & iccex ); if( !RegisterClassEx( & wc ) ) { MessageBox( NULL, "Window Registration Failed! WindowClass", "Error!", MB_ICONEXCLAMATION | MB_OK ); return 0; } hwnd = CreateWindowEx( WS_EX_CLIENTEDGE, "WindowClass", "Główne", WS_VISIBLE | WS_CLIPCHILDREN | WS_SYSMENU | WS_MINIMIZEBOX, CW_USEDEFAULT, CW_USEDEFAULT, 500, 120, NULL, NULL, hInstance, NULL ); if( hwnd == NULL ) { MessageBox( NULL, "Window Creation Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK ); return 0; } memset( & wc, 0, sizeof( wc ) ); wc.cbSize = sizeof( WNDCLASSEX ); wc.lpfnWndProc = WndProc3; wc.hInstance = hInstance; wc.hCursor = LoadCursor( NULL, IDC_ARROW ); wc.hbrBackground =( HBRUSH )( COLOR_WINDOW + 1 ); wc.lpszClassName = "WindowClass3"; wc.hIcon = LoadIcon( NULL, IDI_APPLICATION ); wc.hIconSm = LoadIcon( NULL, IDI_APPLICATION ); wc.hIcon = LoadIcon( GetModuleHandle( NULL ), MAKEINTRESOURCE( 1284 ) ); wc.hIconSm = LoadIcon( GetModuleHandle( NULL ), MAKEINTRESOURCE( 2503 ) ); if( !RegisterClassEx( & wc ) ) { MessageBox( NULL, "Window Registration Failed! WindowClass3", "Error!", MB_ICONEXCLAMATION | MB_OK ); return 0; } hwndUst = CreateWindowEx( WS_EX_CLIENTEDGE, "WindowClass3", "Podrzędne", WS_DLGFRAME | WS_EX_TOOLWINDOW | WS_EX_TOPMOST | WS_SYSMENU | WS_CAPTION, CW_USEDEFAULT, CW_USEDEFAULT, 460, 350, hwnd, NULL, hInstance, NULL ); ShowWindow( hwnd, nCmdShow ); UpdateWindow( hwnd ); ShowWindow( hwndUst, nCmdShow ); UpdateWindow( hwndUst ); while( GetMessage( & Komunikat, NULL, 0, 0 ) ) { TranslateMessage( & Komunikat ); DispatchMessage( & Komunikat ); } return Komunikat.wParam; }
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; }
LRESULT CALLBACK WndProc3( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) { switch( msg ) { case WM_CLOSE: ShowWindow( hwndUst, SW_HIDE ); break; default: return DefWindowProc( hwnd, msg, wParam, lParam ); } return 0; }
|
|
programirer Temat założony przez niniejszego użytkownika |
» 2017-02-09 13:03:07 Nie mam pojęcia o co może tu chodzić. Ale odkryłem śmieszną zależność. Mianowicie jeśli po uruchomieniu się programu i ukazaniu się dwóch okien klikniemy np. w przeglądarkę i potem wrócimy do okna programu to wszystko działa jak trzeba :D Może to zależy od OS, nie wiem. Chyba tu chodzi o coś ze stylami TOPMOST, pokombinuje jeszcze i dam znać jak coś się uda. |
|
« 1 » |