Ustawienie własnej ikony programu pobranej z zasobów

0

Witam,
od niedawna zajmuję się Winapi i taki dziwny problem się pojawił.
Kiedy piszę sobie w klasie okna własną ikonę, z zasobów

Klasa.hIcon=LoadIcon(hInst,"Ikona");

Ikona zmienia się owszem, ale tylko na pasku zadań, natomiast na pasku tytułu i na "Alt+Tab"-ie jest ikona normalnej aplikacji. Kiedy ustawiam normalną ikonę wbudowaną dobrze działa. We wszystkich kursach tak jest, a u mnie nie działa. Co może być źle?

Pozdrawiam

0

A ustawiałeś hIconSm jeśli korzystasz z WNDCLASSEX?

0
wc.hIcon=LoadIcon(hInst,"Ikona");
  wc.hIconSm=LoadIcon(hInst,"Ikona");

Używam Visuala 6, ale to chyba nie jest tego wina

0

z msdn:

hIconSm
Type: HICON

A handle to a small icon that is associated with the window class. If this member is NULL, the system searches the icon resource specified by the hIcon member for an icon of the appropriate size to use as the small icon.

Czyli jak ustawisz w hIconSm 0 to powinna być używana ikonka z hIcon. Możliwe że nie czyścisz klasy okna i zostają CI jakieś śmieci w hIconSm.

0

Nigdy nie widziałem sensu tego hIconSm. Zawsze używam WNDCLASS (bez EX) które nie ma hIconSm i działa dobrze.

0

Dokładnie tak, jak @Azarien pisze. Po co sobie komplikować proste sprawy w podstawowych zagadnieniach WinAPI. Poniżej kod wprawdzie w Delphi. Ale to dlatego, że nie trawie C/C++. I zaspamuje rozwiązaniem takim, ponieważ autor nie raczył nawet dodać tagów. Ale już się przyzwyczaiłem, że zawsze jakiś wątek w Newbie jest pod tym względem do poprawki, bo ludziom szkoda dodać głupie c++ albo dodają jakieś idiotyczne słowa nic nie sugerujące.

Poniższy kod można chyba łatwo zdaje się portnąć do C++. Podejrzawam, że poza zamianą miejsc nazw zmiennych z typem i stdcall na winapi, begin i end na nawiasy ostre, dodać po ichniejszemu zasoby, ewentuelnie jak ja to nazywam "fachowo" wymagane w C/C++ "rzutowania z d...", do tego te magiczne & przy przekazywaniu niektorych zmiennych jak typu Rect i powinno się jakoś kompilować. Bo i tak chodzi mi tutaj o ideę. Jak to zrobić wedle mnie najprościej. Gdyż w życiu nie zaprzątałem sobie klasą z dla okien z ex i tym polem hIconSm, bo i w sumie po co.

Plik zasobów resources.rc:

#define IDI_MAINICON 100
IDI_MAINICON ICON DISCARDABLE "app_icon.ico"

Kod projektu:

program example_app;

{$R 'resources.res' 'resources.rc'}

uses
  Windows, Messages;

const
  IDI_MAINICON = 100;
  My_Window_Class = 'ExampleAppClass';

procedure CenterWindow(AHandle : HWND);
var
  ARect : TRect;
  ScreenWidth, ScreenHeight, DialogWidth, DialogHeight : integer;
begin
  GetWindowRect(GetDesktopWindow, ARect);
  ScreenWidth := ARect.Left + ARect.Right;
  ScreenHeight := ARect.Top + ARect.Bottom;
  GetWindowRect(AHandle, ARect);
  DialogWidth := ARect.Right - ARect.Left;
  DialogHeight := ARect.Bottom - ARect.Top;
  SetWindowPos(AHandle, HWND_NOTOPMOST,
    (ScreenWidth - DialogWidth) div 2,
    (ScreenHeight - DialogHeight) div 2, 0, 0,
    SWP_NOACTIVATE or SWP_NOSIZE);
end;

function WndProc(AHWnd : HWND; Msg : UINT; AWParam : WPARAM; ALParam : LPARAM) : LRESULT; stdcall;
var
  IconH : HICON;
begin
  Result := 0;
  case Msg of
    WM_CREATE :
      begin
        CenterWindow(AHwnd);
        IconH := LoadIcon(HInstance, MAKEINTRESOURCE(IDI_MAINICON));
        SendMessage(AHWnd, WM_SETICON, 1, IconH);
      end;
    WM_DESTROY :
      begin
        PostQuitMessage(0);
      end;
  else
    Result := DefWindowProc(AHWnd, Msg, AWParam, ALParam);
  end;
end;

var
  Msg : TMsg;
  Wnd : TWndClass;
begin
  with Wnd do
  begin
    hInstance := HInstance;
    lpfnWndProc := @WndProc;
    lpszClassName := My_Window_Class;
    hbrBackground := COLOR_BTNFACE + 1;
  end;
  RegisterClass(Wnd);
  CreateWindow(My_Window_Class, 'Example App',
    WS_VISIBLE or WS_TILEDWINDOW and not WS_MAXIMIZEBOX,
    0, 0, 300, 100,
    0, 0, HInstance, nil);
  while GetMessage(Msg, 0, 0, 0) do
  begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;
end.

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