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

[C++][winAPI] Ukrywanie okna podrzędnego minimalizuje główne

Ostatnio zmodyfikowano 2017-02-09 13:03
Autor Wiadomość
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:
C/C++
LRESULT CALLBACK WndProc3( HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam ) {
    switch( Message ) {
    case WM_DESTROY: {
            ShowWindow( hwndUst, SW_HIDE ); //przy kliknięciu X na oknie podrzędnym (hwndUst) ma je ukryć, a przy okazji minimalizuje okno główne (hwnd) z przyczyn nieznanych...
            break;
        }
       
        default:
        return DefWindowProc( hwnd, Message, wParam, lParam );
    }
    return 0;
}
P-157464
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.
P-157477
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?
P-157479
pekfos
» 2017-02-08 16:37:46
Pokaż tworzenie okien.
P-157480
programirer
Temat założony przez niniejszego użytkownika
» 2017-02-09 12:28:24
C/C++
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, /* x */
CW_USEDEFAULT, /* y */
500, /* width */
120, /* height */
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, /* x */
CW_USEDEFAULT, /* y */
460, /* width */
350, /* height */
hwnd, NULL, hInstance, NULL );
P-157528
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.
C/C++
#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 )
{
   
    // WYPEŁNIANIE STRUKTURY
    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, /* x */
    CW_USEDEFAULT, /* y */
    500, /* width */
    120, /* height */
    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, /* x */
    CW_USEDEFAULT, /* y */
    460, /* width */
    350, /* height */
    hwnd, NULL, hInstance, NULL );
   
    ShowWindow( hwnd, nCmdShow ); // Pokaż okienko...
    UpdateWindow( hwnd );
    ShowWindow( hwndUst, nCmdShow ); // Pokaż okienko...
    UpdateWindow( hwndUst );
   
    // Pętla komunikatów
    while( GetMessage( & Komunikat, NULL, 0, 0 ) )
    {
        TranslateMessage( & Komunikat );
        DispatchMessage( & Komunikat );
    }
    return Komunikat.wParam;
}

// OBSŁUGA ZDARZEŃ
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:
        //DestroyWindow( hwnd );
        ShowWindow( hwndUst, SW_HIDE );
        break;
       
       
        default:
        return DefWindowProc( hwnd, msg, wParam, lParam );
    }
   
    return 0;
}
P-157529
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.
P-157534
« 1 »
  Strona 1 z 1