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

使用 Device Context 小例子 - 在 Title Bar 畫置中 Caption

 
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-05-09 22:01:14 IP:218.16.xxx.xxx 未訂閱
Device Contexts (DC) 是 Window API 中一大類別,主要是畫東西的 (包括文字) 無論畫到螢光幕或是印表機,都會用都 DC 的功能    附上一個使用 Device Context 在 Title Bar  畫置中 Caption 的小例子。    修改 : 簡化 再修改 : 加入第二個版本 發表人 - Justmade 於 2003/05/10 13:34:48
附加檔案:30213_CenterCaption.zip
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-05-10 13:36:37 IP:218.16.xxx.xxx 未訂閱
本期電子報有詳細的程式碼註解,不明白程式碼的網友記得看喔。
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-05-17 14:56:05 IP:218.16.xxx.xxx 未訂閱
轉貼自 005 期電子報 :    CenterCaption.dpr 由於只想將標題置中,所以程式碼比較簡單 :    
procedure TForm1.FormCreate(Sender: TObject);
begin
  MyHDC := GetWindowDC(Handle); // 從 Form 的 handle 取得 Device Context *註1
  SetBkMode(MyHDC,TRANSPARENT); // 設定底色透明
  SetTextColor(MyHDC,$FFFFFF);  // 設定字體顏色 $FFFFFF 為白色
  MyCaption := Caption;         // 將原本的Caption 放在變數待用
  Caption := '';                // 清空原本 Caption
  Application.OnDeactivate := FormPaint; // 若不設這個轉到別程式時 Caption 會不見
end;    procedure TForm1.FormPaint(Sender: TObject);
begin
  RT := Rect(0,5,width,25); // 提取最新的 Caption 位置
  DrawText(MyHDC,PChar(MyCaption),Length(MyCaption),RT,DT_CENTER); // 劃出標題,DT_CENTER 是置中
end;    procedure TForm1.FormDestroy(Sender: TObject);
begin
  DeleteDC(MyHDC); //關閉時刪掉 Device Context
end;
CenterCaption2.dpr 加多了自選字體,顏色,陰影,立體背景,及設定隱藏部份視窗位置等等 :
procedure TForm1.FormCreate(Sender: TObject);
begin
  MyHDC := GetWindowDC(Handle);
  MyFont := TFont.Create;           //創建 Font,Brush,Pen
  MyBrush := TBrush.Create;
  MyPen := TPen.Create;
  MyFont.Name := 'Impact';          //設定字形
  MyFont.Size := 11;
  MyFont.Style := [fsItalic];
  MyPen.Style := psClear;           //設定 Pen 屬性
  SelectObject(MyHDC,MyFont.Handle);//告訴 DC 使用這字形
  SelectObject(MyHDC,MyPen.Handle); //告訴 DC 使用這Pen
  SetBkMode(MyHDC,TRANSPARENT);
  MyCaption := Caption;
  Caption := '';
  Application.OnDeactivate := FormPaint;
end;    procedure TForm1.FormPaint(Sender: TObject);
var
i : integer;
begin
  for i := 0 to 10 do // 分十次劃橢圓做出漸層立體效果的背境
  begin
    MyBrush.Color := RGB(i * 10   100, i * 8   80, i * 6   160);
    SelectObject(MyHDC,MyBrush.Handle);
    Ellipse(MyHDC,Round(width / 2) - 100   i, 4   i , Round(width / 2)   100 - i, 23 - i);
  end;
  RT := Rect(0,5,width   4,27);
  SetTextColor(MyHDC,$00000000);
  DrawText(MyHDC,PChar(MyCaption),Length(MyCaption),RT,DT_CENTER); // 先劃黑陰影
  RT := Rect(0,3,width,25);
  SetTextColor(MyHDC,$00FFFFD9);
  DrawText(MyHDC,PChar(MyCaption),Length(MyCaption),RT,DT_CENTER); // 再劃正標題
end;    procedure TForm1.FormDestroy(Sender: TObject);
begin
  MyPen.Free;  //關閉時釋放建立了的物件
  MyBrush.Free;
  MyFont.Free;
  DeleteDC(MyHDC);
end;    procedure TForm1.FormResize(Sender: TObject);
var
RGN1, RGN2 : HRGN; // 儲存何處顯示的變數
begin
  RGN1 := CreateRoundRectRgn(0,23,Width, Height,20,20); // Form 主畫面的圓角長方顯示
  Rgn2 := CreateEllipticRgn(Round(width / 2) - 100 , 4 , Round(width / 2)   100 ,23); // 標題橢圓顯示
  CombineRgn(RGN1,RGN1,RGN2,RGN_OR);    //將 RGN1 及 RGN2 合併在 RGN1
  Rgn2 := CreateEllipticRgn(Width - 20, 6, Width - 8, 19); // 關閉按扭圓顯示
  CombineRgn(RGN1,RGN1,RGN2,RGN_OR);    //將 RGN1 及 RGN2 合併在 RGN1
  SetWindowRgn(Handle,RGN1,true);       // 設定 Form 只顯示剛才合併了的顯示位置
  FormPaint(Sender);                    // 重新繪劃
end;
這只是一些簡單的例子,你的 Form 要甚樣做就靠你的想像力了
系統時間:2024-05-16 0:11:46
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!