Focus na Dialogbox w Dialogboxie aplikacji po uruchomieniu

0

Witam,

zaczynam przygodę z programowaniem w C, do tej pory siedziałem w AS3. Otóż mam pewien problem. Chodzi o wygenerowane 2 dialogboxy uruchamiające się wraz ze startem aplikacji. Jeden jest oknem głównym aplikacji (VNTH_MAIN), drugi wyskakuje zaraz po wygenerowaniu okna głównego (VNTH_START). Problem polega na tym, że focus ustawiony jest na VNTH_MAIN a chciałbym, żeby był ustawiony na VNTH_START. Kod:

#include <windows.h>#include <windowsx.h>
#include <commctrl.h>
#include "main.h"
 
 
BOOL CALLBACK DlgProc( HWND, UINT, WPARAM, LPARAM);
HINSTANCE hInst;
 
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) {
 
 
    hInst = hInstance;
 
 
    INITCOMMONCONTROLSEX icc;
    icc.dwICC = ICC_WIN95_CLASSES;
    icc.dwSize = sizeof( icc );
    InitCommonControlsEx( &icc );
 
 
    WNDCLASSEX wcx;
    wcx.cbSize = sizeof( wcx );
 
 
    if ( !GetClassInfoEx(NULL, MAKEINTRESOURCE(32770), &wcx) ) {
        MessageBox( NULL, "Error creating class.", "Error", MB_OK | MB_ICONERROR );
        return 0;
    }
 
 
    wcx.hInstance = hInstance;
    wcx.hIcon = LoadIcon( hInstance, IDI_APPLICATION );
    wcx.lpszClassName = "VantSnake";
 
 
    if ( !RegisterClassEx(&wcx) ) {
        MessageBox( NULL, "Error creating application.", "Error", MB_OK | MB_ICONERROR );
        return 0;
    }
 
 
    return DialogBox( hInstance, MAKEINTRESOURCE(VNTH_MAIN), NULL, (DLGPROC) DlgProc );
 
 
}
 
 
BOOL CALLBACK DlgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) {
 
 
    switch ( msg ) {
        case WM_COMMAND:
            switch ( GET_WM_COMMAND_ID(wParam, lParam) ) {
                case IDOK:
                    EndDialog( hWnd, 0 );
                    break;
            }
            break;
        case WM_CLOSE:
            EndDialog( hWnd, 0 );
            break;
        case WM_INITDIALOG:
            if ( !FindWindow(NULL, "Intro") ) {
 
 
                // creates Intro dialog box
                CreateDialog( GetModuleHandle(NULL), MAKEINTRESOURCE(VNTH_START), hWnd, (DLGPROC) DlgProc );
            } else {
 
 
                // here i'm trying to set focus on it, but it doesnt't works
                SetForegroundWindow( hWnd );
                SendMessage( hWnd, WM_NEXTDLGCTL, (WPARAM) GetDlgItem(hWnd, VNTH_START), TRUE );
 
 
            }
            return 1;
    }
 
 
    return 0;
 
 
}

Projekt w Pelles C jest do ściągnięcia na http://www.filolozka.pl/C/VantSnake.zip . Temat umieszczony na zagranicznych forach bez rozwiązania do tej pory. Proszę nie sugerować tylko, że Callbacki do różnych dialogów powinny być w różnych funkcjach - to wiem. Oraz to, że WM_INITDIALOG powinien zwracać FALSE a nie TRUE bo wg MSDN itd itp... - to też wiem, tyle, że to nie pomaga i dalej okno VNTH_START nie jest focusowane, chociaż VNTH_MAIN jest ustawione na disabled, więc te rzeczy nie rozwiązują problemu. Proszę o pomoc.

0

Przecież mechanizm okien dialogowych właśnie polega na tym, żeby wyświetlić okno, z którego się nie da wrócić do rodzica, aż do momentu zakończenia pracy z oknem dialogowym, więc teoretycznie jest tak jak ma być, po prostu nieświadomie próbujesz obejść mechanizm z którego korzystasz :>

0

Wyświetla się dobrze, problem polega na tym, że okno VNTH_START, które jest nad oknem głównym jest szare, tzn nie ma na nim focusa, czyli funkcja SetForegroundWindow nie zadziałała lub zadziałała a nie przyniosło to rezultatu. Jak zrobić, żeby było ok?

0
vantooh napisał(a):

Wyświetla się dobrze, problem polega na tym, że okno VNTH_START, które jest nad oknem głównym jest szare, tzn nie ma na nim focusa, czyli funkcja SetForegroundWindow nie zadziałała lub zadziałała a nie przyniosło to rezultatu.

Przeczytaj jeszcze raz co powyżej napisałem i postaraj się to rozumieć.

vantooh napisał(a):

Jak zrobić, żeby było ok?

Zamiast okien dialogowych użyć zwykłych okien, wtedy będziesz miał 2 okna równorzędne, a więc będziesz mógł przełączyć między nimi focus.

1 użytkowników online, w tym zalogowanych: 0, gości: 1