全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1705
推到 Plurk!
推到 Facebook!

關於 ListView GridLines (格線) 顯示的問題

尚未結案
Jack222
一般會員


發表:9
回覆:8
積分:3
註冊:2004-11-30

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-04-07 09:56:58 IP:61.222.xxx.xxx 未訂閱
請問: ListView 的 GridLines 設為 true, 使其顯示格線, 當改變第一個 Column 的寬度到 0 然後再把它拉出來時, "直"的格線會不見, 但是改變第二個 Column 以後的寬度, "直"的格線卻能正常顯示, 有哪位大大知道這是什麼原因嗎? 是否有解? Thanks~
RedSnow
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-04-12 02:44:26 IP:219.137.xxx.xxx 未訂閱
Jack222 您好: 我個人認為您描述的狀況應該是該元件的 Bug,我的解決之道是攔截 ListView 調整欄位寬度的 Message,然後作 Refresh() 動作,迫使 ListView 重繪,我至今也未能確定這種作法是否為 "標準" 的解決之道,但是前述作法確實可以解決那個現象就是了。 當初為了瞭解 ListView 調整欄位寬度的觸發訊息,著實花了不少的時間在網上搜尋,結果可供參考的資訊實在不多,既然我描述的方式可以解決我的問題,或許您也可以試試看,您試著攔截 WM_NOTIFY 的 HDN_BEGINTRACKW, HDN_ENDTRACKW, HDN_ITEMCHANGINGW 訊息,然後送出 Refresh(),看看在您的環境裡是否可行?
Jack222
一般會員


發表:9
回覆:8
積分:3
註冊:2004-11-30

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-04-12 09:43:52 IP:61.222.xxx.xxx 未訂閱
謝謝您的回覆, 不過小弟我程度尚淺, 可否給我有關 WM_NOTIFY 應如何使用的 Sample Code, 如: public: void __fastcall WMNotify(TWMNotify & Msg); protected: BEGIN_MESSAGE_MAP VCL_MESSAGE_HANDLER(WM_NOTIFY, TWMNotify, WMNotify) END_MESSAGE_MAP(TForm) // ------------------------------------------------------------------ void __fastcall TForm1::WMNotify(TWMNotify & Msg) { // 是在這裡面攔截嗎? 如何寫呢? 我設了 Break Point, 但好像沒進來 }
RedSnow
版主


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-04-12 14:12:38 IP:219.136.xxx.xxx 未訂閱
Jack222 您好: 我在回覆前文時,因為時間很晚了,所以僅簡單的說明一下,如果您需要一段範例的話,請容我整理一下,稍後再貼上來。
RedSnow
版主


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-04-12 14:22:50 IP:219.136.xxx.xxx 未訂閱
Jack222 您好:    以下是我的範例,您參考一下:    .h 檔案宣告:
private:
    Controls::TWndMethod OldListViewWP;
    void __fastcall NewListViewWP(TMessage &Msg);
------------------------------------------------- .cpp 檔案設定:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    OldListViewWP = ListView1->WindowProc;
    ListView1->WindowProc = NewListViewWP;
}    void __fastcall TForm1::NewListViewWP(TMessage &Msg)
{
    if(Msg.Msg == WM_NOTIFY){
        LPNMHDR lpnmhdr=(LPNMHDR)Msg.LParam;            if(lpnmhdr->code == HDN_ENDTRACKW){
            ListView1->Refresh();
        }else if(lpnmhdr->code == HDN_BEGINTRACKW){
            ListView1->Refresh();
        }else if(lpnmhdr->code == HDN_ITEMCHANGINGW){
            ListView1->Refresh();
        }
    }
    if (Msg.Msg == WM_DESTROY) ListView1->WindowProc = OldListViewWP;        OldListViewWP(Msg);
}
Jack222
一般會員


發表:9
回覆:8
積分:3
註冊:2004-11-30

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-04-12 14:50:14 IP:61.222.xxx.xxx 未訂閱
Thanks, RedSnow, it works. I just use HDN_BEGINTRACKW for my requirement. But 須拿掉 Controls::TWndMethod OldListViewWP 的 Controls:: , 才可 Compile 過.
RedSnow
版主


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-04-12 15:55:59 IP:219.136.xxx.xxx 未訂閱
Jack222 您好:    不好意思,我寫該程式時因為偷懶而沿用以前的宣告設定,因為沒產生過錯誤,所以未做其它考量就直接將有關的宣告與設定貼上來,其實我這裡現在也無需加上 Controls:: 即可通過編譯,好在您自己試出來了,恭喜您解決問題。    雖然您說僅需要處理 HDN_BEGINTRACKW 消息即可,不過依據我的經驗,可能在某些動作之後,仍會有不顯示格線的狀況,因此把 HDN_ITEMCHANGINGW 也納入攔截對象處理一下可能會比較好些,但是呢~也有可能我們的 BCB 版本不同 (我使用 BCB4),執行結果也有些差異吧,您參考一下好了。
系統時間:2024-05-12 2:20:30
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!