带多行的Win32选项卡控件

Win32 Tab Control w/Multiple Rows

本文关键字:选项 控件 Win32      更新时间:2023-10-16

我的Win32应用程序中有一个选项卡控件。控件具有多行功能。当我调整窗口的大小,使选项卡控件的宽度减小时,会显示多行。问题是,当我单击下面一行时,上面一行中的选项卡会被当前选项卡的窗口阻止(选项卡控件没有正确调整当前选项卡的内容窗口的大小,从而使上面一行可见)。我该如何解释这个问题?

这是我调整大小功能的代码:

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 );

此代码来自Microsoft网站。。。

pHdr->hWndTab是选项卡控制的窗口句柄

pHdr->hWndDisplay是当前选项卡内容窗口的窗口句柄

编辑:实际上,在单击下部选项卡后,上部选项卡会移动到控件的顶部。。。但是,它们仍然被内容窗口阻止。。。

我通过调整偏移后的显示矩形来解决问题:

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 );
}