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

[WinAPI] Kontrolka Tab blokuje się przy utracie focusa

Ostatnio zmodyfikowano 2013-06-29 21:45
Autor Wiadomość
berkov
Temat założony przez niniejszego użytkownika
[WinAPI] Kontrolka Tab blokuje się przy utracie focusa
» 2013-06-28 13:46:08
Hey ho.

Generalnie sprawa niby prosta.
Tworze okno HWND hdMngAll2 (proces WndProc_dMngAll2), w ktorym umieszczam Tab Control (IDC_mngall2_tab) a w nim dwa okna (tab1, tab2) gdzie tab1 ma juz statyczne, zdefiniowane jakies kontrolki a w tab2 bede je tworzyl dynamicznie (narazie to nieistotne). Prawie wszystko narazie dziala ok - przelaczanie tabow, wpisywanie tekstu w kontrolki na tab1 przez uzytkownika, zamykanie calego okna hdMngAll2 itd itp.... problem pojawia sie w momecie gdy uzytkownik "zrobi focus" na jakakolwiek kontrolke na tab1 (czyli np kliknie na jakis EDITEXT) a nastepnie kliknie gdzies poza obszar okna hdMngAll2 - moze to byc na inne okno aplikacji albo wogole poza aplikacje (czyli kontrolka na tab1 utraci focus na rzecz innego okna). Cala aplikacja sie wtedy zawiesz i przestaje odpowiadac (ale nie wyrzuca bledu) a zuzycie procesora wskakuje zawsze na 25% - takjakby sie cos zapetlilo ale nie powodujac na dluzasza mete bledu braku odpowiedzi do windowsa.


resource.rc:
C/C++
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
IDD_MNGALL2 DIALOG 0, 0, 250, 300
STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU
CAPTION "Zarzadzaj uzytkownikiem"
FONT 8, "Verdana"
{
    DEFPUSHBUTTON "OK", IDC_mngall2_ok, 197, 273, 50, 14
    PUSHBUTTON "Anuluj", IDC_mngall2_cancel, 145, 273, 50, 14
    CONTROL "", IDC_mngall2_tab, WC_TABCONTROL, 1, 0, 0, 250, 300, WS_CLIPSIBLINGS | WS_VISIBLE
   
}

LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
TAB1 DIALOG 0, 15, 240, 285
STYLE DS_3DLOOK | WS_SYSMENU | WS_CHILD
EXSTYLE WS_EX_CONTROLPARENT
FONT 8, "Verdana"
{
    LTEXT "ID nr:", IDC_STATIC, 10, 15, 50, 10, SS_LEFT
    LTEXT "Uzytkownik", IDC_STATIC, 10, 30, 50, 10, SS_LEFT
    LTEXT "Data utw.:", IDC_STATIC, 10, 45, 50, 10, SS_LEFT
    LTEXT "Utw. przez:", IDC_STATIC, 10, 60, 50, 10, SS_LEFT
    LTEXT "Imie:", IDC_STATIC, 10, 75, 50, 10, SS_LEFT
    LTEXT "Nazwisko:", IDC_STATIC, 10, 90, 50 10, SS_LEFT
    LTEXT "E-mail:", IDC_STATIC, 10, 105, 50, 10, SS_LEFT
    AUTOCHECKBOX "Aktywny: ", IDC_mngall2_usr_usr_auth_login, 10, 120, 50, 10
    EDITTEXT IDC_mngall2_usr_usr_id, 60, 15, 29, 14, ES_AUTOHSCROLL | WS_DISABLED | WS_TABSTOP
    EDITTEXT IDC_mngall2_usr_name, 60, 30, 75, 14, ES_AUTOHSCROLL | WS_DISABLED | WS_TABSTOP
    EDITTEXT IDC_mngall2_usr_enterdate, 60, 45, 75, 14, ES_AUTOHSCROLL | WS_DISABLED | WS_TABSTOP
    EDITTEXT IDC_mngall2_usr_enteredby, 60, 60, 50, 14, ES_AUTOHSCROLL | WS_DISABLED | WS_TABSTOP
    EDITTEXT IDC_mngall2_usr_fullname, 60, 75, 150, 14, ES_AUTOHSCROLL | WS_TABSTOP
    EDITTEXT IDC_mngall2_usr_fulllastname, 60, 90, 150 14, ES_AUTOHSCROLL | WS_TABSTOP
    EDITTEXT IDC_mngall2_usr_email, 60, 105, 150, 14, ES_AUTOHSCROLL | WS_TABSTOP
}

LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
TAB2 DIALOG 0, 15, 240, 285
STYLE DS_3DLOOK | WS_SYSMENU | WS_CHILD
EXSTYLE WS_EX_CONTROLPARENT
FONT 8, "Verdana"
{
    //Zawartosc tego (tab 2) tabu bedzie tworzona dynamicznie
}

mngall.cpp
C/C++
HWND tab1;
HWND tab2;

