線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3145
推到 Plurk!
推到 Facebook!

PageControl - DrawTab 程序與TabSheet -TabVisible 屬性問題

答題得分者是:Zard
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-12-04 22:09:23 IP:218.20.xxx.xxx 未訂閱
我在使用 PageControl 元件時,將 OwnerDraw 屬性設為 true,以便啟用 DrawTab 程序來處理 TabSheet 的標題字樣,原本一切都正常,後來為了操作上的需要,我增加了動態將某些 TabSheet 的 TabSivible 屬性設為 false 的動作,以便隱藏指定的 TabSheet,這下子問題就出現了,由 DrawTab 程序中繪製的 TabSheet 標題,竟然會包含隱藏的標題在內,結果當然就亂成一團了,我以簡要範例說明如下:
  1. 使用環境為 Windows 2000 Pro 中文版 + BCB4。
  2. 在 PageControl1 上建立了 TabSheet1, TabSheet2, TabSheet3 三個 TabSheet 元件,Caption 分別設為 AA, BB, CC。
  3. PageControl1 的 OwnerDraw 屬性設為 true,OnDrawTab 程序如下:
    
    void __fastcall TForm1::PageControl1DrawTab(TCustomTabControl *Control,
          int TabIndex, const TRect &Rect, bool Active)
    {
            if(Active){
                    Control->Canvas->Font->Color = clRed;
            }else{
                    Control->Canvas->Font->Color = clBlue;
            }            AnsiString str = ((TPageControl*)Control)->Pages[TabIndex]->Caption;
            TSize text = Control->Canvas->TextExtent(str);            Control->Canvas->FillRect(Rect);            int x = ((Rect.Right - Rect.Left) - text.cx) / 2;
            int y = (((Rect.Bottom - Rect.Top) - text.cy) / 2)   1;
            TRect tmpRect=Rect;
            if(Active){
                    OffsetRect(&tmpRect, 1, 1);
            }
            Control->Canvas->TextOut(tmpRect.Left   x, tmpRect.Top   y, str);
    }
  4. 以上程序運作均正常,接著將 TabSheet1 的 TabVisible 屬性設為 false,此時執行出來的結果就亂套了,因為 TabSheet1 被設為不顯示,所以顯示出來的應該是 TabSheet2 與 TabSheet3 的 Caption (BB 與 CC),但結果卻是顯示出 TabSheet1 與 TabSheet2 的 Caption (AA 與 BB),換言之;TabSheet1 雖然未顯示出來,但是在 DrawTab 程序中其 Caption 並未被略過。
請問各位先進們,我是不是忽略了什麼?應該要如何才能解決上述的問題 (在某些 TabSheet 被設定為不顯示時,都能在 DrawTab 程序中正確繪製出有顯示出來的 TabSheet 項目所對應之 Caption)? 發表人 - RedSnow 於 2004/12/04 22:19:39
Zard
尊榮會員


發表:24
回覆:396
積分:539
註冊:2003-11-26

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-12-05 11:12:57 IP:61.64.xxx.xxx 未訂閱
這是因為 void __fastcall TForm1::PageControl1DrawTab(TCustomTabControl *Control, int TabIndex, const TRect &Rect, bool Active) 的TabIndex的值是該PageControl上可見的第TabIndex個TabSheet, 舉例來說: 若有TabSheet1 ~ TabSheet4 這四個TabSheet, 相對應的 TabIndex 就是0 ~ 4, 但是若TabSheet2 隱藏起來了, 也就是說只剩TabSheet1, TabSheet3, TabSheet4, 而此時TabIndex的值是多少呢?? 結果非你所想的0, 2, 4, 而是0, 1, 2. 所以TabIndex並不會把隱藏的TabSheet給算進去, 當有任一個TabSheet被隱藏起來時, TabIndex就會重新計算, 所以要解決這個問題, 你就要在畫Tab時, 也用同樣的方法, 找出第TabIndex可見的TabSheet. 幫你改了一下, 紅色部份
void __fastcall TForm1::PageControl1DrawTab(TCustomTabControl *Control,
      int TabIndex, const TRect &Rect, bool Active)
{
  if(Active){
    Control->Canvas->Font->Color = clRed;
  }else{
    Control->Canvas->Font->Color = clBlue;
  }
  
  //AnsiString str = ((TPageControl*)Control)->Pages[TabIndex]->Caption;
  // 找尋第TabIndex可見的TabSheet
  AnsiString str;
  for(int i = 0, j = 0; i < ((TPageControl*)Control)->PageCount; i  )
  {
    if (((TPageControl*)Control)->Pages[i]->TabVisible)
    {
      if (TabIndex != j) j  ;
      else
      {
        str = ((TPageControl*)Control)->Pages[i]->Caption;
        break;
      }
    }
  }
  
  TSize text = Control->Canvas->TextExtent(str);      Control->Canvas->FillRect(Rect);      int x = ((Rect.Right - Rect.Left) - text.cx) / 2;
  int y = (((Rect.Bottom - Rect.Top) - text.cy) / 2)   1;
  TRect tmpRect=Rect;
  if(Active){
    OffsetRect(&tmpRect, 1, 1);
  }
  Control->Canvas->TextOut(tmpRect.Left   x, tmpRect.Top   y, str);
}
Zard
尊榮會員


發表:24
回覆:396
積分:539
註冊:2003-11-26

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-12-05 11:18:19 IP:61.64.xxx.xxx 未訂閱
抱歉上面有點筆誤, 修正部份用紅字表示:    這是因為 void __fastcall TForm1::PageControl1DrawTab(TCustomTabControl *Control, int TabIndex, const TRect &Rect, bool Active) 的TabIndex的值是該PageControl上可見的第TabIndex個TabSheet, 舉例來說: 若有TabSheet1 ~ TabSheet4 這四個TabSheet, 相對應的 TabIndex 就是0 ~ 3, 但是若TabSheet2 隱藏起來了, 也就是說只剩TabSheet1, TabSheet3, TabSheet4, 而此時TabIndex的值是多少呢?? 結果非你所想的0, 2, 3, 而是0, 1, 2.
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-12-06 10:19:39 IP:218.19.xxx.xxx 未訂閱
Zard 您好: 我剛剛才看到您的回文,立即試了一下,很順利的就完成測試,確認您提供的方式確實有效,其實您所描述的 "原因" 我是知道的,只是萬萬沒想到 "結果" 竟然是用這種方式來解,真的是佩服您,能一針見血的就找出我的盲點,多謝您的協助,讓我能按原定構想繼續撰寫程式。 發表人 - RedSnow 於 2004/12/06 11:22:45
系統時間:2024-04-20 13:47:54
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!