Подскажите пожалуйста как избавится от нее.... Хотелось бы увидеть какой нибуть код или исходник который решает данную проблему! Заранее спасибо!
Я не слабо провозился с этим моментом на работе. WS_EX_TRANSPARENT не работал - что-то проглядывало из фона - какое-то другое окно с тем же родителем (чего только индусы не наворотят...). Единственное, что получилось - это прямой subclassing хэндла таб контрола и затем перед вызовом "оригинального" кода для WM_ERASEBKGND - вызвать ExcludeClipRect() API с прямоугольником полученным через TCM_ADJUSTRECT. Если время позволит - выложу пример кода.
вот так создаю главное окно Код (Text): mov wc.cbSize, sizeof wc mov wc.style,NULL mov wc.lpfnWndProc, offset WndProc mov wc.cbClsExtra, NULL mov wc.cbWndExtra, NULL push hInstance pop wc.hInstance mov wc.hbrBackground, COLOR_BTNFACE+1 mov wc.lpszMenuName, offset MenuName mov wc.lpszClassName, offset ProgClass INVOKE LoadIcon, NULL, IDI_APPLICATION mov wc.hIcon, eax mov wc.hIconSm, eax INVOKE LoadCursor, NULL, IDC_ARROW mov wc.hCursor, eax INVOKE RegisterClassEx, addr wc INVOKE CreateWindowEx, WS_EX_WINDOWEDGE, addr ProgClass,\ addr AppName, WS_OVERLAPPEDWINDOW or WS_CLIPCHILDREN or WS_CLIPSIBLINGS ,\ 100, 100, 1152, 687, NULL, NULL, hInstance, NULL mov hWnd, eax а так таб котрол Код (Text): invoke CreateWindowEx,0,OFFSET szClassTabControl,0,WS_CHILD or WS_VISIBLE or 1 or TCS_HOTTRACK or\ TCS_FOCUSNEVER,4,27,600,300, hWin,0,hInstance,0
Код (Text): #include <Windows.h> #include <WindowsX.h> #include <CommCtrl.h> // ------------------------------------------------------------------------- #define ASK(h,m,wp,lp) SendMessage (h, m, (WPARAM) (wp), (LPARAM) (lp)) #define WRECT(r) ((r).right - (r).left) #define HRECT(r) ((r).bottom - (r).top) // ------------------------------------------------------------------------- #define IDC_TAB_CONTROL 2009 #define IDC_LIST_BOX 101 #define IDC_EDIT_BOX 102 // ------------------------------------------------------------------------- HWND glb_hFrameWnd; HWND glb_hTabCtrlWnd; // ------------------------------------------------------------------------- void GetTabClientView (RECT& view) { GetWindowRect (glb_hTabCtrlWnd, &view); TabCtrl_AdjustRect (glb_hTabCtrlWnd, FALSE, &view); ScreenToClient (glb_hTabCtrlWnd, (POINT*) &view.left); ScreenToClient (glb_hTabCtrlWnd, (POINT*) &view.right); } // ------------------------------------------------------------------------- HWND CreateListBox () { RECT rcTabContainerRoom; GetTabClientView (rcTabContainerRoom); // list box visible as the first tab HWND hList = CreateWindowEx (WS_EX_STATICEDGE, L"listbox", L"", LBS_NOTIFY | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_CHILD | WS_VISIBLE, rcTabContainerRoom.left, rcTabContainerRoom.top, WRECT (rcTabContainerRoom), HRECT (rcTabContainerRoom), glb_hTabCtrlWnd, (HMENU) IDC_LIST_BOX, GetModuleHandle (NULL), NULL); ASK (hList, WM_SETFONT, GetStockObject (ANSI_VAR_FONT), FALSE); // Add some list items: WCHAR text [32]; lstrcpy (text, L"List Item #"); PWCHAR pszIndex = text + lstrlen (text); for (int i=0; i<64; i++) { wsprintf (pszIndex, L"%d", i+1); ASK (hList, LB_ADDSTRING, 0, text); } return hList; } // ------------------------------------------------------------------------- HWND CreateEditBox () { RECT rcTabContainerRoom; GetTabClientView (rcTabContainerRoom); // edit box is not visible until tab is selected HWND hEdit = CreateWindowEx (WS_EX_STATICEDGE, L"edit", L"", ES_MULTILINE | ES_WANTRETURN | WS_HSCROLL | WS_VSCROLL | ES_AUTOHSCROLL | ES_AUTOVSCROLL | WS_CHILD, rcTabContainerRoom.left, rcTabContainerRoom.top, WRECT (rcTabContainerRoom), HRECT (rcTabContainerRoom), glb_hTabCtrlWnd, (HMENU) IDC_EDIT_BOX, GetModuleHandle (NULL), NULL); ASK (hEdit, WM_SETFONT, GetStockObject (ANSI_FIXED_FONT), FALSE); // Add some fancy text into it PWCHAR pszText = new WCHAR [4096]; PWCHAR pszStorage = pszText; for (int iLine = 0; iLine < 26; iLine++) { int nBlanks = (iLine < 13) ? iLine : (26-iLine); while (nBlanks--) *pszStorage++ = L' '; WCHAR ch = L'A' + (WCHAR) iLine; int nChars = 16; while (nChars--) *pszStorage++ = ch; *pszStorage++ = L'\r'; *pszStorage++ = L'\n'; } *pszStorage = 0; SetWindowText (hEdit, pszText); delete [] pszText; return hEdit; } // ------------------------------------------------------------------------- void CreateTabs (HWND hFrame) { RECT rcClient; GetClientRect (hFrame, &rcClient); glb_hTabCtrlWnd = CreateWindowEx ( WS_EX_STATICEDGE, WC_TABCONTROL, L"", WS_CHILD | WS_VISIBLE | TCS_FOCUSNEVER | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, 0, 0, rcClient.right, rcClient.bottom, // Fit tab control exactly into frame client area hFrame, (HMENU) IDC_TAB_CONTROL, GetModuleHandle (NULL), NULL); ASK (glb_hTabCtrlWnd, WM_SETFONT, GetStockObject (ANSI_VAR_FONT), FALSE); TCITEM tabItem = {0}; // dummy item needed for proper rectangle calculation (see GetTabClientView) tabItem.mask = TCIF_TEXT; tabItem.pszText = L"Dummy"; TabCtrl_InsertItem (glb_hTabCtrlWnd, 0, &tabItem); tabItem.pszText = L"List Box"; tabItem.mask |= TCIF_PARAM; tabItem.lParam = (LPARAM) CreateListBox (); TabCtrl_InsertItem (glb_hTabCtrlWnd, 1, &tabItem); tabItem.pszText = L"Edit Box"; tabItem.lParam = (LPARAM) CreateEditBox (); TabCtrl_InsertItem (glb_hTabCtrlWnd, 2, &tabItem); // Remove dummy item TabCtrl_DeleteItem (glb_hTabCtrlWnd, 0); // Select the first tab, because the selected tab is the one which was added last TabCtrl_SetCurSel (glb_hTabCtrlWnd, 0); } // ------------------------------------------------------------------------- HWND GetActiveControlInsideTab () { if (! glb_hTabCtrlWnd) return NULL; int iSelectedTab = TabCtrl_GetCurSel (glb_hTabCtrlWnd); if (iSelectedTab < 0) return NULL; TCITEM tabItem = {0}; tabItem.mask = TCIF_PARAM; TabCtrl_GetItem (glb_hTabCtrlWnd, iSelectedTab, &tabItem); return (HWND) tabItem.lParam; } // ------------------------------------------------------------------------- void ResizeActiveControl () { HWND hActiveControl = GetActiveControlInsideTab (); RECT rcTabContainerRoom; GetTabClientView (rcTabContainerRoom); MoveWindow (hActiveControl, rcTabContainerRoom.left, rcTabContainerRoom.top, WRECT (rcTabContainerRoom), HRECT (rcTabContainerRoom), TRUE); } // ------------------------------------------------------------------------- void OnWmNotify (NMHDR* pInfo) { if (pInfo -> idFrom != IDC_TAB_CONTROL) return; switch (pInfo -> code) { case TCN_SELCHANGING: // Coming off the tab - hide the control within this tab ShowWindow (GetActiveControlInsideTab (), SW_HIDE); break; case TCN_SELCHANGE: // Came to new tab - show and resize the active control within this tab ShowWindow (GetActiveControlInsideTab (), SW_SHOW); ResizeActiveControl (); break; } } // ------------------------------------------------------------------------- LRESULT CALLBACK MainWndProc (HWND hWnd, UINT uiMsg, WPARAM wp, LPARAM lp) { switch (uiMsg) { case WM_CREATE: CreateTabs (glb_hFrameWnd = hWnd); break; case WM_SIZE: if ((wp != SIZE_MINIMIZED) && lp && glb_hTabCtrlWnd) { MoveWindow (glb_hTabCtrlWnd, 0, 0, GET_X_LPARAM (lp), GET_Y_LPARAM (lp), TRUE); ResizeActiveControl (); } break; case WM_NOTIFY: OnWmNotify ((NMHDR*) lp); break; case WM_DESTROY: PostQuitMessage (0); break; default: return DefWindowProc (hWnd, uiMsg, wp, lp); } return 0; } // ------------------------------------------------------------------------- int WINAPI WinMain (HINSTANCE hModule, HINSTANCE, LPSTR, int nShow) { INITCOMMONCONTROLSEX icc; icc.dwSize = sizeof (icc); icc.dwICC = ICC_TAB_CLASSES; InitCommonControlsEx (&icc); WNDCLASS wc = {0}; wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hIcon = LoadIcon (NULL, IDI_EXCLAMATION); wc.hInstance = hModule; wc.lpfnWndProc = MainWndProc; wc.lpszClassName = L"Win32TabCtrlSample"; wc.style = CS_VREDRAW | CS_HREDRAW; RegisterClass (&wc); HWND hFrame = CreateWindowEx (WS_EX_APPWINDOW, wc.lpszClassName, L"Win32 API Tab Control Sample", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hModule, NULL); ShowWindow (hFrame, nShow); UpdateWindow (hFrame); MSG message; while (GetMessage (&message, NULL, 0, 0)) { TranslateMessage (&message); DispatchMessage (&message); } return 0; }