BOOL CALLBACK WndProc_dMngAll1( HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam )
{
    switch( Msg )
    {
    case WM_COMMAND:
        {
            switch( LOWORD( wParam ) )
            {
            case IDC_mngall1_show: {
                    //dla wszystkich pozostalych w comboboxie utworz okno w ktorym beda taby
                    HWND hdMngAll2 = CreateDialog( GetModuleHandle( 0 ), MAKEINTRESOURCE( IDD_MNGALL2 ), NULL, WndProc_dMngAll2 );
                    DestroyWindow( hwnd );
                } break;
               
            }
        } break;
       
       
        default: return FALSE;
    }
    return TRUE;
}

BOOL CALLBACK WndProc_dMngAll2( HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam )
{
    switch( Msg )
    {
    case WM_COMMAND:
        {
            switch( LOWORD( wParam ) )
            {
            case IDC_mngall2_ok:
                {
                    MessageBox( hwnd, "Kliknales sobie OK!", 0, 0 );
                   
                } break;
               
            case IDC_mngall2_cancel:
                {
                    DestroyWindow( tab1 );
                    DestroyWindow( tab2 );
                    DestroyWindow( hwnd );
                   
                } break;
               
            }
        } break;
       
    case WM_INITDIALOG:
        {
            HWND hTabControl = GetDlgItem( hwnd, IDC_mngall2_tab );
            TCITEM tab;
            tab.mask = TCIF_TEXT;
            tab.pszText = "Ogolne";
            SendDlgItemMessage( hwnd, IDC_mngall2_tab, TCM_INSERTITEM, 0,( LPARAM ) & tab );
            tab.pszText = "Autoryzacje";
            SendDlgItemMessage( hwnd, IDC_mngall2_tab, TCM_INSERTITEM, 1,( LPARAM ) & tab );
            TabCtrl_SetCurSel( hTabControl, 0 );
           
            tab1 = CreateDialog( GetModuleHandle( NULL ),
            MAKEINTRESOURCE( TAB1 ), hTabControl, WndProc_dMngAll2TAB1 );
            tab2 = CreateDialog( GetModuleHandle( NULL ),
            MAKEINTRESOURCE( TAB2 ), GetDlgItem( hwnd, IDC_mngall2_tab ), WndProc_dMngAll2TAB2 );
           
            ShowWindow( hwnd, SW_SHOW );
            ShowWindow( tab1, SW_SHOW );
            ShowWindow( tab2, SW_HIDE );
           
            return TRUE;
        } break;
       
    case WM_NOTIFY:
        {
            switch((( LPNMHDR ) lParam )->code )
            {
            case TCN_SELCHANGE:
                {
                    if( TabCtrl_GetCurSel((( LPNMHDR ) lParam )->hwndFrom ) == 0 ) {
                        ShowWindow( tab1, SW_SHOW );
                        ShowWindow( tab2, SW_HIDE );
                    } else {
                        ShowWindow( tab1, SW_HIDE );
                        ShowWindow( tab2, SW_SHOW );
                    }
                } break;
            }
        } break;
       
    case WM_CLOSE: {
            DestroyWindow( tab1 );
            DestroyWindow( tab2 );
            DestroyWindow( hwnd );
        }; break;
       
        default: { return FALSE; }
    }
   
    return TRUE;
   
}

BOOL CALLBACK WndProc_dMngAll2TAB1( HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam )
{
    switch( Msg )
    {
    case WM_COMMAND:
        {
            /*   tu kiedys beda procedury dla tabu 1
            Narazie nic tu nie ma
            */
        } break;
       
        default: return FALSE;
    }
   
    return TRUE;
}
BOOL CALLBACK WndProc_dMngAll2TAB2( HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam )
{
    switch( Msg )
    {
    case WM_COMMAND:
        {
            /*   tu kiedys beda procedury dla tabu2
            Narazie nic tu nie ma
            */
        } break;
       
        default: return FALSE;
    }
   
    return TRUE;
}

Czy ktos ma jakis pomysl czemu tak sie dzieje?

b
.
P-86439
xevuel
» 2013-06-28 17:35:20
Wstaw sobie MessageBoxy w kluczowych miejscach lub ustaw breakpointy w debuggerze i sprawdzaj, gdzie się zawiesza. Tego nikt za Ciebie nie zrobi...
P-86483
berkov
Temat założony przez niniejszego użytkownika
» 2013-06-28 18:51:45
robilem to! nie zawiesza sie nigdzie teoretycznie.. tak jakby sie zawieszalo gdzies poza procesem okna...
P-86487
DejaVu
» 2013-06-29 21:45:35
Spróbuj wykomentować część poleceń odpowiedzialnych za wysyłanie komunikatów. Sytuacja, którą opisałeś również mi się swego czasu trafiła, gdy chciałem jakiś komunikat wysłać w trakcie WM_PAINT-a czy czegoś podobnego (chyba redraw chciałem dać). Wówczas aplikacja się zawiesi z takimi samymi objawami jak Ty opisujesz swój problem. U Ciebie zapewne jest analogiczna sytuacja ale z innymi komunikatami.
P-86577
« 1 »
  Strona 1 z 1