[WinAPI] - Rozciąganie zawartości okna

0

Witam!

Mam taki problem. Rysuję sobie po oknie o pewnych rozmiarach mniejszych od zmaksymalizowanej wersji. Jak sprawić, aby okno rozciągało zawartość tego rysunku wraz z rozszerzaniem okna. Podejrzewam, że trzebaby to napisać w obsłudze komunikatu WM_SIZE, ale nie wiem jak. Proszę o sugestie.

Pozdrawiam! :)

0

w klasie okna zrób sobie jakiegoś DC z bitmapą o wielkości ekranu i rysuj po oknie pośrednio - najpierw na tej bitmapie a dopiero potem na oknie.
Teraz chyba wiesz co i jak? WM_PAINT jest bardzo prosty do obsługi - po prostu kopiujesz "wymazany" kwadrat z bitmapy-pamięci na okno.
WM_SIZE - tak samo kopiujesz z pomocniczej bitmapy (tu na całe okno), tylko że za pomocą StretchBlt()

W Twoim przypadku WM_PAINT powinien też kopiować przez StretchBlt zamiast bitblt bo rysunek ma być zależny od wielkości okna :)

Zrób sobie pomocnicze funkcje: setpixel,getpixel,move,line,lineto,rectangle... czyli te co używasz do rysowania. Zanim namalujesz na oknie - namaluj na pomocniczej bitmapie

0

ooooo.... no no ciekawy pomysł... :) ale w sumie to nie muszę nawet kopiować bitmapy, bo mogę przecież wstawić bitmapę na całe okno, narysować coś na bitmapie a potem wraz ze skalowaniem okna skalować bitmapę [green]

Ale to jest tylko sugestia... bo tak mi się wydaje, że będzie dobrze :/

Ale dzięki... jak to mówią: "Co więcej głów to nie jedna.." [green]

pozdrawiam!

0

Widzę że masz z tym problem, niepotrzebnie założyłeś nowy topic

W tym samplu ładowana jest gotowa bitmapa twenty-four-bit.bmp
OnPaint() jest zrobiony na odwal się - odrysowuje całe okno zamiast skalowania bitmapy na wymazany fragment okna

Tak przy okazji pochwalę się nowym alpha nabytkiem: "Aurora compiler"

#include "windows.inc"

class COkno
{
	declare COkno();
	declare _COkno();
	declare RegisterClass(),word;
	declare Create(int l,int t,int w,int h,int style,HMENU hMenu,string *title),HWND;
	declare LoadSetBitmap(string *path),HBITMAP;
	declare OnPaint(),int;
	declare OnCreate(),BOOL;
	declare OnSize(int nType,int cx,int cy);
	declare OnClose(),BOOL;

	HWND    m_hwnd; // hwnd okna
	HDC     m_cdc;  // pomocnicze DC
	HBITMAP m_hbm;  // pomocnicza bitmapa o wielko?ci ekranu
	HBITMAP m_dcbm; // oryginalna bitmapa z DC
	int     m_bmWidth; // rozmiar pomocniczej bitmapy
	int     m_bmHeight;
}


/////////////////////////
// program entry point

global sub main
{
	COkno win;
	win.Create(CW_USEDEFAULT,0,CW_USEDEFAULT,0,WS_OVERLAPPEDWINDOW,0,"blah");
	win.LoadSetBitmap("D:\\IBpro\\temp\\twenty-four-bit.bmp");
	ShowWindow(win.m_hwnd, SW_SHOW);

	while (win.m_hwnd)
	{
		wait();
	}

	return;
}



COkno :: COkno // constructor
{
	m_hwnd=0;
	m_cdc = CreateCompatibleDC(0);
	m_bmWidth = GetSystemMetrics(SM_CXSCREEN);
	m_bmHeight = GetSystemMetrics(SM_CYSCREEN);

	m_hbm = CreateCompatibleBitmap(
		m_cdc,
		m_bmWidth,
		m_bmHeight);

	m_dcbm = SelectObject(m_cdc, m_hbm);
	return RegisterClass();
}



COkno :: _COkno // destructor
{
	SelectObject(m_cdc, m_dcbm);
	DeleteObject(m_hbm);
	DeleteDC(m_cdc);
	return;
}



COkno :: OnCreate(),BOOL
{
//	CenterWindow(m_hwnd);
	return 0;
}



COkno :: OnSize(int nType,int cx,int cy)
{
	HDC dc = GetDC(m_hwnd);

	StretchBlt(dc, 0,0, cx,cy, m_cdc, 0,0,m_bmWidth, m_bmHeight, SRCCOPY);
	ReleaseDC(m_hwnd, dc);

	return 0;
}



COkno :: OnPaint(),int
{
	PAINTSTRUCT ps;
	RECT rc;

	// zrób to ?eby procek nie oszala?
	BeginPaint(m_hwnd, ps);
	EndPaint(m_hwnd, ps);

	// i skaluj bitmap?
	GetClientRect(m_hwnd, rc);
	return OnSize(0, rc.right, rc.bottom);
}



COkno :: OnClose(),BOOL
{
	DestroyWindow(m_hwnd);
	return 0;
}



COkno :: LoadSetBitmap(string *path),HBITMAP
{
	BITMAP bm;
	HBITMAP hbm = LoadImage(0, path, IMAGE_BITMAP, 0,0,LR_LOADFROMFILE);
	if (hbm=0) return 0;

	GetObject(hbm, len(BITMAP), bm);
	m_bmWidth = bm.bmWidth;
	m_bmHeight = bm.bmHeight;

	// usuwamy star? pomocnicz? bitmap?
	SelectObject(m_cdc, m_dcbm);
	DeleteObject(m_hbm);
	// i wsadzamy now?
	SelectObject(m_cdc, hbm);
	m_hbm = hbm;

	UpdateWindow(m_hwnd);
	return hmb;
}



COkno :: RegisterClass(),word
{
	WNDCLASS wc;
	memset(&wc, 0, len(wc));
	wc.style          = CS_GLOBALCLASS;
	wc.lpfnWndProc    = &MyWndProc;
	wc.hInstance      = _hinstance;
	wc.hCursor        = LoadCursor(NULL, IDC_ARROW);
	wc.lpszClassName  = "AuroraScalableImageWndClass";
	wc.hbrBackground  = GetStockObject(BLACK_BRUSH);
	return ::RegisterClass(&wc);
}



COkno :: Create(int l,int t,int w,int h,int style,HMENU hMenu,string *title),HWND
{
	return CreateWindowEx(0, 
		"AuroraScalableImageWndClass", 
		title, style, l,t,w,h,
		0, hMenu, _hinstance, this);
}



sub MyWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam),LRESULT
{
	COkno *me = GetProp(hwnd, "F458384A-7EF1-4715-A193-9C1B34CC527C");

	select uMsg
	{
		case WM_NCCREATE:

			me = *(CREATESTRUCT)lParam.lpCreateParams;
			SetProp(hwnd, "F458384A-7EF1-4715-A193-9C1B34CC527C", me);
			if (me<>null) me->m_hwnd = hwnd;

		case WM_CREATE:

			return me->OnCreate();

		case WM_SIZE:

			return me->OnSize(wParam, (lParam&0xFFFF), (lParam>>16));

		case WM_DESTROY:

			me->m_hwnd = 0;
			RemoveProp(hwnd, "F458384A-7EF1-4715-A193-9C1B34CC527C");

		case WM_CLOSE:

			return me->OnClose();

		case WM_PAINT:

			return me->OnPaint();

	}
	return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

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