2013-12-13 97 views
0

我在我的Win32應用程序中有一個選項卡控件。該控件具有多行功能。當我調整窗口的大小,使得選項卡控件的寬度縮小時,出現多行。問題是,當我點擊其中一個較低的行時,上一行中的選項卡被當前選項卡的窗口阻止(選項卡控件沒有正確調整當前選項卡的內容窗口的大小,以便上面的行可見) 。我如何解決這個問題?Win32選項卡控件w /多行

這裏是我的調整大小功能代碼:

RECT cr; 
    GetClientRect(pHdr->hWndTab, &cr); 
    TabCtrl_AdjustRect(pHdr->hWndTab, FALSE, &cr); 
    OffsetRect(&cr, cxMargin - cr.left, cyMargin - cr.top); 
    SetWindowPos(pHdr->hWndDisplay, 0, cr.left, cr.top, cr.right, cr.bottom, SWP_SHOWWINDOW); 

代碼來自微軟網站...

pHdr-> hWndTab是選項卡控件的窗口句柄

pHdr- > hWndDisplay是當前選項卡的內容窗口的窗口句柄

編輯:其實,在單擊較低的選項卡後,較高的選項卡移動到控件的頂部1 ...然而,它們仍然阻止的內容窗口...

+2

'TCM_ADJUSTRECT'絕對需要多行標籤考慮。你能張貼截圖來說明你看到的實際問題嗎? –

+0

@JonathanPotter你是對的AdjustRect的作品問題是之後出現的OffsetRect()函數......我無法發佈截圖,但在AdjustRect()之後,矩形是正確的......它移動了「頂部」減少22個單位...然後OffsetRect()將'頂部'向上移動20個單位(2 - 22 = -20)...調整選項卡控制窗口大小的正確方法是什麼? –

+0

那你爲什麼要做'OffsetRect'呢? 'TCM_ADJUSTRECT'返回的座標應該是你需要的。 –

回答

0

我通過偏移後調整顯示矩形固定的問題:

typedef struct tag_dlghdr 
{ 
    HWND hWndTab; 
    HWND hWndDisplay; 
    RECT rcDisplay; 
    DLGTEMPLATE *apRes[ MAX_PAGES ]; 
    DLGPROC  MsgProc[ MAX_PAGES ]; 
}DLGHDR 

Resize(HWND hWndDlg) 
{  
    DLGHDR *pHdr = (DLGHDR *)GetWindowLong(hWndDlg, GWL_USERDATA); 

    DWORD dwDlgBase = GetDialogBaseUnits(); 
    int cxMargin = LOWORD(dwDlgBase)/4; 
    int cyMargin = HIWORD(dwDlgBase)/8; 
    m_niCurTabSel = TabCtrl_GetCurSel(pHdr->hWndTab); 

    RECT cr; 
    GetClientRect(pHdr->hWndTab, &cr); 
    TabCtrl_AdjustRect(pHdr->hWndTab, FALSE, &cr); 
    OffsetRect(&cr, cxMargin - cr.left, cyMargin - cr.top); 
    CopyRect(&pHdr->rcDisplay, &cr); 
    TabCtrl_AdjustRect(pHdr->hWndTab, FALSE, &pHdr->rcDisplay); 
    SetWindowPos(pHdr->hWndDisplay, 0, pHdr->rcDisplay.left, pHdr->rcDisplay.top, pHdr->rcDisplay.right, pHdr->rcDisplay.bottom, SWP_SHOWWINDOW); 

}