Progressbar na belce na pasku zadań - windows 7

0

Witam

czy ktoś wie w jaki sposób można zrobić taki pasek postępu widoczny na pasku start na 'belce' tytułowej programu, jaki jest w Windows 7?

Widziałem gdzieś jakieś kody, ale to pod visual basic, na pewno nie pod delphi 7.

0
siekierzyński napisał(a)

na pewno nie pod delphi 7.

i masz racje, w delphi 7 tego nie zrobisz. Musisz mieć nowsze delphi, typu delphi 2009 czy jakie tam jest. Takie co wspiera technologie w najnowszym systemie.

0

nie znam win7 ale jesli to jest opcja wbudowana w system do informacje o tym znajdziesz na msdn'ie.
prawdopodobnie trzeba sie odwolac do funkcji z jakiegos systemowego dll'a.
i da sie to zrobic w d7, nowsze delphi co najwyzej to ulatwiaja.

0

A czy w delphi 2009 można instalować komponenty?

0

oczywiście ze tak, jak w każdym delphi, skołuj sobie najnowsze delphi ja tam nie wiem jaka to wersja, ale im nowsze tym lepiej ;)

0

chcesz zmieniac wersje delphi bo nie chce Ci sie napisac kilku linijek kodu? :D
http://msdn.microsoft.com/en-us/library/dd391697(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/dd391698(v=vs.85).aspx

0

Bo w codegear delphi 2009 nie mogłem dodać komponentu HTTPGET. Może nie umiałem?

0
cimak napisał(a)

chcesz zmieniac wersje delphi bo nie chce Ci sie napisac kilku linijek kodu? :D
http://msdn.microsoft.com/en-us/library/dd391697(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/dd391698(v=vs.85).aspx

Ok, będę musiał się wczytać, bo na razie to jest wielki chaos, jak na 1-szy rzut oka.

0

to jest tak: spora czesc funkcji ktorych uzywasz w delphi jest czescia systemu i funkcje siedza w rzeczywistosci w windowsowych dll'ach.
wpisz sobie np w delphi "ShowWindow" i z przytrzymanym ctrl kliknij na to.
zobaczysz ze tak naprawde ta funkcja siedzi w user32 (.dll) pod nazwa "ShowWindow".
kazda taka systemowa funkcja jest bardzo dokladnie opisana na msdnie.

wiec jesli tylko jakas funkcja istneiej w systemie i jest opisana i wiesz jak jej uzywac.
to jedyne co musisz zrobic to powiedziec delphi ze "funkcja znajduje sie w tym i tym pliku dll, przyjmuje takie i takie parametry i zwraca to i tamto".

0

Czyli Delphi to jakby system w kawałkach, które sobie odpowiednio składamy?

Kombinuję coś, jak te 2 linijki wstawić do delphi, szperam po googlach.

0

Ty chyba coś jest na ten temat: http://www.drbob42.com/examine/examinC5.htm

0

Głupoty gadacie, Delphi nie ma tu nic do tego.
Delphi 2009 jedynie wspiera/umożliwia łatwe "włączenie" tej funkcji poprzez "OI", czego w starszych Delphi nie mogło być.
Wystarczy wysłać odpowiedni komunikat do systemu, aby ten pasek postępu był wywołany na belce (tak samo jak migotanie belki).

W necie są kody na to, a jeśli nie w Delphi to na pewno w C++, a to już nie problem przerobić.

Oto dowód na Delphi 7: http://www.delphifeeds.com/go/s/47169

Jakieś 10minut szukania i voila!
źródło: http://code.google.com/p/mulder/source/browse/trunk/LameXP/src/Unit_Win7Taskbar.pas

///////////////////////////////////////////////////////////////////////////////
// LameXP - Audio Encoder Front-End
// Copyright (C) 2004-2010 LoRd_MuldeR <[email protected]>
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program; if not, write to the Free Software Foundation, Inc.,
// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
//
// http://www.gnu.org/licenses/gpl-2.0.txt
///////////////////////////////////////////////////////////////////////////////

unit Unit_Win7Taskbar;

interface

uses
  Forms, Types, Windows, SysUtils, ComObj, Controls, Graphics;

type
  TTaskBarProgressState = (tbpsNone, tbpsIndeterminate, tbpsNormal, tbpsError, tbpsPaused);

function InitializeTaskbarAPI: Boolean;
function SetTaskbarProgressState(const AState: TTaskBarProgressState): Boolean;
function SetTaskbarProgressValue(const ACurrent:UInt64; const AMax: UInt64): Boolean;
function SetTaskbarOverlayIcon(const AIcon: THandle; const ADescription: String): Boolean; overload;
function SetTaskbarOverlayIcon(const AIcon: TIcon; const ADescription: String): Boolean; overload;
function SetTaskbarOverlayIcon(const AList: TImageList; const IconIndex: Integer; const ADescription: String): Boolean; overload;

implementation

const
  TASKBAR_CID: TGUID = '{56FDF344-FD6D-11d0-958A-006097C9A090}';

const
  TBPF_NOPROGRESS = 0;
  TBPF_INDETERMINATE = 1;
  TBPF_NORMAL = 2;
  TBPF_ERROR = 4;
  TBPF_PAUSED = 8;

