Ikonka okna w API

0

Hey! Piszę sobie taki mały programik w API. Jest już on prawie skończony oprócz jednej ikonki:

I tutaj jest ikona
|


| | Tekst |X|

| tutaj coś tam |
| na oknie |

(sorki, że tak nie ładnie narysowałem, ale chodzi mi o tą ikonkę okna, która znajduje się w lewym, gónym rogu). A więc, jak ją zmienić? Tworząc klasę (TWndClass) można zmienić tylko ikonę tą, która jest na pasku zadań :(. Więc, jak to zmienić?? :P
Czekam na odpowiedzi, pozdrawiam Patryk.

PS. Jak pobrać uchwyt od ikony programu? W Visualu stworzyłem sobie zasób, który ma tylko jedną ikonę. Na moje zdziwienie, gdy dodałem ten zasób do programu, zmieniła się ikona programu na tą z zasobów (co mnie zdziwiło :P). Gdy próbowałem sobie dodać ikonę do TRAY'a (a pierwszy raz to robię w API), za Chin nie chciała się pokazać ikona programu (a uchwyt wyciągałem za pomocą LoadIcon(hInstance, IDI_APPLICATION), LoadIcon(0, IDI_APPLICATION) itp...). w SPACJA końcu poddałem się i skorzystłem z ExtractAssociatedIcon podając parametry programu. Jak można pobrać ikonę programu nie korzystając z ExtractAssociatedIcon?? :P

0

myślę że może to Ci pomoże
http://warsztat.pac.pl/artykuly/winapi/winapi.htm

tyle ze art w c++

0

Hey! Jedyne co takiego fajnego w tym artykule znalazłem to typ WndClassEx i do tego RegisterClassEx, ale one nie działają na Windowsach NT. Jakoś formy muszą być jednak zbudowane, że w nich to można zmieniać. Dzięki za podpowiedź, ale masz (macie) jakieś inne pomysły??

0

Do zmiany ikony aplikacji użyj SetClassLong.

Przykład:
Utwórz zasób (res.res) z dwoma ikonami o nazwach: ICON_1 i ICON_2.
Wpisz poniższy kodzik w Delphi i skompiluj. Uruchom program. Po kliknięciu na przycisku Button1 będą się zmieniały ikonki.

program Tst1;

uses
  Windows,
  Messages;

const
  AppName: PChar = 'Zmieniamy sobie ikony';
  ID_BUTTON1 = 1024;

var
  wnd: TWndClass;
  handle, hBtn: HWND;
  IsIco1: boolean;


{$R res.res}

function WindowProc(h: HWND; uMsg: UINT; wPar: WPARAM; lPar: LPARAM): LRESULT; stdcall;
var
  hIco: HICON;
begin
  Result := 0;
  case uMsg of
    WM_DESTROY: PostQuitMessage(0);
    WM_COMMAND:
      case wPar of
        ID_BUTTON1:
          begin
            IsIco1 := not IsIco1;
            if IsIco1 then
              hIco := LoadIcon(hInstance, 'ICON_1')
            else
              hIco := LoadIcon(hInstance, 'ICON_2');
            SetClassLong(handle, GCL_HICON, hIco);
          end;
      end
  else
    Result := DefWindowProc(h, uMsg, wPar, lPar);
  end;
end;

procedure InitApp;
begin
  wnd.style := CS_VREDRAW or CS_HREDRAW;
  wnd.lpfnWndProc := @WindowProc;
  wnd.cbClsExtra := 0;
  wnd.cbClsExtra := 0;
  wnd.hInstance := hInstance;
  wnd.hIcon := LoadIcon(0, IDI_APPLICATION);
  wnd.hCursor := LoadCursor(0, IDC_ARROW);
  wnd.hbrBackground := COLOR_WINDOW;
  wnd.lpszMenuName := '';
  wnd.lpszClassName := AppName;

  Windows.RegisterClass(wnd);

  handle := CreateWindowEx(
    0,
    AppName, AppName,
    WS_SYSMENU or WS_OVERLAPPEDWINDOW,
    150, 150, 700, 500,
    0, 0, hInstance, nil
    );

  if handle = 0 then PostQuitMessage(0);

  hBtn := CreateWindow(
    'BUTTON', 'Button1',
    WS_CHILD or WS_VISIBLE or BS_PUSHBUTTON,
    10, 10, 65, 25,
    handle, ID_BUTTON1, hInstance, nil
    );

  ShowWindow(handle, SW_SHOW);
  UpdateWindow(handle);
end;


procedure RunApp;
var
  msg: TMsg;
begin
  while GetMessage(msg, 0, 0, 0) do
  begin
    TranslateMessage(msg);
    DispatchMessage(msg);
  end;
  Halt(msg.wParam);
end;


begin
  InitApp;
  RunApp;
end.

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