[niby-tut,very ale to very easy mode]GUI - to proste!(jak parabola)

5.56

Użytkownik
Dołączył
Luty 1, 2010
Posty
102
Zabierałem się raz do pisania tutoriala z jakiejś okazji - niestety, wyszedł trochę... dziwny i o dosyć prostym temacie, ale może i a nóż, widelec ktoś skorzysta(a raczej się pośmieje)

PS.Ostrzegałem! :D

Rekłirements:
Za kompilator będzie służył MinGW, a z odrobiną wyobraźni można też wykorzystać MS VC++ czy inne cuda
I koniecznie ResEdit - http://www.resedit.net/

1.Prolog

Pan Józef był stróżem na parkingu. Ale jaki to był parking! Kamery, lasery, działka obrotowe i boilery! Nic, tylko siedzieć i rozwiązywać sudoku.
Aby to sobie ułatwić, napisał sobie w C pewien program, mnożący każdą liczbę przez 5

pierwszyskrin.jpg


Ale na dłuższą metę pana Józefa wkurzało wprowadzanie nazwy exeka, i numeru, no i w ogóle to jakieś brzydkie wszystko było, czarnawe jakby ktoś przypalił czy ki cholera

drugiskrin.jpg


Nawet graficzny loader od kumpla ze stróżówki z bloku nieopodal nie załatwił sprawy, bo...A zresztą, sami zobaczcie:

trzeciskrin.jpg


czwartyskrin.jpg


Zmuszony koniecznością, pan Józef postanowił jedno - napisać wersję superprogrammnozacykazdapodanaliczbeprzez5 z GUI.

2.Pierwsze starcie


Jako że Józef potrafił korzystać z google, poszukał trochę i trafił na pierwszy, lepszy kurs winapi.
Ale chwila lektury...

pityskrin.jpg


...przyprawiła go o dreszcze. A po cholerę tyle zmiennych?! I skąd te uchwyty?! To kurs na pisanie programu, czy remontowanie łazienki?!

Wtem nasz główny bohater przypomniał sobie, jak jego żona, Bożena, dzisiaj rano rozmawiała przez telefon z koleżanką, i coś chyba wspominała, czy wręcz pouczała koleżankę, że na dialogach podobno łatwiej się gui pisze, ale tak podobno nie wypada...

3.Reaktywacja

Po dwóch chwilach w google i czterech piwach w żołądku pan Józef odkrył o jakie dialogi chodziło jego żonie. I nie był to dialog pomiędzy religiami, narodami, czy **** tam wie kto jeszcze może rozmawiać, ani konkurent tepsy, tylko takie okienko!

Wziął z sieci pierwsze, lepsze, narzędzie(ResEdit!), skonfigurował(podejrzewam że dodadnie folderu "incldue" z kompilatora nie sprawi większości większych trudośći?), dodał dialog(CRTL+D, lub LPM->Add resource..->Dialog), wrzucił kilka kontrolek, pokonfigurował, że wyszło coś takiego:

szstyskrin.jpg


(Widzicie tą opcję na górze? Jak będziecie się bawić w ustawianie kontrolek, to polecam ją włączyć, wtedy będzie wam automatycznie wyrówynwało do innych kontrolek i do ramki)(tak, wiem że suma summarum nie ma staticbox'a tylko jest disabled editbox,dop.autor)

Potem odpalił edit.com, i z otwartym msdn'em w tle skrobnął taki program:

Kod:
#include <Windows.h>
#include <stdio.h>
#include "resource.h" //Ten plik powinien nam wygenerowac ResEdit

int CALLBACK DialogProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR costam, int nCmdShow) //Dlaczego juz winapi? Aby miec hInstance i nie miec konsoli w tle
{
	int i = DialogBox( 	hInstance, // uchwyt do aplikacji, gdzie znajduje sie template dialogu
						MAKEINTRESOURCE( IDD_DIALOG1 ), //id dialogu w rc
						0, // rodzic okna, nie mamy
						DialogProc );//callback odpowiedzialny za dzialanie okna
	return i;
}

int CALLBACK DialogProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch(uMsg)  //To jest tzw.petla komunikatow
	{
		case WM_COMMAND: //jezeli uzytkownik cokolwiek zrobi(cos kliknie, etc), wtedy uMsg bedzie rowne stalej WM_COMMAND
			if( wParam == IDC_BUTTON1 ) //a wParam bedzie rowne temu co sie kliknelo
			{
				int i = GetDlgItemInt( hWnd, IDC_EDIT1, 0, 0); //WinApi daje nam piekne funkcje dzieki ktorym nie musimy bawic sie buforami i sscanfami
				SetDlgItemInt( hWnd, IDC_EDIT2, i*5, 1); //tak samo jak wyzej
			}
			break;
		default:
			DefWindowProc( hWnd, uMsg, wParam, lParam); //niech windows sobie z dialogem radzi jak nic ciekawego sie nie zdarzylo
	}
	return 0;
}

Następnie nałożył specjalną czapkę dzięki której lepiej mu się pisało w konsoli, odpalił linię poleceń, ustawił patha na mingw\bin, i wziął się za klepanie formułek:

Kod:
windres -i [COLOR="#ff8c00"]dialogtozlotepsarzadzi.rc[/COLOR] -o [COLOR="#800080"]dialogi.res[/COLOR] --output-format=coff 
gcc -Xlinker [COLOR="#800080"]dialogi.res[/COLOR] -o [COLOR="#00ff00"]dialogz.exe[/COLOR] dialogi.c 
strip [COLOR="#00ff00"]dialogz.exe[/COLOR]

1.Na [COLOR="#ff8c00"]pomarańczowo[/COLOR] wpisujemy plik rc który żeśmy wyklikali w ResEdicie, a na [COLOR="#800080"]fioletowo[/COLOR] nazwę, jaka ma się nazywać po skompilowaniu.
O ile mamy nową wersję MinGW to nie powinno być problemów, starsze mogą się zrzucać o coś z LANGUAGE NEUTRAL, aczkolwiek można to spokojnie z pliku rc wykasować.(A dlaczego kompiluję do coffa, a nie res? Metoda prób i błędów, merytorycznie to cholera wie)
2.Na [COLOR="#00ff00"]zielono[/COLOR] nazwa pliku wyjściowego, a [COLOR="#800080"]fioletowo[/COLOR] nazwę skomplikowanego pliku rc.
3.A tu taka ciekawostka, o ile nie zamierzamy [COLOR="#00ff00"]aplikacji[/COLOR] w przyszłości debugować to można spokojnie przerzucić przez strip, co wycina jakieś tam duperele(prawie jak trimmowanie gier na DSy, hah)
I otrzymał swój wymarzony program:

enddf.jpg



4.Epilog

I dzięki temu wspaniałemu programowi pan Józef zbił fortunę, ponieważ sporo ludzi zadawało sobie różne dziwne pytania, chociażby jak "A co, gdybym pomnożył swoją datę urodzenia przez 5?". Marzenia tych wszystkich ludzi realizował jeden program - superprogrammnozacykazdapodanaliczbeprzez5 z GUI.


(Tak, wiem, z profesjonalnym artykułem nie ma nic wspólnego :D)
 
Do góry Bottom