type
  ITaskBarList3 = interface(IUnknown)
  ['{EA1AFB91-9E28-4B86-90E9-9E9F8A5EEFAF}']
    function HrInit(): HRESULT; stdcall;
    function AddTab(hwnd: THandle): HRESULT; stdcall;
    function DeleteTab(hwnd: THandle): HRESULT; stdcall;
    function ActivateTab(hwnd: THandle): HRESULT; stdcall;
    function SetActiveAlt(hwnd: THandle): HRESULT; stdcall;
    function MarkFullscreenWindow(hwnd: THandle; fFullscreen: Boolean): HRESULT; stdcall;
    function SetProgressValue(hwnd: THandle; ullCompleted: UInt64; ullTotal: UInt64): HRESULT; stdcall;
    function SetProgressState(hwnd: THandle; tbpFlags: Cardinal): HRESULT; stdcall;
    function RegisterTab(hwnd: THandle; hwndMDI: THandle): HRESULT; stdcall;
    function UnregisterTab(hwndTab: THandle): HRESULT; stdcall;
    function SetTabOrder(hwndTab: THandle; hwndInsertBefore: THandle): HRESULT; stdcall;
    function SetTabActive(hwndTab: THandle; hwndMDI: THandle; tbatFlags: Cardinal): HRESULT; stdcall;
    function ThumbBarAddButtons(hwnd: THandle; cButtons: Cardinal; pButtons: Pointer): HRESULT; stdcall;
    function ThumbBarUpdateButtons(hwnd: THandle; cButtons: Cardinal; pButtons: Pointer): HRESULT; stdcall;
    function ThumbBarSetImageList(hwnd: THandle; himl: THandle): HRESULT; stdcall;
    function SetOverlayIcon(hwnd: THandle; hIcon: THandle; pszDescription: PChar): HRESULT; stdcall;
    function SetThumbnailTooltip(hwnd: THandle; pszDescription: PChar): HRESULT; stdcall;
    function SetThumbnailClip(hwnd: THandle; var prcClip: TRect): HRESULT; stdcall;
  end;

var
  GlobalTaskBarInterface: ITaskBarList3;

function InitializeTaskbarAPI: Boolean;
var
  Unknown: IInterface;
  Temp: ITaskBarList3;
begin
  if Assigned(GlobalTaskBarInterface) then
  begin
    Result := True;
    Exit;
  end;

  try
    Unknown := CreateComObject(TASKBAR_CID);
    if Assigned(Unknown) then
    begin
      Temp := Unknown as ITaskBarList3;
      if Temp.HrInit() = S_OK then
      begin
        GlobalTaskBarInterface := Temp;
      end;
    end;
  except
    GlobalTaskBarInterface := nil;
  end;

  Result := Assigned(GlobalTaskBarInterface);
end;

function CheckAPI:Boolean;
begin
  Result := Assigned(GlobalTaskBarInterface);
end;

function SetTaskbarProgressState(const AState: TTaskBarProgressState): Boolean;
var
  Flag: Cardinal;
begin
  Result := False;

  if CheckAPI then
  begin
    case AState of
      tbpsIndeterminate: Flag := TBPF_INDETERMINATE;
      tbpsNormal: Flag := TBPF_NORMAL;
      tbpsError: Flag := TBPF_ERROR;
      tbpsPaused: Flag := TBPF_PAUSED;
    else
      Flag := TBPF_NOPROGRESS;
    end;
    Result := GlobalTaskBarInterface.SetProgressState(Application.Handle, Flag) = S_OK;
  end;
end;

function SetTaskbarProgressValue(const ACurrent:UInt64; const AMax: UInt64): Boolean;
begin
  Result := False;

  if CheckAPI then
  begin
    Result := GlobalTaskBarInterface.SetProgressValue(Application.Handle, ACurrent, AMax) = S_OK;
  end;
end;

function SetTaskbarOverlayIcon(const AIcon: THandle; const ADescription: String): Boolean;
begin
  Result := False;

  if CheckAPI then
  begin
    Result := GlobalTaskBarInterface.SetOverlayIcon(Application.Handle, AIcon, PAnsiChar(ADescription)) = S_OK;
  end;
end;

function SetTaskbarOverlayIcon(const AIcon: TIcon; const ADescription: String): Boolean;
begin
  Result := False;

  if CheckAPI then
  begin
    if Assigned(AIcon) then
    begin
      Result := SetTaskbarOverlayIcon(AIcon.Handle, ADescription);
    end else begin
      Result := SetTaskbarOverlayIcon(THandle(nil), ADescription);
    end;
  end;
end;

function SetTaskbarOverlayIcon(const AList: TImageList; const IconIndex: Integer; const ADescription: String): Boolean;
var
  Temp: TIcon;
begin
  Result := False;

  if CheckAPI then
  begin
    if (IconIndex >= 0) and (IconIndex < AList.Count) then
    begin
      Temp := TIcon.Create;
      try
        AList.GetIcon(IconIndex, Temp);
        Result := SetTaskbarOverlayIcon(Temp, ADescription);
      finally
        Temp.Free;
      end;
    end else begin
      Result := SetTaskbarOverlayIcon(nil, ADescription);
    end;
  end;
end;

initialization
  GlobalTaskBarInterface := nil;

finalization
  GlobalTaskBarInterface := nil;

end.
0

Mam już, to właśnie się tym bawię, tylko mam problem z tbpsIndeterminate. Czy do tego też używam SetTaskbarProgressValue?
Bo tbpsIndeterminate wygląda tak samo jak tbpsNormal.

0

Głupoty gadacie, Delphi nie ma tu nic do tego.
Ja to kiedyś zrobiłem pod Delphi 4. Podobnie jak efekty „szkła” (Aero Glass). Kwestia ręcznego zaimportowania odpowiednich funkcji systemowych.

1 użytkowników online, w tym zalogowanych: 0, gości: 1