Tab Control
-
Aus der MSDN werd ich grad ueberhaupt nicht schlau
ich hab mit dieser ein Tab mit 8 reitern gebastelt - nu moechte / muss ich selbstverstaendlich die tabs auch einzelnd fuellen
wie mach ich das ?
in der MSDN wird mit SendMessage gearbeitet - das leuchtet ein, aber wie bekomm ich die handles der einzelnen tabs ?
-
ich les staendig das ich dialoge einbinden muss, aber das muesste doch auch ohne zusaetzliche dialoge gehen - ich moechte in jedem reiter direkt rein zeichnen, keine buttons oder solche elemente, nur zeichnen {LineTo usw}
ich bekomm zwar die nummer des aktiven reiters, aber das bringt mir ja nix /=
-
so langsam werd ich sauer
LRESULT CMyApp::Messages(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId = LOWORD(wParam); int wmEvent = HIWORD(wParam); this->hWnd = hWnd; switch(message) { case WM_NOTIFY: switch(wmEvent){ case TCN_SELCHANGE: int iPage = TabCtrl_GetCurSel(m_TabCtrl); OnTabPaint(iPage+1); break; } . . .wieso ist wmEvent IMMER 0 wenn ich die tabs wechsel, ich komm nie nach TCN_SELCHANGE rein #grr
-
-
die seite kenn ich schon laengst auswendig
das problem ist
1. ich bekomm keine message das ein tab gewechselt wurde, es wird zwar ein WM_NOTIFY gesendet aber sonst nichts
2. ich moechte so in die tabs zeichnen, ohne die bloeden dialogen}=
-
soweit ich mich erinnern kann geht das nicht anders als dialoge zu zeichnen
-
Du musst das natürlich nicht über Dialoge machen, ist aber wohl am einfachsten bzw. am wenigsten umständlich
abgesehen davon aendert das aber nichts daran das ich keine message bekomm das ein tab gewechsel wurde /=
-
Muss ich wohl ueberlesen haben
weis da acuh net weiter ich machs immer mit dialogen
-
wenn ich das mit dialogen machen wollte - woher soll ich wissen welches dialog gezeigt werden soll wenn ich nie TCN_SELCHANGE bekomm ?
-
hoffe hab s net falsch verstanden?
phDlg = new HWND[2]; phDlg[0] = CreateDialog(((LPCREATESTRUCT)lParam)->hInstance, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, DlgProc1); phDlg[1] = CreateDialog(((LPCREATESTRUCT)lParam)->hInstance, MAKEINTRESOURCE(IDD_DIALOG2), hWnd, DlgProc2);case TCN_SELCHANGE: // Diese Notification wird gesendet, *nachdem* das TabCtrl // die Auswahl geaendert hat. Dies ist ein guter Zeitpunkt, // um den zur Auswahl passenden Dialog anzuzeigen phDlg = (HWND*)GetWindowLongPtr(hWnd, GWLP_USERDATA); nCurSel = TabCtrl_GetCurSel(((LPNMHDR)lParam)->hwndFrom); if(0 == nCurSel) ShowWindow(phDlg[0], SW_SHOW); else if(1 == nCurSel) ShowWindow(phDlg[1], SW_SHOW);
-
ja hast du
du fuehrst aktionen in
case TCN_SELCHANGE:
aus, nur
ich bekomm die message TCN_SELCHANGE nie
wird bei mir nie ausgefuehrt
-
warum switch (wmEvent)
und nicht switch(((LPNMHDR)lParam)->code)
-
weil das nichts aendert
switch(((LPNMHDR)lParam)->code)ist ebenfalls 0
/=
selbst wenn ich das tab control in spy++ reinzieh und das tab wechsel, zeigt spy++ keine message - und im hauptfenster immer nur das WM_NOTIFY, das param ist immer 0
-
Schwieriger Kunde kannst du den rest von deinen code zeigen
-
japs, ich find das auch sehr merkwuerdig
die messages fliegen alle ungefiltert in diese methode
LRESULT CMyApp::Messages(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId = LOWORD(wParam); int wmEvent = HIWORD(wParam); this->hWnd = hWnd; switch(message) { case WM_NOTIFY: switch(wmEvent){ case TCN_SELCHANGING: case TCN_SELCHANGE: int iPage = TabCtrl_GetCurSel(m_TabCtrl); OnTabPaint(iPage+1); break; } break; case WM_CREATE: OnCreate(); break; case WM_SIZE: OnSize(); break; case WM_PAINT: OnPaint(); break; case WM_DESTROY: OnDestroy(); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }das TCN_SELCHANGING hab ich zu testzwecken dazu gepackt, da komm ich auch nie hin
-
Benutzt du ne seperate Classe fuer dein TabCtrls
-
ne, habs aber grad rausgefunden
ich hab immer wParam verwendet da ich das dachte ueberall gelesen zu haben, das von dir hatte ich probiert, aber versehentlich auch mit wParam
nu gehts
dank
-
ok
:xmas1: