Мерцание в TabControl при изменении размеров!

Тема в разделе "WASM.BEGINNERS", создана пользователем elestrago, 9 мар 2009.

  1. elestrago

    elestrago New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2009
    Сообщения:
    56
    Подскажите пожалуйста как избавится от нее....

    Хотелось бы увидеть какой нибуть код или исходник который решает данную проблему!
    Заранее спасибо! :)
     
  2. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    у родительского окна добавить стиль WS_CLIPCHILDREN...
     
  3. elestrago

    elestrago New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2009
    Сообщения:
    56
    он и так стоит, все равно мерцает
     
  4. perez

    perez Member

    Публикаций:
    0
    Регистрация:
    25 апр 2005
    Сообщения:
    502
    Адрес:
    Moscow city
    Может, сам покажешь код? Не замечал никогда проблем с табконтролом.
     
  5. jaja

    jaja New Member

    Публикаций:
    0
    Регистрация:
    23 июл 2008
    Сообщения:
    243
    BitBlt
     
  6. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Я не слабо провозился с этим моментом на работе. WS_EX_TRANSPARENT не работал - что-то проглядывало из фона - какое-то другое окно с тем же родителем (чего только индусы не наворотят...). Единственное, что получилось - это прямой subclassing хэндла таб контрола и затем перед вызовом "оригинального" кода для WM_ERASEBKGND - вызвать ExcludeClipRect() API с прямоугольником полученным через TCM_ADJUSTRECT. Если время позволит - выложу пример кода.
     
  7. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    а WS_CLIPSIBLINGS не помогает?
     
  8. elestrago

    elestrago New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2009
    Сообщения:
    56
    вот так создаю главное окно
    Код (Text):
    1.     mov     wc.cbSize, sizeof wc
    2.     mov     wc.style,NULL
    3.     mov     wc.lpfnWndProc, offset WndProc
    4.     mov     wc.cbClsExtra, NULL
    5.     mov     wc.cbWndExtra, NULL
    6.     push     hInstance
    7.     pop     wc.hInstance
    8.     mov     wc.hbrBackground, COLOR_BTNFACE+1
    9.     mov     wc.lpszMenuName, offset MenuName
    10.     mov     wc.lpszClassName, offset ProgClass
    11.     INVOKE     LoadIcon, NULL, IDI_APPLICATION
    12.     mov     wc.hIcon, eax
    13.     mov     wc.hIconSm, eax
    14.     INVOKE     LoadCursor, NULL, IDC_ARROW
    15.     mov     wc.hCursor, eax
    16.     INVOKE     RegisterClassEx, addr wc
    17.     INVOKE     CreateWindowEx, WS_EX_WINDOWEDGE, addr ProgClass,\
    18.                  addr AppName, WS_OVERLAPPEDWINDOW or WS_CLIPCHILDREN or WS_CLIPSIBLINGS ,\
    19.                  100, 100, 1152, 687, NULL, NULL, hInstance, NULL
    20.     mov     hWnd, eax
    а так таб котрол
    Код (Text):
    1.         invoke CreateWindowEx,0,OFFSET szClassTabControl,0,WS_CHILD or WS_VISIBLE or 1 or TCS_HOTTRACK or\
    2.                  TCS_FOCUSNEVER,4,27,600,300, hWin,0,hInstance,0
     
  9. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    стиль WS_CLIPSIBLINGS надо табу ставить
     
  10. elestrago

    elestrago New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2009
    Сообщения:
    56
    поставил все равно мерцает все, вот исходник выкладываю

    гляньте
     
  11. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Код (Text):
    1. #include <Windows.h>
    2. #include <WindowsX.h>
    3. #include <CommCtrl.h>
    4.  
    5. // -------------------------------------------------------------------------
    6. #define ASK(h,m,wp,lp)          SendMessage (h, m, (WPARAM) (wp), (LPARAM) (lp))
    7. #define WRECT(r)            ((r).right - (r).left)
    8. #define HRECT(r)            ((r).bottom - (r).top)
    9.  
    10. // -------------------------------------------------------------------------
    11. #define IDC_TAB_CONTROL     2009
    12. #define IDC_LIST_BOX        101
    13. #define IDC_EDIT_BOX        102
    14.  
    15. // -------------------------------------------------------------------------
    16. HWND glb_hFrameWnd;
    17. HWND glb_hTabCtrlWnd;
    18.  
    19. // -------------------------------------------------------------------------
    20. void GetTabClientView (RECT& view)
    21. {
    22.     GetWindowRect (glb_hTabCtrlWnd, &view);
    23.     TabCtrl_AdjustRect (glb_hTabCtrlWnd, FALSE, &view);
    24.     ScreenToClient (glb_hTabCtrlWnd, (POINT*) &view.left);
    25.     ScreenToClient (glb_hTabCtrlWnd, (POINT*) &view.right);
    26. }
    27.  
    28. // -------------------------------------------------------------------------
    29. HWND CreateListBox ()
    30. {
    31.     RECT rcTabContainerRoom;
    32.     GetTabClientView (rcTabContainerRoom);
    33.  
    34.     // list box visible as the first tab
    35.     HWND hList = CreateWindowEx (WS_EX_STATICEDGE, L"listbox", L"",
    36.         LBS_NOTIFY | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_CHILD | WS_VISIBLE,
    37.         rcTabContainerRoom.left,
    38.         rcTabContainerRoom.top,
    39.         WRECT (rcTabContainerRoom),
    40.         HRECT (rcTabContainerRoom),
    41.         glb_hTabCtrlWnd,
    42.         (HMENU) IDC_LIST_BOX,
    43.         GetModuleHandle (NULL), NULL);
    44.  
    45.     ASK (hList, WM_SETFONT,
    46.         GetStockObject (ANSI_VAR_FONT), FALSE);
    47.  
    48.     // Add some list items:
    49.     WCHAR text [32];
    50.     lstrcpy (text, L"List Item #");
    51.  
    52.     PWCHAR pszIndex = text + lstrlen (text);
    53.     for (int i=0; i<64; i++)
    54.     {
    55.         wsprintf (pszIndex, L"%d", i+1);
    56.         ASK (hList, LB_ADDSTRING, 0, text);
    57.     }
    58.     return hList;
    59. }
    60.  
    61. // -------------------------------------------------------------------------
    62. HWND CreateEditBox ()
    63. {
    64.     RECT rcTabContainerRoom;
    65.     GetTabClientView (rcTabContainerRoom);
    66.  
    67.     // edit box is not visible until tab is selected
    68.     HWND hEdit = CreateWindowEx (WS_EX_STATICEDGE, L"edit", L"",
    69.         ES_MULTILINE | ES_WANTRETURN | WS_HSCROLL | WS_VSCROLL |
    70.             ES_AUTOHSCROLL | ES_AUTOVSCROLL | WS_CHILD,
    71.         rcTabContainerRoom.left,
    72.         rcTabContainerRoom.top,
    73.         WRECT (rcTabContainerRoom),
    74.         HRECT (rcTabContainerRoom),
    75.         glb_hTabCtrlWnd,
    76.         (HMENU) IDC_EDIT_BOX,
    77.         GetModuleHandle (NULL), NULL);
    78.  
    79.     ASK (hEdit, WM_SETFONT,
    80.         GetStockObject (ANSI_FIXED_FONT), FALSE);
    81.  
    82.     // Add some fancy text into it
    83.     PWCHAR pszText = new WCHAR [4096];
    84.     PWCHAR pszStorage = pszText;
    85.     for (int iLine = 0; iLine < 26; iLine++)
    86.     {
    87.         int nBlanks = (iLine < 13) ? iLine : (26-iLine);
    88.         while (nBlanks--) *pszStorage++ = L' ';
    89.  
    90.         WCHAR ch = L'A' + (WCHAR) iLine;
    91.         int nChars = 16;
    92.         while (nChars--) *pszStorage++ = ch;
    93.  
    94.         *pszStorage++ = L'\r';
    95.         *pszStorage++ = L'\n';
    96.     }
    97.  
    98.     *pszStorage = 0;
    99.     SetWindowText (hEdit, pszText);
    100.     delete [] pszText;
    101.  
    102.     return hEdit;
    103. }
    104.  
    105. // -------------------------------------------------------------------------
    106. void CreateTabs (HWND hFrame)
    107. {
    108.     RECT rcClient;
    109.     GetClientRect (hFrame, &rcClient);
    110.  
    111.     glb_hTabCtrlWnd = CreateWindowEx (
    112.         WS_EX_STATICEDGE, WC_TABCONTROL,
    113.         L"", WS_CHILD | WS_VISIBLE | TCS_FOCUSNEVER | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
    114.         0, 0, rcClient.right, rcClient.bottom, // Fit tab control exactly into frame client area
    115.         hFrame, (HMENU) IDC_TAB_CONTROL, GetModuleHandle (NULL), NULL);
    116.  
    117.     ASK (glb_hTabCtrlWnd, WM_SETFONT,
    118.         GetStockObject (ANSI_VAR_FONT), FALSE);
    119.  
    120.     TCITEM tabItem = {0};
    121.  
    122.     // dummy item needed for proper rectangle calculation (see GetTabClientView)
    123.     tabItem.mask = TCIF_TEXT;
    124.     tabItem.pszText = L"Dummy";
    125.     TabCtrl_InsertItem (glb_hTabCtrlWnd, 0, &tabItem);
    126.  
    127.     tabItem.pszText = L"List Box";
    128.     tabItem.mask |= TCIF_PARAM;
    129.     tabItem.lParam = (LPARAM) CreateListBox ();
    130.     TabCtrl_InsertItem (glb_hTabCtrlWnd, 1, &tabItem);
    131.  
    132.     tabItem.pszText = L"Edit Box";
    133.     tabItem.lParam = (LPARAM) CreateEditBox ();
    134.     TabCtrl_InsertItem (glb_hTabCtrlWnd, 2, &tabItem);
    135.  
    136.     // Remove dummy item
    137.     TabCtrl_DeleteItem (glb_hTabCtrlWnd, 0);
    138.  
    139.     // Select the first tab, because the selected tab is the one which was added last
    140.     TabCtrl_SetCurSel (glb_hTabCtrlWnd, 0);
    141. }
    142.  
    143. // -------------------------------------------------------------------------
    144. HWND GetActiveControlInsideTab ()
    145. {
    146.     if (! glb_hTabCtrlWnd) return NULL;
    147.     int iSelectedTab = TabCtrl_GetCurSel (glb_hTabCtrlWnd);
    148.     if (iSelectedTab < 0) return NULL;
    149.  
    150.     TCITEM tabItem = {0};
    151.     tabItem.mask = TCIF_PARAM;
    152.     TabCtrl_GetItem (glb_hTabCtrlWnd, iSelectedTab, &tabItem);
    153.     return (HWND) tabItem.lParam;
    154. }
    155.  
    156. // -------------------------------------------------------------------------
    157. void ResizeActiveControl ()
    158. {
    159.     HWND hActiveControl  = GetActiveControlInsideTab ();
    160.     RECT rcTabContainerRoom;
    161.  
    162.     GetTabClientView (rcTabContainerRoom);
    163.  
    164.     MoveWindow (hActiveControl,
    165.         rcTabContainerRoom.left, rcTabContainerRoom.top,
    166.         WRECT (rcTabContainerRoom), HRECT (rcTabContainerRoom),
    167.         TRUE);
    168. }
    169.  
    170. // -------------------------------------------------------------------------
    171. void OnWmNotify (NMHDR* pInfo)
    172. {
    173.     if (pInfo -> idFrom != IDC_TAB_CONTROL) return;
    174.  
    175.     switch (pInfo -> code)
    176.     {
    177.         case TCN_SELCHANGING:
    178.             // Coming off the tab - hide the control within this tab
    179.             ShowWindow (GetActiveControlInsideTab (), SW_HIDE);
    180.             break;
    181.  
    182.         case TCN_SELCHANGE:
    183.             // Came to new tab - show and resize the active control within this tab
    184.             ShowWindow (GetActiveControlInsideTab (), SW_SHOW);
    185.             ResizeActiveControl ();
    186.             break;
    187.     }
    188. }
    189.  
    190. // -------------------------------------------------------------------------
    191. LRESULT CALLBACK MainWndProc (HWND hWnd, UINT uiMsg, WPARAM wp, LPARAM lp)
    192. {
    193.     switch (uiMsg)
    194.     {
    195.         case WM_CREATE:
    196.             CreateTabs (glb_hFrameWnd = hWnd);
    197.             break;
    198.  
    199.         case WM_SIZE:
    200.             if ((wp != SIZE_MINIMIZED) && lp && glb_hTabCtrlWnd)
    201.             {
    202.                 MoveWindow (glb_hTabCtrlWnd,
    203.                     0, 0, GET_X_LPARAM (lp), GET_Y_LPARAM (lp), TRUE);
    204.  
    205.                 ResizeActiveControl ();
    206.             }
    207.             break;
    208.  
    209.         case WM_NOTIFY:
    210.             OnWmNotify ((NMHDR*) lp);
    211.             break;
    212.  
    213.         case WM_DESTROY:
    214.             PostQuitMessage (0);
    215.             break;
    216.  
    217.         default:
    218.             return DefWindowProc (hWnd, uiMsg, wp, lp);
    219.     }
    220.     return 0;
    221. }
    222.  
    223. // -------------------------------------------------------------------------
    224. int WINAPI WinMain (HINSTANCE hModule, HINSTANCE, LPSTR, int nShow)
    225. {
    226.     INITCOMMONCONTROLSEX icc;
    227.     icc.dwSize = sizeof (icc);
    228.     icc.dwICC = ICC_TAB_CLASSES;
    229.     InitCommonControlsEx (&icc);
    230.  
    231.     WNDCLASS wc = {0};
    232.     wc.hCursor = LoadCursor (NULL, IDC_ARROW);
    233.     wc.hIcon = LoadIcon (NULL, IDI_EXCLAMATION);
    234.     wc.hInstance = hModule;
    235.     wc.lpfnWndProc = MainWndProc;
    236.     wc.lpszClassName = L"Win32TabCtrlSample";
    237.     wc.style = CS_VREDRAW | CS_HREDRAW;
    238.     RegisterClass (&wc);
    239.  
    240.     HWND hFrame = CreateWindowEx (WS_EX_APPWINDOW, wc.lpszClassName,
    241.         L"Win32 API Tab Control Sample", WS_OVERLAPPEDWINDOW,
    242.         CW_USEDEFAULT, CW_USEDEFAULT,
    243.         CW_USEDEFAULT, CW_USEDEFAULT,
    244.         NULL, NULL, hModule, NULL);
    245.  
    246.     ShowWindow (hFrame, nShow);
    247.     UpdateWindow (hFrame);
    248.  
    249.     MSG message;
    250.     while (GetMessage (&message, NULL, 0, 0))
    251.     {
    252.         TranslateMessage (&message);
    253.         DispatchMessage (&message);
    254.     }
    255.     return 0;
    256. }
     
  12. G13

    G13 New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2006
    Сообщения:
    499
  13. elestrago

    elestrago New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2009
    Сообщения:
    56
    Спасибо, буду пробовать!!

    Я был уже там, пробовал сделать как там написано но не получилось!
     
  14. G13

    G13 New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2006
    Сообщения:
    499
    Плохо пробовали. Ищите десять отличий.
     
  15. elestrago

    elestrago New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2009
    Сообщения:
    56
    G13 благодарю! :)