<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>pamiętnik programisty &#187; winapi</title>
	<atom:link href="http://piotr.doniec.eu/devlog/tag/winapi/feed/" rel="self" type="application/rss+xml" />
	<link>http://piotr.doniec.eu/devlog</link>
	<description></description>
	<lastBuildDate>Sun, 25 Jul 2010 12:54:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Przezroczyste okienka z WinAPI</title>
		<link>http://piotr.doniec.eu/devlog/2009/10/przezroczyste-okienka-z-winapi/</link>
		<comments>http://piotr.doniec.eu/devlog/2009/10/przezroczyste-okienka-z-winapi/#comments</comments>
		<pubDate>Sat, 10 Oct 2009 12:24:08 +0000</pubDate>
		<dc:creator>pejotr</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[tricky]]></category>
		<category><![CDATA[winapi]]></category>

		<guid isPermaLink="false">http://piotr.doniec.eu/devlog/?p=270</guid>
		<description><![CDATA[Wraz z pojawieniem się systemu Windows 2000, pojawiły się nowe funkcje systemowego API. Jedną z nich jest możliwość tworzenia okien o dowolnym stopniu przezroczystości. Efekt jest dość ciekawy i sporo programów ma możliwość ustawienia przezroczystości własnego okienka. Moim celem było umożliwienie sterowania przezroczystością okien centralnie z jednego programu i to nie zależnie od tego czy]]></description>
			<content:encoded><![CDATA[<p><img class="size-full wp-image-339 alignleft" title="transparent_windows2" src="http://piotr.doniec.eu/devlog/wp-content/uploads/2009/10/transparent_windows21.jpg" alt="Przezroczyste okna z winAPI" width="244" height="220" />Wraz z pojawieniem się systemu Windows 2000, pojawiły się nowe funkcje systemowego API. Jedną z nich jest możliwość tworzenia okien o dowolnym stopniu przezroczystości. Efekt jest dość ciekawy i sporo programów ma możliwość ustawienia przezroczystości własnego okienka. Moim celem było umożliwienie sterowania przezroczystością okien centralnie z jednego programu i to nie zależnie od tego czy okno takie zostało do tego przystosowane czy też nie. Po przeczytaniu tego wpisu, każdy samodzielnie będzie mógł napisać podobną aplikację</p>
<p><span id="more-270"></span></p>
<p>Aby istniała możliwość ustawiania przezroczystości dla okna, musi być ono utworzone w sposób do tego przystosowany. Wystarczy skorzystać z innej funkcji tworzącej okno, nie <code>CreateWindow</code>, a <code>CreateWindowEx</code></p>
<div class="codecolorer-container c mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br /></div></td><td><div class="c codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">HWND CreateWindowEx<span style="color: #009900;">&#40;</span><br />
&nbsp; DWORD dwExStyle<span style="color: #339933;">,</span><br />
&nbsp; LPCTSTR lpClassName<span style="color: #339933;">,</span><br />
&nbsp; LPCTSTR lpWindowName<span style="color: #339933;">,</span><br />
&nbsp; DWORD dwStyle<span style="color: #339933;">,</span><br />
&nbsp; <span style="color: #993333;">int</span> x<span style="color: #339933;">,</span><br />
&nbsp; <span style="color: #993333;">int</span> y<span style="color: #339933;">,</span><br />
&nbsp; <span style="color: #993333;">int</span> nWidth<span style="color: #339933;">,</span><br />
&nbsp; <span style="color: #993333;">int</span> nHeight<span style="color: #339933;">,</span><br />
&nbsp; HWND hWndParent<span style="color: #339933;">,</span><br />
&nbsp; HMENU hMenu<span style="color: #339933;">,</span><br />
&nbsp; HINSTANCE hInstance<span style="color: #339933;">,</span><br />
&nbsp; LPVOID lpParam<br />
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>To co umożliwia później modyfikacje przezroczystości jest ukryte w ramach dodatkowego stylu okna, podawanego poprzez argument <code>dwExStyle</code>. Lista dopuszczalnych wartości jest długa, ale warto się z nią zapoznać. W tym konkretnym przypadku należy zainteresować się wartością <code>WS_EX_LAYERED</code>, utworzone wtedy okno będzie tzw. Layered Window, które obsługuje modyfikacje przezroczystości. Do ustawienia nowej wartości kanału alpha służy <code>SetLayeredWindowAttributes(HWND hwnd, COLORREF crKey, BYTE bAlpha, DWROD dwFlags)</code> &#8211; szczegóły w dokumentacji.<br />
Pełny kod tworzący przykładowe, półprzezroczyste okno:</p>
<div class="codecolorer-container c mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br /></div></td><td><div class="c codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #339933;">#include &lt;windows.h&gt;</span><br />
<br />
LRESULT CALLBACK WndProc<span style="color: #009900;">&#40;</span>HWND<span style="color: #339933;">,</span> UINT<span style="color: #339933;">,</span> WPARAM<span style="color: #339933;">,</span> LPARAM<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #993333;">int</span> WINAPI WinMain<span style="color: #009900;">&#40;</span>HINSTANCE hInstance<span style="color: #339933;">,</span> &nbsp; HINSTANCE hPrevInstance<span style="color: #339933;">,</span><br />
LPSTR lpCmdLine<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> nCmdShow<span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; MSG msg<span style="color: #339933;">;</span><br />
&nbsp; HWND hwnd<span style="color: #339933;">;</span><br />
&nbsp; WNDCLASSEX wcx<span style="color: #339933;">;</span><br />
&nbsp;<br />
&nbsp; wcx.<span style="color: #202020;">cbSize</span> <span style="color: #339933;">=</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>wcx<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; wcx.<span style="color: #202020;">style</span> <span style="color: #339933;">=</span> CS_HREDRAW <span style="color: #339933;">|</span> CS_VREDRAW<span style="color: #339933;">;</span><br />
&nbsp; wcx.<span style="color: #202020;">lpfnWndProc</span> <span style="color: #339933;">=</span> WndProc<span style="color: #339933;">;</span><br />
&nbsp; wcx.<span style="color: #202020;">cbClsExtra</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span><br />
&nbsp; wcx.<span style="color: #202020;">cbWndExtra</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span><br />
&nbsp; wcx.<span style="color: #202020;">hInstance</span> <span style="color: #339933;">=</span> hInstance<span style="color: #339933;">;</span><br />
&nbsp; wcx.<span style="color: #202020;">hIcon</span> <span style="color: #339933;">=</span> LoadIcon<span style="color: #009900;">&#40;</span>NULL<span style="color: #339933;">,</span> IDI_APPLICATION<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; wcx.<span style="color: #202020;">hCursor</span> <span style="color: #339933;">=</span> LoadCursor<span style="color: #009900;">&#40;</span>NULL<span style="color: #339933;">,</span> IDC_ARROW<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; wcx.<span style="color: #202020;">hbrBackground</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>HBRUSH<span style="color: #009900;">&#41;</span>GetStockObject<span style="color: #009900;">&#40;</span>WHITE_BRUSH<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; wcx.<span style="color: #202020;">lpszMenuName</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>LPCSTR<span style="color: #009900;">&#41;</span><span style="color: #ff0000;">&quot;MainMenu&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; wcx.<span style="color: #202020;">lpszClassName</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>LPCSTR<span style="color: #009900;">&#41;</span><span style="color: #ff0000;">&quot;MainWClass&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; wcx.<span style="color: #202020;">hIconSm</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>HICON<span style="color: #009900;">&#41;</span>LoadImage<span style="color: #009900;">&#40;</span>hInstance<span style="color: #339933;">,</span> MAKEINTRESOURCE<span style="color: #009900;">&#40;</span>5<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> IMAGE_ICON<span style="color: #339933;">,</span><br />
&nbsp; GetSystemMetrics<span style="color: #009900;">&#40;</span>SM_CXSMICON<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> GetSystemMetrics<span style="color: #009900;">&#40;</span>SM_CYSMICON<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span>UINT<span style="color: #009900;">&#41;</span>LR_DEFAULTCOLOR<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; RegisterClassEx<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>wcx<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; hwnd <span style="color: #339933;">=</span> CreateWindowEx<span style="color: #009900;">&#40;</span>WS_EX_LAYERED<span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span>LPCSTR<span style="color: #009900;">&#41;</span><span style="color: #ff0000;">&quot;MainWClass&quot;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span>LPCSTR<span style="color: #009900;">&#41;</span><span style="color: #ff0000;">&quot;Sample&quot;</span><span style="color: #339933;">,</span> WS_OVERLAPPEDWINDOW<span style="color: #339933;">,</span> CW_USEDEFAULT<span style="color: #339933;">,</span> &nbsp;CW_USEDEFAULT<span style="color: #339933;">,</span> CW_USEDEFAULT<span style="color: #339933;">,</span> CW_USEDEFAULT<span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span>HWND<span style="color: #009900;">&#41;</span>NULL<span style="color: #339933;">,</span> &nbsp;<span style="color: #009900;">&#40;</span>HMENU<span style="color: #009900;">&#41;</span>NULL<span style="color: #339933;">,</span> hInstance<span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span>LPVOID<span style="color: #009900;">&#41;</span> NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; ShowWindow<span style="color: #009900;">&#40;</span>hwnd<span style="color: #339933;">,</span> nCmdShow<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; SetLayeredWindowAttributes<span style="color: #009900;">&#40;</span>hwnd<span style="color: #339933;">,</span> 0<span style="color: #339933;">,</span> 180<span style="color: #339933;">,</span> LWA_ALPHA<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; UpdateWindow<span style="color: #009900;">&#40;</span>hwnd<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>GetMessage<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>msg<span style="color: #339933;">,</span> NULL<span style="color: #339933;">,</span> &nbsp;0<span style="color: #339933;">,</span> 0<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><br />
&nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; TranslateMessage<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>msg<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; DispatchMessage<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>msg<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; <span style="color: #b1b100;">return</span> msg.<span style="color: #202020;">wParam</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
LRESULT CALLBACK WndProc<span style="color: #009900;">&#40;</span>HWND hwnd<span style="color: #339933;">,</span> UINT uMsg<span style="color: #339933;">,</span> WPARAM wParam<span style="color: #339933;">,</span> LPARAM lParam<span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #b1b100;">switch</span><span style="color: #009900;">&#40;</span>uMsg<span style="color: #009900;">&#41;</span><br />
&nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">case</span> WM_CREATE<span style="color: #339933;">:</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #b1b100;">case</span> WM_PAINT<span style="color: #339933;">:</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #b1b100;">case</span> WM_DESTROY<span style="color: #339933;">:</span><br />
&nbsp; &nbsp; &nbsp; PostQuitMessage<span style="color: #009900;">&#40;</span>0<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #b1b100;">default</span><span style="color: #339933;">:</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> DefWindowProc<span style="color: #009900;">&#40;</span>hwnd<span style="color: #339933;">,</span> uMsg<span style="color: #339933;">,</span> wParam<span style="color: #339933;">,</span> lParam<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>To co należy zrobić, aby kontrolować przezroczystość okien innych niż własne przedstawia się następująco:</p>
<ol>
<li>1. Pobrać wszystkie otwarte okna typu top-level</li>
<li>2. Nadać oknom styl <code>dwExStyle</code></li>
<li>3. Zmienić wartość kanału alpha</li>
</ol>
<p><strong>1. Pobrać wszystkie otwarte okna typu top-level</strong><br />
Dobrym pomysłem wydaje się pobranie uchwytu do rodzica wszystkich okien(Desktop/Pulpit) i przejście w pętli po liście jego dzieci (jak wiadomo każde okno ma kilka przydatnych wskaźników, między innymi do okna-brata). Mogłoby to wyglądać tak:</p>
<div class="codecolorer-container c mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td><div class="c codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">HWND hDesktop <span style="color: #339933;">=</span> GetDesktopWindow<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
HWND hChild <span style="color: #339933;">=</span> GetWindow<span style="color: #009900;">&#40;</span>hDesktop<span style="color: #339933;">,</span> GW_CHILD<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
HWND hTemp<span style="color: #339933;">;</span><br />
<span style="color: #808080; font-style: italic;">/* ... */</span><br />
<span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>hTemp <span style="color: #339933;">!=</span> GetWindow<span style="color: #009900;">&#40;</span>hChild<span style="color: #339933;">,</span> GW_HWNDLAST<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #808080; font-style: italic;">/* ... */</span><br />
&nbsp; hTemp <span style="color: #339933;">=</span> GetWindow<span style="color: #009900;">&#40;</span>hChild<span style="color: #339933;">,</span> GW_HWNDNEXT<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>Pomysł <strong>zły</strong> ! Okazuje się że taka pętla może działać w nieskończoność. Wzmianaka na temat takiego przypadku znajduje się nawet w dokumentacji. Dlatego należy wykorzystać inny sposób, polegający na użyciu funkcji <code>BOOL EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam)</code>:</p>
<div class="codecolorer-container c mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br /></div></td><td><div class="c codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">EnumWindows<span style="color: #009900;">&#40;</span>EnumWindowsProc<span style="color: #339933;">,</span> NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #808080; font-style: italic;">/* ... */</span><br />
BOOL CALLBACK EnumWindowsProc<span style="color: #009900;">&#40;</span>HWND hwndChild<span style="color: #339933;">,</span> LPARAM lParam<span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #993333;">char</span> buffer<span style="color: #009900;">&#91;</span>100<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; <span style="color: #993333;">int</span> count <span style="color: #339933;">=</span> GetWindowText<span style="color: #009900;">&#40;</span>hwndChild<span style="color: #339933;">,</span> buffer<span style="color: #339933;">,</span> 100<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>count <span style="color: #339933;">&amp;&amp;</span> IsWindowVisible<span style="color: #009900;">&#40;</span>hwndChild<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><br />
&nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">/* ... */</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <span style="color: #b1b100;">return</span> TRUE<span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p><strong>2. Nadać oknom styl <code>dwExStyle</code></strong><br />
Wydaje się najtrudniejsze, przecież dodatkowy styl należy podać przy tworzeniu okna, a okna które widzimy zostały już przecież utworzone. Na szczęście z pomocą przychodzi funkcja <code>LONG SetWindowLong(HWND hWnd, int iIndex, LONG dwNewLong)</code>:</p>
<div class="codecolorer-container c mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="c codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">SetWindowLong<span style="color: #009900;">&#40;</span>hwndChild<span style="color: #339933;">,</span> GWL_EXSTYLE<span style="color: #339933;">,</span> WS_EX_LAYERED<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p><strong>3. Zmienić wartość kanału alpha</strong><br />
Bardziej uważni czytelnicy już na pewno wiedzą jak wygląda zestaw parametrów i jak skorzystać z <code>SetLayeredWindowAttributes</code>. Wykorzystanie pokazane 3 listingi wyżej, przy okazji tworzenia &#8222;własnego&#8221; przezroczystego okna.</p>
<p>I to tyle  tym temacie, wypada jeszcze stworzyć GUI, może obsługę tray&#8217;a. Program wydaje się &#8222;magiczny&#8221; a korzysta raptem z 4 funkcji API systemowego.</p>
]]></content:encoded>
			<wfw:commentRss>http://piotr.doniec.eu/devlog/2009/10/przezroczyste-okienka-z-winapi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tworzenie okienka w asm</title>
		<link>http://piotr.doniec.eu/devlog/2009/09/tworzenie-okienka-w-asm/</link>
		<comments>http://piotr.doniec.eu/devlog/2009/09/tworzenie-okienka-w-asm/#comments</comments>
		<pubDate>Wed, 02 Sep 2009 12:08:45 +0000</pubDate>
		<dc:creator>pejotr</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[asm]]></category>
		<category><![CDATA[winapi]]></category>

		<guid isPermaLink="false">http://piotr.doniec.eu/devlog/?p=244</guid>
		<description><![CDATA[Wiadomo że stworzenie okienka przy wykorzystaniu języka C i WinAPI nie jest zadaniem trudnym. Nawet w dokumentacji od MS można znaleźć gotowy przykład. Jest to natomiast zadanie bardzo żmudne i z reguły z pełnym zrozumieniem pól i dopuszczalnych wartości dla wymaganych struktur robi się to tylko raz. Potem albo się kopiuje gotowy standardowy kod wprowadzając]]></description>
			<content:encoded><![CDATA[<p>Wiadomo że stworzenie okienka przy wykorzystaniu języka C i WinAPI nie jest zadaniem trudnym. Nawet w dokumentacji od MS można znaleźć gotowy przykład. Jest to natomiast zadanie bardzo żmudne i z reguły z pełnym zrozumieniem pól i dopuszczalnych wartości dla wymaganych struktur robi się to tylko raz. Potem albo się kopiuje gotowy standardowy kod wprowadzając tylko pewne czasami zmiany odbiegającego od typowego zastosowania, albo przyjmuje że &#8222;się umie&#8221; i &#8222;zna fundament&#8221; i przesiada na WindowsForms. Ale można pójść w drugą stronę, stworzyć okienko w assmeblerze i tym samym uzyskać miano rycerza hardcoru.<span id="more-244"></span></p>
<p>Może dziwić ale zbudowanie okna korzystając z języka maszynowego nie jest trudno. Objętość programu jest zbliżona do tego utworzonego standardowo z wykorzystaniem C. Ponadto korzystając z kompilatora dostarczonego przez Microsoft (MASM) istnieje możliwość bardzo łatwego dostępu do funkcji API systemu Windows. Ponad to kompilator dostarcza wiele ułatwiających życie makr.</p>
<div class="codecolorer-container asm mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br /></div></td><td><div class="asm codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #339933;">.</span><span style="color: #000000; font-weight: bold;">386</span><br />
<span style="color: #000000; font-weight: bold;">.model</span> <span style="color: #000000; font-weight: bold;">flat</span><span style="color: #339933;">,</span><span style="color: #000000; font-weight: bold;">stdcall</span><br />
<span style="color: #000000; font-weight: bold;">option</span> <span style="color: #000000; font-weight: bold;">casemap</span><span style="color: #339933;">:</span><span style="color: #000000; font-weight: bold;">none</span><br />
<span style="color: #000000; font-weight: bold;">include</span> &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">c</span><span style="color: #339933;">:</span>\masm32\<span style="color: #000000; font-weight: bold;">include</span>\windows<span style="color: #339933;">.</span><span style="color: #00007f; font-weight: bold;">inc</span><br />
<span style="color: #000000; font-weight: bold;">include</span> &nbsp;<span style="color: #000000; font-weight: bold;">c</span><span style="color: #339933;">:</span>\masm32\<span style="color: #000000; font-weight: bold;">include</span>\user32<span style="color: #339933;">.</span><span style="color: #00007f; font-weight: bold;">inc</span><br />
<span style="color: #000000; font-weight: bold;">includelib</span>&nbsp; <span style="color: #000000; font-weight: bold;">c</span><span style="color: #339933;">:</span>\masm32\lib\user32<span style="color: #339933;">.</span>lib<br />
<span style="color: #000000; font-weight: bold;">include</span> &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">c</span><span style="color: #339933;">:</span>\masm32\<span style="color: #000000; font-weight: bold;">include</span>\kernel32<span style="color: #339933;">.</span><span style="color: #00007f; font-weight: bold;">inc</span><br />
<span style="color: #000000; font-weight: bold;">includelib</span>&nbsp; <span style="color: #000000; font-weight: bold;">c</span><span style="color: #339933;">:</span>\masm32\lib\kernel32<span style="color: #339933;">.</span>lib<br />
<br />
WinMain <span style="color: #000000; font-weight: bold;">proto</span> <span style="color: #339933;">:</span><span style="color: #000000; font-weight: bold;">DWORD</span><span style="color: #339933;">,:</span><span style="color: #000000; font-weight: bold;">DWORD</span><span style="color: #339933;">,:</span><span style="color: #000000; font-weight: bold;">DWORD</span><span style="color: #339933;">,:</span><span style="color: #000000; font-weight: bold;">DWORD</span><br />
<br />
<span style="color: #000000; font-weight: bold;">.data</span> <span style="color: #666666; font-style: italic;">; zainicjalizowanie zmienne</span><br />
&nbsp; &nbsp;ClassName <span style="color: #000000; font-weight: bold;">db</span> <span style="color: #7f007f;">&quot;SimpleWinClass&quot;</span><span style="color: #339933;">,</span>0<br />
&nbsp; &nbsp;AppName <span style="color: #000000; font-weight: bold;">db</span> <span style="color: #7f007f;">&quot;Our first Window&quot;</span><span style="color: #339933;">,</span>0<br />
<span style="color: #000000; font-weight: bold;">.data</span>?&nbsp; &nbsp;<span style="color: #666666; font-style: italic;">; niezainicjalizowane zmienne</span><br />
&nbsp; &nbsp;hInstance HINSTANCE ?<br />
&nbsp; &nbsp;CommandLine LPSTR ?<br />
<span style="color: #000000; font-weight: bold;">.code</span><br />
&nbsp; &nbsp;start<span style="color: #339933;">:</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">invoke</span> GetModuleHandle<span style="color: #339933;">,</span>NULL<br />
&nbsp; &nbsp; &nbsp; <span style="color: #00007f; font-weight: bold;">mov</span> hInstance<span style="color: #339933;">,</span><span style="color: #00007f;">eax</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">invoke</span> WinMain<span style="color: #339933;">,</span>hInstance<span style="color: #339933;">,</span>NULL<span style="color: #339933;">,</span>CommandLine<span style="color: #339933;">,</span>SW_SHOWDEFAULT<br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">invoke</span> ExitProcess<span style="color: #339933;">,</span>0<br />
&nbsp; &nbsp; &nbsp; <br />
WinMain <span style="color: #000000; font-weight: bold;">proc</span> hInst<span style="color: #339933;">:</span>HINSTANCE<span style="color: #339933;">,</span>hPrevInst<span style="color: #339933;">:</span>HINSTANCE<span style="color: #339933;">,</span>CmdLine<span style="color: #339933;">:</span>LPSTR<span style="color: #339933;">,</span>CmdShow<span style="color: #339933;">:</span><span style="color: #000000; font-weight: bold;">DWORD</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">LOCAL</span> wc<span style="color: #339933;">:</span>WNDCLASSEX<br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">LOCAL</span> msg<span style="color: #339933;">:</span>MSG<br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">LOCAL</span> hwnd<span style="color: #339933;">:</span>HWND<br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp;<span style="color: #00007f; font-weight: bold;">mov</span> wc<span style="color: #339933;">.</span>cbSize<span style="color: #339933;">,</span><span style="color: #000000; font-weight: bold;">SIZEOF</span> WNDCLASSEX<br />
&nbsp; &nbsp;<span style="color: #00007f; font-weight: bold;">mov</span> wc<span style="color: #339933;">.</span>style<span style="color: #339933;">,</span>CS_HREDRAW <span style="color: #00007f; font-weight: bold;">or</span> CS_VREDRAW<br />
&nbsp; &nbsp;<span style="color: #00007f; font-weight: bold;">mov</span> wc<span style="color: #339933;">.</span>lpfnWndProc<span style="color: #339933;">,</span><span style="color: #000000; font-weight: bold;">OFFSET</span> WndProc<br />
&nbsp; &nbsp;<span style="color: #00007f; font-weight: bold;">mov</span> wc<span style="color: #339933;">.</span>cbClsExtra<span style="color: #339933;">,</span>NULL<br />
&nbsp; &nbsp;<span style="color: #00007f; font-weight: bold;">mov</span> wc<span style="color: #339933;">.</span>cbWndExtra<span style="color: #339933;">,</span>NULL<br />
&nbsp; &nbsp;<span style="color: #00007f; font-weight: bold;">push</span> hInstance<br />
&nbsp; &nbsp;<span style="color: #00007f; font-weight: bold;">pop</span> wc<span style="color: #339933;">.</span>hInstance<br />
&nbsp; &nbsp;<span style="color: #00007f; font-weight: bold;">mov</span> wc<span style="color: #339933;">.</span>hbrBackground<span style="color: #339933;">,</span>COLOR_WINDOW<span style="color: #339933;">+</span>1<br />
&nbsp; &nbsp;<span style="color: #00007f; font-weight: bold;">mov</span> wc<span style="color: #339933;">.</span>lpszMenuName<span style="color: #339933;">,</span>NULL<br />
&nbsp; &nbsp;<span style="color: #00007f; font-weight: bold;">mov</span> wc<span style="color: #339933;">.</span>lpszClassName<span style="color: #339933;">,</span> <span style="color: #000000; font-weight: bold;">OFFSET</span> ClassName<br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">invoke</span> LoadIcon<span style="color: #339933;">,</span>NULL<span style="color: #339933;">,</span>IDI_APPLICATION<br />
&nbsp; &nbsp;<span style="color: #00007f; font-weight: bold;">mov</span> wc<span style="color: #339933;">.</span>hIcon<span style="color: #339933;">,</span><span style="color: #00007f;">eax</span><br />
&nbsp; &nbsp;<span style="color: #00007f; font-weight: bold;">mov</span> wc<span style="color: #339933;">.</span>hIconSm<span style="color: #339933;">,</span><span style="color: #00007f;">eax</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">invoke</span> LoadCursor<span style="color: #339933;">,</span>NULL<span style="color: #339933;">,</span>IDC_ARROW<br />
&nbsp; &nbsp;<span style="color: #00007f; font-weight: bold;">mov</span> wc<span style="color: #339933;">.</span>hCursor<span style="color: #339933;">,</span><span style="color: #00007f;">eax</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">invoke</span> RegisterClassEx<span style="color: #339933;">,</span><span style="color: #000000; font-weight: bold;">addr</span> wc <br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">invoke</span> CreateWindowEx<span style="color: #339933;">,</span>NULL<span style="color: #339933;">,</span>\<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">ADDR</span> ClassName<span style="color: #339933;">,</span>\<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">ADDR</span> AppName<span style="color: #339933;">,</span>\<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WS_OVERLAPPEDWINDOW<span style="color: #339933;">,</span>\<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CW_USEDEFAULT<span style="color: #339933;">,</span>\<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CW_USEDEFAULT<span style="color: #339933;">,</span>\<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CW_USEDEFAULT<span style="color: #339933;">,</span>\<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CW_USEDEFAULT<span style="color: #339933;">,</span>\<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NULL<span style="color: #339933;">,</span>\<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NULL<span style="color: #339933;">,</span>\<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hInst<span style="color: #339933;">,</span>\<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NULL <br />
&nbsp; &nbsp; <span style="color: #00007f; font-weight: bold;">mov</span> hwnd<span style="color: #339933;">,</span><span style="color: #00007f;">eax</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">invoke</span> ShowWindow<span style="color: #339933;">,</span>hwnd<span style="color: #339933;">,</span>CmdShow<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">invoke</span> UpdateWindow<span style="color: #339933;">,</span>hwnd &nbsp; &nbsp;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #339933;">.</span><span style="color: #000000; font-weight: bold;">WHILE</span> TRUE<br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">invoke</span> GetMessage<span style="color: #339933;">,</span><span style="color: #000000; font-weight: bold;">ADDR</span> msg<span style="color: #339933;">,</span>NULL<span style="color: #339933;">,</span>0<span style="color: #339933;">,</span>0<br />
&nbsp; &nbsp; &nbsp; <span style="color: #339933;">.</span><span style="color: #000000; font-weight: bold;">BREAK</span> <span style="color: #339933;">.</span><span style="color: #000000; font-weight: bold;">IF</span><span style="color: #009900; font-weight: bold;">&#40;</span>!<span style="color: #00007f;">eax</span><span style="color: #009900; font-weight: bold;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">invoke</span> TranslateMessage<span style="color: #339933;">,</span><span style="color: #000000; font-weight: bold;">ADDR</span> msg<br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">invoke</span> DispatchMessage<span style="color: #339933;">,</span><span style="color: #000000; font-weight: bold;">ADDR</span> msg<br />
&nbsp; &nbsp; <span style="color: #339933;">.</span><span style="color: #000000; font-weight: bold;">ENDW</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">eax</span><span style="color: #339933;">,</span>msg<span style="color: #339933;">.</span>wParam &nbsp; <br />
&nbsp; &nbsp;<span style="color: #00007f; font-weight: bold;">ret</span><br />
<br />
WinMain <span style="color: #000000; font-weight: bold;">endp</span><br />
<br />
<br />
WndProc <span style="color: #000000; font-weight: bold;">proc</span> hWnd<span style="color: #339933;">:</span>HWND<span style="color: #339933;">,</span>uMsg<span style="color: #339933;">:</span>UINT<span style="color: #339933;">,</span>wParam<span style="color: #339933;">:</span>WPARAM<span style="color: #339933;">,</span>lParam<span style="color: #339933;">:</span>LPARAM<br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp;<span style="color: #339933;">.</span><span style="color: #000000; font-weight: bold;">IF</span> uMsg==WM_DESTROY<br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">invoke</span> PostQuitMessage<span style="color: #339933;">,</span>NULL<br />
&nbsp; &nbsp;<span style="color: #339933;">.</span><span style="color: #000000; font-weight: bold;">ELSE</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">invoke</span> DefWindowProc<span style="color: #339933;">,</span>hWnd<span style="color: #339933;">,</span>uMsg<span style="color: #339933;">,</span>wParam<span style="color: #339933;">,</span>lParam<br />
&nbsp; &nbsp; &nbsp; <span style="color: #00007f; font-weight: bold;">ret</span><br />
&nbsp; &nbsp;<span style="color: #339933;">.</span><span style="color: #000000; font-weight: bold;">ENDIF</span><br />
&nbsp; &nbsp;<span style="color: #00007f; font-weight: bold;">xor</span> <span style="color: #00007f;">eax</span><span style="color: #339933;">,</span><span style="color: #00007f;">eax</span><br />
&nbsp; &nbsp;<span style="color: #00007f; font-weight: bold;">ret</span><br />
<br />
WndProc <span style="color: #000000; font-weight: bold;">endp</span><br />
<br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">end</span> start</div></td></tr></tbody></table></div>
<p>Nie ma co wiele tłumaczyć. Kod jaki jest interpretowany przez MASM wygląda już niemalże jak język wysokiego poziomu(niektórzy mówią że C to język niskiego poziomu, ale to dlatego że nie umieli znaleźć określenia dla Javy, C# itp.) Bardzo fajnym makrem jest <code>invoke</code> uruchamiające zadaną procedurę i umożliwiające podanie listy argumentów poprzez rozdzielenie przecinkiem. Bardzo przyjemna alternatywa dla push&#8217;owania w odwrotnej kolejności.<br />
Jedyny wniosek jaki można wysnuć to to że jeżeli ktoś umie programować z wykorzystaniem WinAPI w C, to i bez problemu zastosuje go w assemblerze. Oczywiście nie ma obowiązku korzystania z MASM, do API można się także dostać korzystać z innych assemblerów np. NASM ( polacam zapoznanie się z nasmx).</p>
]]></content:encoded>
			<wfw:commentRss>http://piotr.doniec.eu/devlog/2009/09/tworzenie-okienka-w-asm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
