国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

來點實用的,自己畫帶標題欄窗體,可當模態窗體樣繼承

2019-11-18 18:01:57
字體:
來源:轉載
供稿:網友
 

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, Menus;
type
  TForm1 = class(TForm)
    img1: TImage;                       //left
    img2: TImage;                       //Top
    img3: TImage;                       //Caption
    img4: TImage;                       //Right
    img5: TImage;                       //Time Control
    imgmin: TImage;                     //Minbutton
    imgrestore: TImage;                 //RestoreSize
    imgMax: TImage;                     //Maxbutton
    imgclose: TImage;                   //Closebutton

//這些圖片是WINBLANDS 4里面的CHIRSTMASTIME的窗口樣式圖片,修改一下就更完美了

//修改完后用photoshop轉為256色(100%)OK,開始把圖片載入各IMAGE控件,準備開始
    PRocedure FormResize(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
    iStyle: Longint;                                 //窗口樣式
    shuai: boolean;                               //狀態的判斷標志,用在NCMOUSEMOVE里
    procedure DrawActivate;                //活動時這樣畫
    procedure DrawDeActivate;           //不活動就這樣畫
  protected
    procedure wndproc(var message: Tmessage); override;//事實上下面的也都是OVERRIDE,這里我只處理

//了非NC開頭的一個消息,你也可以自己照下面的樣式寫WM_ACTIVATE
    procedure wmnchittest(var msg: TWMNCHITTEST); message WM_NCHITTEST;
    procedure wmncmousemove(var msg: TWMNcMousemove); message wm_ncmousemove;
    procedure wmnclbuttondown(var msg: Twmnclbuttondown); message wm_nclbuttondown;
    procedure wmnclbuttondblclk(var msg: TWMNCLButtonDblClk); message wm_nclbuttondblclk;
    procedure wmnclbuttonup(var msg: twmnclbuttonup); message wm_nclbuttonup;
    procedure wmncpaint(var msg: twmncpaint); message wm_ncpaint;
  public
    { Public declarations }

  end;

var
  Form1             : TForm1;
  caprect           : TRect;
  pt                : TPoint;
  dci               : integer;
implementation

{$R *.dfm}
//------------------------------------------------------------------------------
procedure TForm1.FormResize(Sender: TObject);
var
  rgn               : HRGN;
begin
  //要保證窗口的外觀效果,設置一下
  Form1.Constraints.MinHeight := 40;
  Form1.Constraints.MaxHeight := getsystemmetrics(SM_CYSCREEN) - getsystemmetrics(SM_CYMIN);

  rgn := CreateRoundRectRgn(0, 0, width, height, 5, 5);
  //這里的RGN,主要是應付Windows xp的主題文件的,不要它,嘿,真TMD丑
  setwindowrgn(handle, rgn, true);//設置窗口區域并重畫,區域外的繪制不會顯示

  deleteobject(rgn); //用完了記得刪除對象。                          
  invalidate;              //這句也很重要哦
end;
//------------------------------------------------------------------------------
//活動時這樣畫
//------------------------------------------------------------------------------
procedure TForm1.DrawActivate;
var
  myhdc             : HDC;
  ico               : HICON;
  i                 : integer;
  cav               : TCanvas;
  ACV               : TCanvas;
  caprect           : TRect;
  rcdw              : integer;
  j                 : integer;
  K                 : integer;
begin
  //  canvas.Lock;

  myhdc := getwindowDc(handle);
  ACV := TCanvas.Create;
  try
    ACV.handle := myhdc;
    setstretchbltmode(ACV.handle, STRETCH_DELETESCANS);
    with ACV do
    begin
      Bitblt(ACV.handle, 0, 0, 4, 31, img1.canvas.handle, 0, 0, SRCcopy);
      //左上角的那么點,寬4像素,高31像素         SRCxxxxx還有很多的哦
      Bitblt(ACV.handle, 4, 0, 30, 31, img2.canvas.handle, 0, 0, SRCcopy);
      //Draw Icon//馬上就要畫圖標了,我們來給它準備好位置吧
      ico := Icon.handle;               //想偷懶就這樣。^-^
      Drawiconex(ACV.handle, 18, 6, ico, 16, 16, 0, 0, DI_Normal);
      //這上面的畫ICON也可以給很多朋友參考的,這樣畫就是和原來的ICON一樣的,閃爍?沒有
      //好了,ICON畫好了,我們要開始畫標題文字了,先準備下,不然怎么知道畫多少呢
      i := Length(Caption) * 8 - 10;
      //每個文字大概、怎么也差不多有8像素寬的吧
      Bitblt(ACV.handle, 34, 0, 6, 31, img3.canvas.handle, 0, 0, SRCcopy);
      //下面準備為CAPTION鋪上紅地毯,~新郎新娘入洞房啦--“撲通”一塊磚頭飛來,我暈~倒
      stretchblt(ACV.handle, 40, 0, i, 31, img3.canvas.handle, 6, 0, 10, 31, SRCcopy);
      //開始畫CAPTION了,這里應該有許多朋友想解決的問題的參考
      cav := TCanvas.Create;
      cav.Brush.Style := bsclear;
      cav.handle := myhdc;
      caprect := rect(45, 10, i * 2 - 20, 26);
      cav.Font.Name := '宋體';
      cav.Font.Size := 9;
      cav.Font.Color := clwhite;
      cav.Font.Charset := GB2312_CHARSET;
      DrawText(cav.handle, pchar(Caption), Length(Caption), caprect, DT_Left); ////
      cav.free;
      //好了,標題也畫了,現在干啥子,接著畫,還早著呢
      //開始對標題欄封口啦
      Bitblt(ACV.handle, i + 40, 0, 11, 31, img3.canvas.handle, 18, 0, SRCcopy);
      //好了,口也滅了,現在該干啥了???接著畫,郁悶。
      //再這里對接,需要判斷了,郁悶之極啊
      rcdw := width - i - 51 - 94;
      //如果需要畫的地方沒180就只畫一下
      if (rcdw <= 180) then
      begin
        Bitblt(ACV.handle, i + 51, 0, rcdw, 31, img2.canvas.handle, 40, 0, SRCcopy);
      end
        //不然才多畫些,避免浪費資源
      else if (rcdw > 180) then
      begin
        j := trunc(rcdw / 180);
        for K := 0 to j - 1 do
        begin
          Bitblt(ACV.handle, i + 51 + (K) * 180, 0, 180, 31, img2.canvas.handle, 40, 0, SRCcopy);
        end;
        Bitblt(ACV.handle, i + 51 + j * 180, 0, (rcdw - j * 180), 31, img2.canvas.handle, 40, 0, SRCcopy);
      end;
      //要開個口子了,準備搞對接撒,這里用STRETCHBLT可就拉的丑了還是用BITBLT
      Bitblt(ACV.handle, (width - 94), 0, 10, 31, img2.canvas.handle, 239, 0, SRCcopy);
      //還留4個像素給右邊的封口撒
      Bitblt(ACV.handle, (width - 93), 0, 90, 31, img2.canvas.handle, 240, 0, SRCcopy);
      //好了,上面的東東完成了,該封口了,55555,誰讓偶這么好色呢,哎...,是不是很麻煩
      Bitblt(ACV.handle, (width - 5), 0, 4, 31, img4.canvas.handle, 0, 0, SRCcopy);
      //呵呵,上面畫完了。開始畫左邊的 ,注意這里也要多搞幾便的
      Bitblt(ACV.handle, 0, 31, 4, 9, img1.canvas.handle, 0, 31, SRCcopy);
      stretchblt(ACV.handle, 0, 40, 4, (height - 59), img1.canvas.handle, 0, 40, 4, 28, SRCcopy);
      Bitblt(ACV.handle, 0, (height - 20), 4, 19, img1.canvas.handle, 0, 58, SRCcopy);
      //哎,畫到這里還是不怎么好看,趕快畫右邊的 ,COPY上面的就OK了
      Bitblt(ACV.handle, (width - 5), 31, 4, 9, img4.canvas.handle, 0, 31, SRCcopy);
      stretchblt(ACV.handle, (width - 5), 40, 4, (height - 58), img4.canvas.handle, 0, 40, 4, 28, SRCcopy);
      Bitblt(ACV.handle, (width - 5), (height - 19), 4, 19, img4.canvas.handle, 0, 58, SRCcopy);
      //再畫下面的吧
      Bitblt(ACV.handle, 4, (height - 10), 10, 9, img5.canvas.handle, 0, 0, SRCcopy);
      stretchblt(ACV.handle, 14, (height - 10), (width - 28), 9, img5.canvas.handle, 10, 0, 21, 9, SRCcopy);
      Bitblt(ACV.handle, (width - 15), (height - 10), 10, 9, img5.canvas.handle, 31, 0, SRCcopy);
      //最小化BUTTON
      Bitblt(ACV.handle, (width - 38), 1, 26, 29, imgclose.canvas.handle, 0, 0, SRCcopy);
      //需要檢查下有沒有MAXBUTTON,CLOSEBUTTON偶就不檢查了,既然要畫肯定是要個CLOSEBUTTON的
      //怎么檢查?郁悶,算了,我可沒空去管你最大化按鍵要不要。
      //開始畫上去再說,還要看FORM是不是最大化的
      if windowstate = wsMaximized then
      begin
        //IMGRESTORE
        Bitblt(ACV.handle, (width - 64), 1, 26, 29, imgrestore.canvas.handle, 0, 0, SRCcopy);
      end
      else if windowstate = wsNormal then
      begin
        //IMGMAX
        Bitblt(ACV.handle, (width - 64), 1, 26, 29, imgMax.canvas.handle, 0, 0, SRCcopy);
      end;
      //畫最小化BUTTON
      Bitblt(ACV.handle, (width - 90), 1, 26, 29, imgmin.canvas.handle, 0, 0, SRCcopy);
      //canvas.Unlock; //使用CANVAS.UNLOCK配對也是一樣的效果,我這里寫的是推薦的做法
    end;
  finally
    releasedc(handle, ACV.handle);      //釋放設備場景
    ACV.free;
  end;
end;
//標題欄繪制的消息,看偶來偷天換日
procedure TForm1.wmncpaint(var msg: twmncpaint);
begin
  DrawActivate;                         //換成偶民滴
end;
//------------------------------------------------------------------------------
//不活動時就該這樣畫了
//------------------------------------------------------------------------------
procedure TForm1.DrawDeActivate;
var
  myhdc             : HDC;
  ico               : HICON;
  i                 : integer;
  cav               : TCanvas;
  DCV               : TCanvas;
  caprect           : TRect;
  rcdw              : integer;
  j                 : integer;
  K                 : integer;
begin
  //canvas.Lock;
  myhdc := getwindowDc(handle);
  DCV := TCanvas.Create;
  try
    DCV.handle := myhdc;
    setstretchbltmode(DCV.handle, STRETCH_DELETESCANS);
    with DCV do
    begin
      Bitblt(DCV.handle, 0, 0, 4, 31, img1.canvas.handle, 4, 0, SRCcopy);
      //左上角的那么點,寬4像素,高31像素         SRCxxxxx還有很多的哦
      Bitblt(DCV.handle, 4, 0, 30, 31, img2.canvas.handle, 0, 31, SRCcopy);
      //Draw Icon//馬上就要畫圖標了,我們來給它準備好位置吧
      ico := Icon.handle;
      Drawiconex(DCV.handle, 18, 6, ico, 16, 16, 0, 0, DI_Normal);
      //好了,ICON畫好了,我們要開始畫標題文字了,先準備下,不然怎么知道畫多少呢
      i := Length(Caption) * 8 - 10;
      //計算下長度,好畫撒
      Bitblt(DCV.handle, 34, 0, 6, 31, img3.canvas.handle, 0, 31, SRCcopy);
      //下面準備為CAPTION鋪上紅地毯,~新郎新娘入洞房啦--“撲通”一塊磚頭飛來,我暈~倒
      stretchblt(DCV.handle, 40, 0, i, 31, img3.canvas.handle, 6, 31, 10, 31, SRCcopy);
      //開始畫CAPTION了
      cav := TCanvas.Create;
      cav.Brush.Style := bsclear;       //刷子類型,~嘿嘿,偶也有兩把爛刷子哦
      cav.handle := myhdc;
      caprect := rect(45, 10, i * 2 - 20, 26);
      cav.Font.Name := '宋體';
      cav.Font.Size := 9;
      cav.Font.Color := clblack;
      cav.Font.Charset := GB2312_CHARSET;
      DrawText(cav.handle, pchar(Caption), Length(Caption), caprect, DT_Left); ////
      cav.free;
      //好了,標題也畫了,現在干啥子,接著畫,還早著呢
      //開始對標題欄封口啦
      Bitblt(DCV.handle, i + 40, 0, 11, 31, img3.canvas.handle, 18, 31, SRCcopy);
      //好了,封好了,現在該干嗎???接著畫,郁悶。
      //再這里對接,需要判斷了,郁悶之極啊
      rcdw := width - i - 51 - 94;
      if (rcdw <= 180) then
      begin
        Bitblt(DCV.handle, i + 51, 0, rcdw, 31, img2.canvas.handle, 40, 31, SRCcopy);
      end
      else if (rcdw > 180) then
      begin
        j := trunc(rcdw / 180);
        for K := 0 to j do
        begin
          Bitblt(DCV.handle, i + 51 + (K) * 180, 0, 180, 31, img2.canvas.handle, 40, 31, SRCcopy);
        end;
        Bitblt(DCV.handle, i + 51 + j * 180, 0, (rcdw - j * 180), 31, img2.canvas.handle, 40, 31, SRCcopy);
      end;
      //要開個口子了,準備搞對接撒,這里用STRETCHBLT可就拉的丑了還是用BITBLT
      Bitblt(DCV.handle, (width - 94), 0, 10, 31, img2.canvas.handle, 239, 31, SRCcopy);
      //還留4個像素給右邊的封口撒
      Bitblt(DCV.handle, (width - 93), 0, 90, 31, img2.canvas.handle, 240, 31, SRCcopy);
      //好了,上面的東東完成了,該封口了,55555,誰讓偶這么好色呢,哎...,是不是很麻煩
      Bitblt(DCV.handle, (width - 5), 0, 4, 31, img4.canvas.handle, 4, 0, SRCcopy);
      //----------------------------------------------------------------0--2
      //呵呵,上面畫完了。開始畫左邊的 ,注意這里也要多搞幾便的
      //--------------------------------------------------------------------
      Bitblt(DCV.handle, 0, 31, 4, 9, img1.canvas.handle, 0, 31, SRCcopy);
      stretchblt(DCV.handle, 0, 40, 4, (height - 59), img1.canvas.handle, 0, 40, 4, 28, SRCcopy);
      Bitblt(DCV.handle, 0, (height - 18), 4, 19, img1.canvas.handle, 0, 58, SRCcopy);
      //----------------------------------------------------------
      //哎,畫到這里還是不怎么好看,趕快畫右邊的 ,COPY上面的就OK了
      //--------------------------------------------------------------------
      Bitblt(DCV.handle, (width - 5), 31, 4, 9, img4.canvas.handle, 0, 31, SRCcopy);
      stretchblt(DCV.handle, (width - 5), 40, 4, (height - 58), img4.canvas.handle, 0, 40, 4, 28, SRCcopy);
      Bitblt(DCV.handle, (width - 5), (height - 18), 4, 18, img4.canvas.handle, 0, 58, SRCcopy);

      Bitblt(DCV.handle, 4, (height - 10), 10, 9, img5.canvas.handle, 0, 9, SRCcopy);
      stretchblt(DCV.handle, 14, (height - 10), (width - 28), 9, img5.canvas.handle, 10, 9, 21, 9, SRCcopy);
      Bitblt(DCV.handle, (width - 14), (height - 10), 10, 9, img5.canvas.handle, 31, 9, SRCcopy);

      Bitblt(DCV.handle, (width - 38), 1, 26, 30, imgclose.canvas.handle, 130, 0, SRCcopy);

      if windowstate = wsMaximized then
      begin
        //IMGRESTORE
        Bitblt(DCV.handle, (width - 64), 1, 26, 30, imgrestore.canvas.handle, 130, 0, SRCcopy);
      end
      else if windowstate = wsNormal then
      begin
        //IMGMAX
        Bitblt(DCV.handle, (width - 64), 1, 26, 30, imgMax.canvas.handle, 130, 0, SRCcopy);
      end;
      Bitblt(DCV.handle, (width - 90), 1, 26, 30, imgmin.canvas.handle, 130, 0, SRCcopy);
      //canvas.Unlock; //使用CANVAS.UNLOCK配對也是一樣的效果,我這里寫的是推薦的做法
    end;
  finally
    releasedc(handle, DCV.handle);
    DCV.free;
  end;
end;
//標題欄鼠標左鍵按下的消息
procedure TForm1.wmnclbuttondown(var msg: Twmnclbuttondown);
var
  dc                : HDC;
  cvs               : TCanvas;
begin
  dc := getwindowDc(handle);
  cvs := TCanvas.Create;
  try
    cvs.handle := dc;
    with cvs do
    begin
      if msg.HitTest = htminbutton then
      begin
        Bitblt(cvs.handle, (width - 90), 1, 26, 30, imgmin.canvas.handle, 26, 0, SRCcopy);
      end
      else if msg.HitTest = htmaxbutton then
      begin
        if windowstate = wsNormal then
        begin
          Bitblt(cvs.handle, (width - 64), 1, 26, 30, imgMax.canvas.handle, 26, 0, SRCcopy);
        end
        else if windowstate = wsMaximized then
        begin
          Bitblt(cvs.handle, (width - 64), 1, 26, 30, imgrestore.canvas.handle, 26, 0, SRCcopy);
        end;
      end
      else if msg.HitTest = htclose then
      begin
        Bitblt(cvs.handle, (width - 38), 1, 26, 30, imgclose.canvas.handle, 26, 0, SRCcopy);
      end
      else
        inherited;
    end;
  finally
    releasedc(handle, cvs.handle);
    cvs.free;
  end;
end;
//標題欄鼠標左鍵松開
procedure TForm1.wmnclbuttonup(var msg: twmnclbuttonup);
begin
  if msg.HitTest = htminbutton then
  begin
    application.Minimize;
  end
  else if msg.HitTest = htmaxbutton then
  begin
    if windowstate = wsNormal then
    begin
      windowstate := wsMaximized;
      left := left + 6;
      top := top + 3;
    end
    else if windowstate = wsMaximized then
    begin
      windowstate := wsNormal;
    end;
  end
  else if msg.HitTest = htclose then
  begin
    application.Terminate;
  end
  else
    inherited;
end;
procedure TForm1.wndproc(var message: Tmessage);
begin
  inherited wndproc(message);
  if message.msg = wm_activate then
  begin
    case message.WParamLo of
      wa_active, wa_clickactive:
        begin
          DrawActivate;
          shuai := true;
        end;
      wa_inactive:
        begin
          DrawDeActivate;
          shuai := false;
        end;
    end;
  end;
  if message.msg = wm_ncactivate then
  begin
    message.Result := 1;//返回個固定值吧,免得老閃來閃去多畫N次
  end;

end;
//用這個來告訴消息最好不過了,好好利用先
procedure TForm1.wmnchittest(var msg: TWMNCHITTEST);
var
  cprect            : TRect;            //定義標題欄的RECT(也就是一個正方形的區域)
  minrect           : TRect;            //最小化按紐的RECT
  maxrect           : TRect;            //最大化按紐的RECT
  closerect         : TRect;            //關閉  按紐的RECT
  pt                : TPoint;           //鼠標指針
begin
  cprect := rect(36, -getsystemmetrics(SM_CYMIN) + 6, width - 98, 31); //設置RECT
  minrect := rect((width - 90), -getsystemmetrics(SM_CYMIN) + 1, (width - 65), -getsystemmetrics(SM_CYMIN) + 29);
  maxrect := rect((width - 64), -getsystemmetrics(SM_CYMIN) + 1, (width - 39), -getsystemmetrics(SM_CYMIN) + 29);
  closerect := rect((width - 38), -getsystemmetrics(SM_CYMIN) + 1, (width - 13), -getsystemmetrics(SM_CYMIN) + 29);
  pt.X := Screentoclient(mouse.CursorPos).X; //鼠標X
  pt.Y := Screentoclient(mouse.CursorPos).Y; //    Y值
  //準備欺騙系統了 ,因為BSNONE樣式的窗體是沒有這些返回消息的
  if PtInRect(minrect, pt)
    then
    msg.Result := htminbutton           //告訴它在最小化按紐這里
  else if PtInRect(maxrect, pt)
    then
    msg.Result := htmaxbutton           //告訴它在最大化按紐這里
  else if PtInRect(closerect, pt)
    then
    msg.Result := htclose               //告訴它在關閉 按紐這里
  else if PtInRect(cprect, pt)
    then
    msg.Result := htCaption             //告訴它在標題欄這里
  else if (pt.X < 5) and (pt.Y < -getsystemmetrics(SM_CYMIN) + 8) then
    msg.Result := httopleft             //告訴它在左上角
  else if (pt.X > width - 13) and (pt.Y < -getsystemmetrics(SM_CYMIN) + 5) then
    msg.Result := httopright            //告訴它在右上角
  else if (pt.X > width - 13) and (pt.Y > height - 5 - getsystemmetrics(SM_CYMIN)) then
    msg.Result := htbottomright         //告訴它在右下角
  else if (pt.X < 5) and (pt.Y > height - 5 - getsystemmetrics(SM_CYMIN)) then
    msg.Result := htbottomleft          //告訴它在左下角
  else if (pt.X < 5) then
    msg.Result := htleft                //偶是左派
  else if (pt.Y < -getsystemmetrics(SM_CYMIN) + 5) then
    msg.Result := httop                 //我在上面,低頭不見抬頭見
  else if (pt.X > width - 9) then
    msg.Result := htright               //偶是右派
  else if (pt.Y > height - 5 - getsystemmetrics(SM_CYMIN)) then
    msg.Result := htbottom              //偶是貧下中農
  else
    inherited;                          { http://www.csdn.net  bob008 原創 2005-03-14,嚴禁未經許可的轉載,出版}
end;
//標題欄雙擊消息,偶們來模擬一下
procedure TForm1.wmnclbuttondblclk(var msg: TWMNCLButtonDblClk);
begin
  if msg.HitTest = htCaption then
    if windowstate = wsMaximized then
      windowstate := wsNormal
    else if windowstate = wsNormal then
    begin
      windowstate := wsMaximized;
      left := left + 6;
      top := top + 3;
    end;
end;
//標題欄上鼠標移動的消息
procedure TForm1.wmncmousemove(var msg: TWMNcMousemove);
var
  dc                : HDC;
  cv                : TCanvas;
begin
  dc := getwindowDc(handle);
  cv := TCanvas.Create;
  try
    cv.handle := dc;
    with cv do
    begin
      if shuai = true then
      begin
        if msg.HitTest = htminbutton then
        begin
          Bitblt(cv.handle, (width - 90), 1, 26, 30, imgmin.canvas.handle, 52, 0, SRCcopy);
        end
        else
        begin
          Bitblt(cv.handle, (width - 90), 1, 26, 30, imgmin.canvas.handle, 0, 0, SRCcopy);
        end;
        if msg.HitTest = htmaxbutton then
        begin
          if windowstate = wsNormal then
          begin
            Bitblt(cv.handle, (width - 64), 1, 26, 30, imgMax.canvas.handle, 52, 0, SRCcopy);
          end
          else if windowstate = wsMaximized then
          begin
            Bitblt(cv.handle, (width - 64), 1, 26, 30, imgrestore.canvas.handle, 52, 0, SRCcopy);
          end;
        end
        else if windowstate = wsNormal then
        begin
          Bitblt(cv.handle, (width - 64), 1, 26, 30, imgMax.canvas.handle, 0, 0, SRCcopy);
        end
        else if windowstate = wsMaximized then
        begin
          Bitblt(cv.handle, (width - 64), 1, 26, 30, imgrestore.canvas.handle, 0, 0, SRCcopy);
        end;
        if msg.HitTest = htclose then
        begin
          Bitblt(cv.handle, (width - 38), 1, 26, 30, imgclose.canvas.handle, 52, 0, SRCcopy);
        end
        else
        begin
          Bitblt(cv.handle, (width - 38), 1, 26, 30, imgclose.canvas.handle, 0, 0, SRCcopy);
        end;
      end;
    end;
  finally
    releasedc(handle, cv.handle);
    cv.free;
  end;
end;
//------------------------------------------------------------------------------
//我們要做什么?
//那幾個BUTTON讓偶們要干掉它們,省得它們壞事
//當然把它們屏蔽后應該干啥,干自己的事情撒
//------------------------------------------------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
var
  hsizens           : HICON;  //好界面配上好光標才帥嗎!用了WINDOWS變臉軟件里的光標
  hsizewe           : HICON;
  hsizeall          : HICON;
  hsizeall1         : HICON;
  hsizenesw         : Hicon;
  hsizenwse         : Hicon;
  hwait             : HICON;
  happstart         : HICON;
  harrow            : HICON;
  hhandwriting      : Hicon;
  hhelp             : HICON;
  hno               : HICON;
  hcross            : Hicon;
  hibeam            : Hicon;
  hhand             : Hicon;
  hup               : Hicon;
begin
  hsizens:=loadcursorfromfile('cursors/sizens.ani');
  hsizewe:=loadcursorfromfile('cursors/sizewe.ani');
  hsizeall:=loadcursorfromfile('cursors/sizeall.cur');
  hsizeall1:=loadcursorfromfile('cursors/sizeall1.cur');
  hsizenesw:=loadcursorfromfile('cursors/sizenesw.ani');
  hsizenwse:=loadcursorfromfile('cursors/sizenwse.ani');
  hwait:=loadcursorfromfile('cursors/wait.ani');
  happstart:=loadcursorfromfile('cursors/appstarting.ani');
  harrow:=loadcursorfromfile('cursors/arrow.cur');
  hhandwriting:=loadcursorfromfile('cursors/handwriting.ani');
  hhelp:=loadcursorfromfile('cursors/help.ani');
  hno:=loadcursorfromfile('cursors/no.ani');
  hcross:=loadcursorfromfile('cursors/cross.ani');
  hibeam:=loadcursorfromfile('cursors/ibeam.ani');
  hhand:=loadcursorfromfile('cursors/hand.ani');
  hup:=loadcursorfromfile('cursors/uparrow.ani');
  setsystemcursor(harrow,ocr_normal);
  setsystemcursor(hsizens,ocr_sizens);
  setsystemcursor(hsizewe,ocr_sizewe);
  setsystemcursor(hsizeall,ocr_sizeall);
  setsystemcursor(hsizeall1,ocr_size);
  setsystemcursor(hsizenesw,ocr_sizenesw);
  setsystemcursor(hsizenwse,ocr_sizenwse);
  setsystemcursor(hwait,ocr_wait);
  setsystemcursor(happstart,ocr_appstarting);
  setsystemcursor(hhandwriting,OIC_note);
  setsystemcursor(hhelp,  OCR_ICOCUR );
  setsystemcursor(hno,ocr_no);
  setsystemcursor(hcross,ocr_cross);
  setsystemcursor(hibeam,ocr_ibeam);
  setsystemcursor(hhand,OCR_HAND);
  setsystemcursor(hup,ocr_up);
  iStyle := setwindowlong(handle, gwl_style, getwindowlong(handle, gwl_style) and not ws_minimizebox and
    not ws_maximizebox and not ws_sysmenu);//設置窗口樣式有SYSMENU一樣會有CLOSEBUTTON的,所

//以把SYSMENU也去掉,這樣沒有默認的按鈕繪制會影響我們了
  application.Minimize;  //MS不知道是怎么搞的,窗體載入時的狀態切換消息幾乎沒時間差異,哇,多壓入一個
  application.Restore;  //設備場景的內存用量,大家NEW一個PROJECT看光1個窗體載入時3.2MB左右

//最小化后1.6MB左右,如果用戶根本一直讓你的軟件工作在正常狀態下(沒有最小化)那么那多余的1.6MB

//左右的內存也就不會被釋放,所以,我們似乎應該做些工作先

end;

procedure TForm1.FormPaint(Sender: TObject);
begin
  DrawActivate;//畫偶們的
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
SystemParametersinfo(SPI_SETCURSORS,0,nil,SPIF_SENDCHANGE);//恢復系統光標
//呵呵,偶好自私,不讓你們用偶的程序的鼠標樣式
end;

end.


上一篇:掃雷外掛的設計與實現(一)

下一篇:如何在托盤圖標實現漂亮的菜單

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

主站蜘蛛池模板: 逊克县| 英山县| 潞西市| 平江县| 昌黎县| 甘孜县| 那曲县| 竹山县| 西丰县| 嵊泗县| 定边县| 奇台县| 万年县| 正蓝旗| 黑龙江省| 屯留县| 定南县| 济南市| 两当县| 盖州市| 南川市| 凤阳县| 平果县| 莱芜市| 平陆县| 宜章县| 岫岩| 集贤县| 怀来县| 东海县| 正宁县| 景宁| 漳州市| 太白县| 吴川市| 连江县| 阿荣旗| 沽源县| 丘北县| 安达市| 佳木斯市|