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.