Skocz do zawartości

Re: Okna modalne


Nemo

Recommended Posts

Tobie nie chodzi jednak o dialogi. Przejrzałem wszystkie style okien, ale nie spotkałem żadnego które by dawało modalność, DS_MODALFRAME nie działa bo DS to prefiks od DIALOG STYLE. Ale możesz pokombinować coś sam np. z przekazywaniem fokusu, żeby twoje okno jeśli jest włączone nie dało fokusu żadnemu innemu oknu w programie.

Link do komentarza
Udostępnij na innych stronach

dobry pomycl
ale nie do kocna dobry ;)
ale wymyslilem takie cos
daje do funkcji komunikatow takei cos:

if(IsWindowVisible(hwnd_t) && Msg!=WM_PAINT &&  Msg!=WM_NCPAINT)
                return 0;
switch(Msg)
{
[...]
case WM_SETOCUS:
  SetFocus(hwnd_t);
  return 0;
[...]
}

i wszystko parwie dzial ale:
jak rusze tym oknem "modalnym" to okno glowne nie odswierza sie tylko zostaje taka maźia po oknie modalnym (jedynie to co w obsludze WM)PAINT jest sie odswieza)
jak zminimalizuje okno modalne i je potem przywrice to nie wiem czemu ale traci ono focus, tzn aktywne jest okno glowne - ma aktywny pasek ale nie reaguje na nic tak samo jak modalne

dziwna sparwa z tym :|

a moze zrobic tak:
w glownej petli ignorowac wszystkie komunikaty i tylko odbierac te do okna modlanego
eh sam jzu nie wiem ;]

Link do komentarza
Udostępnij na innych stronach

nie kumam zabardzo o co z tym chodzi:
if(IsWindowVisible(hwnd_t) && Msg!=WM_PAINT && Msg!=WM_NCPAINT)
return 0;
po co to?
i co to jest funkcja komunikatów? chodzi ci o pętlę komunikatów czy procedurę okna?
Zrób tak: po prostu w procedurze okna okna głównego przechwyć komunikat WM_SETFOCUS:
case WM_SETFOCUS:
if (IsWindowVisible(hwnd_oknomodlane))
SetFocus(hwnd_oknomodalne);
return 0;

To powinno pomóc, ale nie kombinuj nic z pętlą komunikatów.

Link do komentarza
Udostępnij na innych stronach

Z petla nic nie kombinowalem tylko tak sobie pomyslalem.
A ten kod co jest w moim poscie wyzej to kod z procedurki okna glownego,
a hwnd_t to uchwyt okna modalnego (zamonialem to napsiac).

Ja zrobilem z tym fokusem tak jak napsailes teraz ale mi to nie dzialal tak jak powinno wiec zrobilem tak jak w kodzie wyzej ale tez nei do konca dobrze ;)

Link do komentarza
Udostępnij na innych stronach

Dla tych ktorzy by kiedys potrzebowali ;)
Obsluga jest przyjemna. Jak piszmey:
ShowWindow(hwnd_m, SW_SHOWNORMAL);
to okienko modalne sie uruchamia a jak je zamykamy to okienko nie zostaje zniszczone tylko ukryte dzieki czemu potem mozemy ponownie uruchomic oko modalne poprzez ShowWindow ;)

HWND hwnd;      // uchyt okna głównego
HWND hwnd_m; // uchyt okna modalnego

//funkcja okna glownego
LRESULT CALLBACK WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
  //tutaj co tam chcecie ;)
}

//funkcja okna modalnego
LRESULT CALLBACK ModWndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) 
{
LRESULT CALLBACK WndProcT(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
        switch(Msg)
        {
        case WM_SHOWWINDOW:
                EnableWindow(hwnd, !((BOOL)wParam));
                        return 0;

        case WM_CLOSE:
                ShowWindow(hWnd, SW_HIDE);
                return 0;
        }

        return DefWindowProc(hWnd, Msg, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
        MSG             msg;
        WNDCLASS        wndclass;

        wndclass.cbClsExtra             = 0;
        wndclass.cbWndExtra             = 0;
        wndclass.hbrBackground  = (HBRUSH) GetStockObject(WHITE_BRUSH);
        wndclass.hCursor                        = LoadCursor(NULL, IDC_ARROW);
        wndclass.hIcon                          = LoadIcon(NULL, IDI_WINLOGO);
        wndclass.hInstance              = hInstance;
        wndclass.lpfnWndProc            = WndProc;
        wndclass.lpszClassName  = szAppName;
        wndclass.lpszMenuName   = NULL;
        wndclass.style                          = CS_HREDRAW | CS_VREDRAW;

        RegisterClass(&wndclass);

        hwnd = CreateWindow(szAppName, TEXT("Okno"), WS_OVERLAPPEDWINDOW,
                CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
                NULL, NULL, hInstance, NULL);

/******** okno modalne ************/
        wndclass.lpfnWndProc            = ModWndProc;
        wndclass.lpszClassName  = szModName;
        RegisterClass(&wndclass);
        hwnd_m = CreateWindow(szModName, TEXT("Modalne Okno"), WS_POPUPWINDOW|WS_CAPTION,
                0, 0, 400, 300, hwnd, NULL, hInstance, NULL);

        ShowWindow(hwnd, nCmdShow);
        UpdateWindow(hwnd);
        ShowWindow(hwnd_m, SW_SHOWNORMAL);
        UpdateWindow(hwnd_m);

        while(TRUE)
        {
                if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
                {
                        if(msg.message==WM_QUIT) break;
                        TranslateMessage(&msg);
                        DispatchMessage(&msg);
                }
        }

        return msg.wParam;
}

pozdrawiam

Link do komentarza
Udostępnij na innych stronach

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gość
Odpowiedz...

×   Wkleiłeś zawartość bez formatowania.   Usuń formatowanie

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Utwórz nowe...