用TAB控制元件動態添加頁面,在增加了很多頁面情況下,洗掉頁面會導致標簽頁為空,需要手動點擊滾動條才重繪標簽顯示。我的想法是獲取當前顯示的標簽數量為0在代碼讓滾動條滾動。但是不知道這兩個是否有函式整
滑鼠點過去居然有標簽出來
點滾動條就可以正常顯示了






有什么方法可以解決這個顯示問題?
uj5u.com熱心網友回復:
是不是你的Tab控制元件上的子對話框大小太大擋住了Tab標簽?uj5u.com熱心網友回復:
應該不是,我的對話框和自對話框都做了可拉伸,控制元件的位置也正常,應該不是擋住了。滑鼠移到每出現的TAB上點擊,又能出現一個,也只能出現一個,移開點擊另外一個,原來出現的又消失了。。但是點擊滾動條的按鈕,就能刷出來。所以我琢磨著沒有好的解決方法,就獲取當前顯示的標簽數量,在代碼實作點擊滾動條。但是今天往TAB的滾動條發滾動訊息沒效果,獲取滾動條也獲取的都是空。//CScrollBar* tabSc = m_Tab.GetScrollBarCtrl(SB_HORZ); //SB_HORZ SB_VERT SB_CTL SB_BOTH
::SendMessage(m_Tab.m_hWnd, WM_HSCROLL, MAKEWPARAM(SB_PAGELEFT, 0), NULL);
uj5u.com熱心網友回復:
添加完頁面后按Tab控制元件的坐標調整下子頁面位置試試看
CRect rcRect;
m_tab.GetClientRect( &rcRect );
m_tab.AdjustRect(FALSE, &rcRect);
//子頁面的父視窗當前視窗?
if(m_Page.GetParent() && m_Page.GetParent()->m_hWnd == m_hWnd)
{
m_tab.ClientToScreen(&rcRect); //轉換到螢屏坐標
ScreenToClient(&rcRect); //轉到到當前視窗客戶區位置
}
//移動頁面
m_Page.MoveWindow(rcRect);
uj5u.com熱心網友回復:
還是出現了這種現象,這個測驗代碼還沒有加表單拉伸,所以很明顯看出移位了




uj5u.com熱心網友回復:
很明顯看出移位了 說明取的父視窗不對CRect rcRect;
m_tab.GetClientRect( &rcRect );
m_tab.AdjustRect(FALSE, &rcRect);
if(m_Page.GetParent())
{
m_tab.ClientToScreen(&rcRect); //轉換到螢屏坐標
m_Page.GetParent()->ScreenToClient(&rcRect); //轉到到當前視窗客戶區位置
}
//移動頁面
m_Page.MoveWindow(rcRect);
uj5u.com熱心網友回復:
我按你這代碼改了,還是跟上次一樣發生了移位,位移的原因應該是用對子對話框設定的父表單是
pTabPage->Create(nID,GetDlgItem(IDC_TABDB)); //IDC_TABDB是TAB控制元件ID
如果改成主對話框的就沒有位移了,但是問題沒能解決。
鑒于都猜測可能是子對話框擋住了,所以我干脆修改了下代碼,不創建子對話框,只保留TAB標簽,自然就不存在擋住的問題了,但是洗掉TAB標簽還是出現了之前一樣的問題。所以我覺得問題應該是在TAB控制元件本身
uj5u.com熱心網友回復:
鑒于子對話框擋住的可能性,我重新弄了個測驗程式,只包含又兩個按鈕和一個TAB控制元件,沒有子對話框界面。結果還是有這個問題,而且標簽頁消失后點擊標簽頁出現的是排在最前的標簽所在的位置,點擊滾動條后才重繪出正確標簽。所以我覺得應該是TAB控制元件本身問題,或者哪里針對這情況設定。或者有沒有函式可以獲取到TAB自帶的滾動條,代碼實作觸發滾動。


測驗代碼:
void CTABtestDlg::OnBnClickedButtonAdd()
{
// TODO: 在此添加控制元件通知處理程式代碼
int iTabCount = m_Tab.GetItemCount();
char titlebuf[32] = { 0 };
sprintf(titlebuf, "%d PAGE", iTabCount);
m_Tab.InsertItem(iTabCount, titlebuf);
m_Tab.SetCurSel(iTabCount);
}
void CTABtestDlg::OnBnClickedButtonDel()
{
// TODO: 在此添加控制元件通知處理程式代碼
int iRemoveTab = m_Tab.GetCurSel();
m_Tab.DeleteItem(iRemoveTab);
int tabcount = m_Tab.GetItemCount();
if (tabcount == 0)
{
m_Tab.SetCurSel(-1);
}
else if (iRemoveTab == tabcount) //洗掉的是最后一頁
{
m_Tab.SetCurSel(iRemoveTab - 1);
}
else
{
m_Tab.SetCurSel(iRemoveTab);
}
}
uj5u.com熱心網友回復:
你的什么系統? VS什么版本? 我的VS2008 Win7 XP下都沒有例外呢實在不行就自繪好了 自繪CTabCtrl控制元件的實作
uj5u.com熱心網友回復:
win10系統,VS2013,謝謝uj5u.com熱心網友回復:
你提供的自繪只是繪制選項卡的背景和字體等顏色,也是繼承CTabCtrl類,應該解決不了我這個問題,我自己這邊也有重繪這一塊,雖然實作上略有不同,但是原理是一樣的
uj5u.com熱心網友回復:
我剛用VS2005寫了個測驗程式,然后放到WIN7上跑也是有一樣的問題。我的專案直接選的MFC對話框,然后洗掉默認的確認取消按鈕,添加了ADD和DEL按鈕,然后拖了個TAB控制元件,沒做其他設定,代碼就是給TAB控制元件添加了個變數m_Tab,然后就是兩個按鈕的實作void CTABtest2005Dlg::OnBnClickedButtonAdd()
{
// TODO: 在此添加控制元件通知處理程式代碼
int iTabCount = m_Tab.GetItemCount();
char titlebuf[32] = { 0 };
sprintf(titlebuf, "%d PAGE", iTabCount);
m_Tab.InsertItem(iTabCount, titlebuf);
m_Tab.SetCurSel(iTabCount);
}
void CTABtest2005Dlg::OnBnClickedButtonDel()
{
// TODO: 在此添加控制元件通知處理程式代碼
int iRemoveTab = m_Tab.GetCurSel();
m_Tab.DeleteItem(iRemoveTab);
int tabcount = m_Tab.GetItemCount();
if (tabcount == 0)
{
m_Tab.SetCurSel(-1);
}
else if (iRemoveTab == tabcount) //洗掉的是最后一頁
{
m_Tab.SetCurSel(iRemoveTab - 1);
}
else
{
m_Tab.SetCurSel(iRemoveTab);
}
}
測驗程式代碼就完了,開始測驗就是先不斷的點ADD,點了20幾個標簽,然后在點DEL,洗掉完當前顯示的,都出現上面的問題了
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/43697.html
標籤:界面
