Skocz do zawartości

Recommended Posts

Napisano

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.

Napisano

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 ;]

Napisano

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.

Napisano

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 ;)

Napisano

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

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...