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

有沒有人玩過自繪ComboBox?

答題得分者是:william
lcsboy
版主


發表:87
回覆:622
積分:394
註冊:2002-06-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-11-14 19:56:33 IP:211.23.xxx.xxx 未訂閱
當ComboBox的Style設成csOwnerDrawFixed, or csOwnerDrawVariable 那麼ComboBox要秀的字串和圖型是要自己畫在OnDrawItem裡    不管我有沒有在DrawItem寫code或用了繪圖指令後. 都會出來一個虛線框呢?    有沒有辦法讓ComboBox不會自己畫上那個虛線框呢? 試了老半天, 找不到屬性可以設! 也不知道誰在後面把虛線框畫了上去
ddy
站務副站長


發表:262
回覆:2105
積分:1169
註冊:2002-07-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-11-14 21:49:55 IP:61.59.xxx.xxx 未訂閱
lcsboy兄 那個虛框,是Foucs的框吧… 由TWinControl繼承而來的,你可能要從這裡下手試試看 小小的看法,參考看看吧:p (如果有誤別見笑…) 噓~~~~~~沉思中…
lcsboy
版主


發表:87
回覆:622
積分:394
註冊:2002-06-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-11-14 21:58:08 IP:210.85.xxx.xxx 未訂閱
虛線框是Focus來的沒錯! 但是設了ComboBox1->TabStop=false還是沒用!    但是如果單獨在TImage實作 ,虛線框除非自己下指令, 不然是不會出來的    TWinControl.........我再想想........實在是沒招了 而且繪圖指令不常在用, 可能設了什麼就可以, 結果我不會作的
ddy
站務副站長


發表:262
回覆:2105
積分:1169
註冊:2002-07-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-11-14 22:05:08 IP:61.59.xxx.xxx 未訂閱
呵…不解… 我覺得那個虛框…沒有什麼不好呀 > 噓~~~~~~沉思中…
lcsboy
版主


發表:87
回覆:622
積分:394
註冊:2002-06-18

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-11-14 23:23:25 IP:210.85.xxx.xxx 未訂閱
有迷有發現! OS的檔案總管 上面也是一個ComboBox 不是ComboBox32唷!    但是他就能作到沒有虛框..............lihi吧!    我就是無法作出正確的繪圖運算, 讓虛線框不見呀!!!
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-11-15 09:22:01 IP:147.8.xxx.xxx 未訂閱
call DrawFocusRect do cancel the rect (I think Windows is using XOR mode for the focus rect), e.g.
procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
var
    s : string;
begin
    s := TCombobox(Control).Items[Index];
    with TCombobox(Control).Canvas do begin
        DrawText(Handle,PChar(s),length(s),Rect,DT_CENTER);
        if odFocused in State then
            DrawFocusRect(Rect);
    end;
end;
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2002-11-15 09:57:14 IP:61.219.xxx.xxx 未訂閱
William所說真的可以嗎? 我認為應該與DrawItem無關, 主要是Combobox中共有3個Windowhandle, 在cdOwnerDraw時, EditHandle沒有了故取得focus時失控 試一下, 把combobox之onPaint完全Disable, 其他不繪, 這個線框照常存在.    只要上面有東西就沒問題, 提供兩個方法, 也許有更好的吧    1. 給initial value,如果可接受,這樣最簡單 (i.e) 開始時就
  combobox1.itemindex:=0;
2. 要改內部, EditHandle之控制太麻煩, 自己加一個上去吧,元件create時, Create此edit, onPain時, 若為csOwnerDrawfixed且itemindex < 0則visible
  TCombobox=class(StdCtrls.Tcombobox)
    Ed:TEdit;
    constructor Create(AOwner: TComponent); override;
    procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
  end;    constructor TCombobox.Create(AOwner: TComponent);
begin
  inherited;
  ed:=TEdit.create(AOwner);
  ED.parent:=self;
  ED.Visible:=False;
  ED.left:=GetSystemMetrics(SM_CXBORDER);
  ED.Width := width - 2* GetSystemMetrics(SM_CXBORDER) -GetSystemMetrics(SM_CXHTHUMB);
  ED.Top:=GetSystemMetrics(SM_CYBORDER);
  ED.height:=height-2*GetSystemMetrics(SM_CYBORDER);
  ED.readonly:=True;
end;    procedure TCombobox.WMPaint(var Message: TWMPaint);
begin
  if (self.Style=csOwnerDrawFixed) and (itemindex<0) then
    ED.visible:=True
  else
    ED.visible:=False;
  DefaultHandler(Message);
end;
測試過, 應無問題
lcsboy
版主


發表:87
回覆:622
積分:394
註冊:2002-06-18

發送簡訊給我
#8 引用回覆 回覆 發表時間:2002-11-21 01:09:06 IP:210.85.xxx.xxx 未訂閱
引言: call DrawFocusRect do cancel the rect (I think Windows is using XOR mode for the focus rect), e.g.
procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
var
    s : string;
begin
    s := TCombobox(Control).Items[Index];
    with TCombobox(Control).Canvas do begin
        DrawText(Handle,PChar(s),length(s),Rect,DT_CENTER);
        if odFocused in State then
            DrawFocusRect(Rect);
    end;
end;
Wa.......Le............ 原來我之前都判斷odSelected, 現在試了才知道 odFocused和odSelected是有所不同的, 不然沒事有兩種設定幹嘛< > 不好意思, 自己耍了個小白吃< >, 不過同時感謝William和ccchen 因為如果要讓ComboBox也能輸入, 是要加上ccchen的作法 且default設ItemIndex=0 是可以接受的
系統時間:2024-03-29 12:34:28
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!