Tab-Control zeigt Dialoge nicht an
-
hallo,
ich habe ein dialogbasiertes tool in dem tab-controls verwendet werden sollen.
bevor jetzt gleich der link zu winapi.net gepostet wird. von dort habe ich den code in mein programm integriert. (btw.: hab das beispielprojekt genommen und selber darin einen weiteren reiter integriert. hat ohne problem funktioniert)
wahrscheinlich hab ich nur etwas übersehen. aber ich finde es beim besten willen nicht. vielleicht findet es ja einer von euch?BOOL Dialog::CustomDlgProc(UINT uMsg, WPARAM wParam, LPARAM lParam) { TCITEM item; HWND* phDlg; HWND hWndTemp; RECT rc; int nCurSel; //message handling switch (uMsg) { ... case WM_INITDIALOG: //right now, no initializations /////////////////////////////////////////////////////// // TabCtrl initialisieren hWndTemp = GetDlgItem(m_hwnd, IDC_TAB1); ZeroMemory(&item, sizeof(item)); item.mask = TCIF_TEXT; // Tab Title item.pszText = TEXT("Drive"); TabCtrl_InsertItem(hWndTemp, 0, &item); item.pszText = TEXT("Directory"); TabCtrl_InsertItem(hWndTemp, 1, &item); // Dialoge, die im TabCtrl erscheienen sollen, erzeugen phDlg = new HWND[5]; phDlg[0] = CreateDialog((HINSTANCE)lParam, MAKEINTRESOURCE(IDD_DIALOG_DRIVE), m_hwnd, DlgProc1); phDlg[1] = CreateDialog((HINSTANCE)lParam, MAKEINTRESOURCE(IDD_DIALOG_DIR), m_hwnd, DlgProc2); BringWindowToTop(phDlg[1]); BringWindowToTop(phDlg[0]); // safe child handles SetWindowLongPtr(m_hwnd, DWLP_USER, (LONG_PTR)phDlg); // fit size to main dialog GetWindowRect(hWndTemp, &rc); ScreenToClient(m_hwnd, (LPPOINT)&rc.left); ScreenToClient(m_hwnd, (LPPOINT)&rc.right); SendMessage(hWndTemp, TCM_ADJUSTRECT, (WPARAM)FALSE, (LPARAM)&rc); MoveWindow(phDlg[0], rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, TRUE); MoveWindow(phDlg[1], rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, TRUE); /////////////////////////////////////////////////////// ... return TRUE; ... case WM_NOTIFY: switch(((LPNMHDR)lParam)->code){ case TCN_SELCHANGING: // Diese Notification wird gesendet, *bevor* das TabCtrl // die Auswahl aendert. Das ist ein guter Zeitpunkt, um // den zurzeit angezeigten Dialog zu verstecken phDlg = (HWND*)GetWindowLongPtr(m_hwnd, DWLP_USER); nCurSel = TabCtrl_GetCurSel(((LPNMHDR)lParam)->hwndFrom); if((nCurSel >= 0) && (nCurSel <= 1)) ShowWindow(phDlg[nCurSel], SW_HIDE); SetWindowLongPtr(m_hwnd, DWLP_MSGRESULT, (LONG_PTR)FALSE); return(TRUE); 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(m_hwnd, DWLP_USER); nCurSel = TabCtrl_GetCurSel(((LPNMHDR)lParam)->hwndFrom); if((nCurSel >= 0) && (nCurSel <= 1)) ShowWindow(phDlg[nCurSel], SW_SHOW); return(TRUE); default: break; } break; ... case WM_NCDESTROY: // delete allocated phDlg = (HWND*)GetWindowLongPtr(m_hwnd, DWLP_USER); delete [] phDlg; break; default: break;Dialogprozeduren im Rohzustand vorhanden:
INT_PTR CALLBACK DlgProc1(HWND, UINT uMsg, WPARAM, LPARAM) { switch(uMsg) { case WM_INITDIALOG: return(TRUE); default: break; } return(FALSE); } INT_PTR CALLBACK DlgProc2(HWND, UINT uMsg, WPARAM, LPARAM) { switch(uMsg) { case WM_INITDIALOG: return(TRUE); default: break; } return(FALSE); }INITCOMMONCONTROLSEX iccex; iccex.dwSize = sizeof(iccex); iccex.dwICC = ICC_TAB_CLASSES; InitCommonControlsEx(&iccex);.... wird nicht wirklich gebraucht, oder? jedenfalls funktioniert das winapi-beispiel auch ohne.
WS_CHILD und WS_EX_CONTROLPARENT sind äquivalent zu beispiel gesetzt.
Das Problem ist, dass die funktion CreateDialog ein 0 (ungültiges Handle) zurückliefert. Warum? GetLastError() gibt mir 1812 zurück ("The specified resource type cannot be found in the image file.") Die Dialoge sind aber in dem RC-File vorhanden.
arbeite mit MSVC 2005 (falls das weiterhilft)
danke im voraus
Robert
-
Hat denn keiner eine Idee? Ich habe die Dialoge auch schon mehrmals neu erstellt. Es kommt immer wieder der gleiche Fehler. Ich bin am verzweifeln.
-
probiere mal in den creates statt
(HINSTANCE)lParam
einfach 0 zu uebergeben
-
Dein Vorschlag in allen Ehren, aber er hilft leider auch nicht weiter. Jetzt bekomme ich den Fehler 1813 "The specified resource type cannot be found in the image file".
Ich versteh nicht warum er die Resource nicht findet. Sie ist im RC-File vorhanden.

also tool ist dialogbasiert und ich verwende Klassen <- liegt da vielleicht das Problem (vielleicht habe ich einen Denkfehler ?!?)? kompiliert wird jedenfalls ohne Probleme.
Robert
-
ok danke erstmal für den Hinweis, dass es am Handle liegen kann. Ich hab mal gegoogelt und auch ein ähnliches Problem gefunden wo auf das Handle hingewiesen wurde.
Naja lange Rede kurzer Sinn -> m_hInstance und es funktioniert *aufn kopf klatsch*
... ein gutes hat es ... das passiert mir nicht wieder
