C++ 带多行的Win32选项卡控件
我的Win32应用程序中有一个选项卡控件。该控件具有多行功能。当我调整窗口的大小以减小选项卡控件的宽度时,会显示多行。问题是,当我单击下面一行时,上面一行中的选项卡被当前选项卡的窗口阻止(选项卡控件没有正确调整当前选项卡的内容窗口大小,以便上面几行可见)。我如何解释这个问题 下面是我的调整大小功能的代码:C++ 带多行的Win32选项卡控件,c++,winapi,tabs,C++,Winapi,Tabs,我的Win32应用程序中有一个选项卡控件。该控件具有多行功能。当我调整窗口的大小以减小选项卡控件的宽度时,会显示多行。问题是,当我单击下面一行时,上面一行中的选项卡被当前选项卡的窗口阻止(选项卡控件没有正确调整当前选项卡的内容窗口大小,以便上面几行可见)。我如何解释这个问题 下面是我的调整大小功能的代码: RECT cr; GetClientRect( pHdr->hWndTab, &cr ); TabCtrl_AdjustRect( pHdr->hWndTa
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->hwndisplay是当前选项卡内容窗口的窗口句柄
编辑:实际上,单击下部选项卡后,上部选项卡移动到控件顶部…但是,它们仍然被内容窗口阻止…我通过在偏移后调整显示矩形修复了此问题:
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 );
}
TCM\u ADJUSTRECT
肯定会考虑多行选项卡。你能发布一个屏幕截图来说明你看到的实际问题吗?@JonathanPotter你是对的AdjustRect工作问题是随后出现的OffsetRect()函数…我不能发布屏幕截图,但在AdjustRect()之后,rect是正确的…它将rect的“顶部”向下移动22个单位…然后OffsetRect()将“顶部”向上移动20个单位(2-22=-20)…调整选项卡控件窗口大小的正确方法是什么?你为什么要做OffsetRect
?TCM\u ADJUSTRECT返回的坐标应该就是你所需要的。@JonathanPotter我使用的是[Microsoft]的代码()这显示了如何在选项卡选择更改期间调整内容窗口的大小…我在偏移后使用AdjustRect()修复了该问题…请参见下文