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: 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" { }
mngall.cpp 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: { 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: { } break; default: return FALSE; } return TRUE; } BOOL CALLBACK WndProc_dMngAll2TAB2( HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam ) { switch( Msg ) { case WM_COMMAND: { } break; default: return FALSE; } return TRUE; }
Czy ktos ma jakis pomysl czemu tak sie dzieje? b . |