Maciej Radzki

Maciej Radzki Report Expert Office
Lead (Associate Line
Manager)

Temat: WinApi

Witam.

Miał ktoś z Państwa z tym do czynienia? Oczywiście pytam, gdyż mam pewien problem...szukam i szukam, ale nie mogę nic znaleźć w sieci i pomyślałem, że może tu 'coś' znajdę. Mam do napisania programik, grę logiczną - "Piętnastka" w języku c++ (WinApi). Niestety moja wiedza na temat WinApi nie sięga aż tak daleko :/ ... więc piszę z taką małą prośbą o pomoc.Maciej Radzki edytował(a) ten post dnia 22.01.08 o godzinie 11:59
Karol Z.

Karol Z. Programista,
elektronik

Temat: WinApi

Macieju...
Konkretnie, zapodaj konkretne pytanie, temat. Nie mamy, tutaj, w zwyczaju odrabiania za nikogo prac domowych, ale chętnie odpowiadamy na pytania. ;)
Maciej Radzki

Maciej Radzki Report Expert Office
Lead (Associate Line
Manager)

Temat: WinApi

Nie, nie ... nie mam na myśli odrabianie...proste, że samemu to napiszę :] Mam na myśli jakąś podpowiedź -bo nie wiem jak to napisać... każdy 'klocek' będzie obiektem jednej i tej samej klasy? Drugim obiektem ma być plansza? Coś takiego mam na myśli. Oczywiście jak ktoś to kiedyś robił to chętnie rzuciłbym okiem na kod źródłowy :]
Jakub L.

Jakub L. Programista

Temat: WinApi

Ewidentne zadanie domowe.
Zacząłbym od przeczytania o modelu MVC, ale druga połowa stycznia to trochę późno na nadrabianie zaległości z całego semestru.
Maciej Radzki

Maciej Radzki Report Expert Office
Lead (Associate Line
Manager)

Temat: WinApi

Ja nie nadrabiam zaległości...chcę po prostu usłyszeć fachowej rady, bo programowaniem się nie zajmuję na co dzień.Maciej Radzki edytował(a) ten post dnia 23.01.08 o godzinie 14:12
Jakub L.

Jakub L. Programista

Temat: WinApi

To nie jest gra w weźmy się i zróbcie.
Jeżeli opiszesz, jaki masz projekt, bo na WinApi to ten problem się nie kończy, to zapewne dostaniesz rady, gdzie moze być lepiej. Jeżeli nie masz zamiaru, to rada: zainstaluj Visuala.
Masz do napisania sztampowy programik i jesteś studentem informatyki, a na dodatek konczy się semestr, a ty się upierasz, że nie jesteś wielbłądem.

konto usunięte

Temat: WinApi

Utworz sobie dynamicznie(w petli, a najlepiej w dwoch petlach for) 16 przyciskow[1]. Dobrze byloby gdyby kazdy z nich mial odpowiedni indentyfikator[2]. Kazdy z przyciskow powinien miec "etykiete" od 1 do 15(kolejnosc losowa) - wyjatkiem jest przycisk z pustym polem, ktory nie powinien miec etykiety. Nalezy uniemozliwic uzytkownikowi, nacisniecie tego przycisku[3].

Jak juz sie z tym uporasz, przechwytujesz zdarzenie BN_CLICKED przycisku o odpowiednim identyfikatorze. Na podstawie tego identyfikatora, oraz identyfikatora przycisku bez etykiety(nalezy go wczesniej zapamietac), mozesz sprawdzic czy ruch jest dozwolony. Jezeli tak, to:
1) pobierasz uchwyt klikanego przycisku[4]
2) pobierasz uchwyt przycisku o pustej etykiecie[4]
3) Zamieniasz etykiety(nie mylic z identyfikatorem)[5]
4) Zapamietujesz, ktory przycisk jest teraz bez etykiety
5) Umozliwiasz klikniecie przycisku, ktory nie mial wczesniej etykiety[3].
6) Uniemozliwiasz klikniecie przycisku, ktory zostal klikniety[3]
7) Sprawdzasz czy uzytkownik poradzil sobie z lamiglowka(na podstawie identyfikatorow).

Pisalem troche na szybko. Pisz w razie niejasnosci.

[1] Funkcja CreateWindow - pierwszym parametrem jest nazwa klasy okna(w tym przypadku "BUTTON").
[2] Dziewiaty parametr funkcji CreateWindow
[3] EnableWindow
[4] GetDlgItem
[5] SetWindowText
Maciej Radzki

Maciej Radzki Report Expert Office
Lead (Associate Line
Manager)

Temat: WinApi

Hmm...zastanawiam się jeszcze jak wyświetlić planszę po wykonaniu ruchu.
1> Wyświetlam planszę
2> Gracz wykonuje ruch
3> Sprawdzam czy ruch jest dozwolony
4> Podmieniam Etykietę pustego pola na etykietę przycisku
3> Wyświetlam planszę od początku

?

konto usunięte

Temat: WinApi

Hmm...zastanawiam się jeszcze jak wyświetlić planszę po wykonaniu ruchu.

Nie wyswietlasz planszy po wykonaniu ruchu. Na tym wlasnie polega cala prostota :)

Stworz 16 przyciskow na takich pozycjach, zeby przypominaly szachownice. Jak do tego dojdziesz, zrozumiesz w czym rzecz.

Przyciskow nie bedziesz musial wyswietlac recznie, jezeli ustawisz ich styl na: WS_CHILD | WS_VISIBLE

Styl, o ktorym mowa, podajesz w trzecim parametrze funkcji CreateWindow. Nie zapomnij tez o pierwszym parametrze(uchwyt do okna rodzica - czyli do okna glownego aplikacji)
Maciej Radzki

Maciej Radzki Report Expert Office
Lead (Associate Line
Manager)

Temat: WinApi

Hmm...problem w tym, że nie jestem na tak wysokim poziomie w programowaniu w WinApi :/ Póki co stworzyłem w pełni działające menu i reagowanie programu na przyciski z klawiatury. Teraz staram się coś nawydziwiać, żeby wyświetlić planszę. Staram się znaleźć coś ciekawego na http://winapi.org, ale coś powoli mi to idzie :/ Przydałby mi się jakiś przykładowy fragment kodu, na którym mógłbym się wzorować...

konto usunięte

Temat: WinApi

Zakladam, ze masz aplikacje okienkowa a w niej menu? Jezeli tak, to rzuc kodem - latwiej bedzie Ci pomoc.
Maciej Radzki

Maciej Radzki Report Expert Office
Lead (Associate Line
Manager)

Temat: WinApi


#include <windows.h>

LPSTR NazwaKlasy = "Klasa Okienka";
MSG Komunikat;
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
HWND g_hPrzycisk;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{

//WYPEŁNIANIE STRUKTURY
WNDCLASSEX wc;

wc.cbSize = sizeof(WNDCLASSEX);
wc.style = 0;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName = NULL;
wc.lpszClassName = NazwaKlasy;
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

//REJESTROWANIE KLASY OKNA
if(!RegisterClassEx(&wc))
{
MessageBox(NULL, "ERROR", "Nieudana rejestracja okna", MB_ICONEXCLAMATION | MB_OK);
return 1;
}

//TWORZENIE OKNA
HWND hwnd;

hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, NazwaKlasy, "Oto okienko", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 500, 300, NULL, NULL, hInstance, NULL);

int x = 10;
int y = 10;

//itoa(i)

for (int i = 1; i <= 15; i++){
g_hPrzycisk = CreateWindowEx(0, "BUTTON", "1", WS_CHILD | WS_VISIBLE, x, y, 30, 30, hwnd, NULL, hInstance, NULL);
x = x+30;
if (x==130){
x = 10;
y = y + 30;
}
}
g_hPrzycisk = CreateWindowEx(0, "BUTTON", NULL, WS_CHILD | WS_VISIBLE, x, y, 30, 30, hwnd, NULL, hInstance, NULL);

if(hwnd==NULL)
{
MessageBox(NULL, "ERROR", "Nieoczekiwany błąd", MB_ICONEXCLAMATION);
return 1;
}

ShowWindow(hwnd, nCmdShow); //Pokaż okienko...
UpdateWindow(hwnd);

//Pętla komunikatów
while(GetMessage(&Komunikat, NULL, 0, 0))
{
TranslateMessage(&Komunikat);
DispatchMessage(&Komunikat);
}
return Komunikat.wParam;
}

//OBSŁUGA ZDARZEŃ
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}



Sorry, że dopiero teraz. Trochę mi zajęło, zanim to ogarnąłem. Mam takie pytania co do tego kodu:
1) Jak zrobić, żeby przycisk się nazywał (obecnie nazywają sie 1) tak, jaką wartość ma obecnie i?
2) Jak zrobić reakcję programu na przyciski? :/ O tym czytałem, coś tam, że generuje się jakieś WM_COMMAND, ale niestety nie ogarniam tego i nie wiem o co chodzi :/
3) Przy okazji...jak zrobić z tego "kod"?Maciej Radzki edytował(a) ten post dnia 28.01.08 o godzinie 15:07
Maciej Radzki

Maciej Radzki Report Expert Office
Lead (Associate Line
Manager)

Temat: WinApi

Ok, z nazewnictwem guzików właśnie sobie poradziłem :) Teraz jak tylko ustawić na każdym jakąś reakcję...? :/

konto usunięte

Temat: WinApi

for (int i = 1; i <= 15; i++){
g_hPrzycisk = CreateWindowEx(0, "BUTTON", "1", WS_CHILD | WS_VISIBLE, x, y, 30, 30, hwnd, NULL, hInstance, NULL);

Zapomniales o ID buttona:

CreateWindowEx(0, "BUTTON", "1", WS_CHILD | WS_VISIBLE, x, y, 30, 30, hwnd, (HMENU)i, hInstance, NULL);

Zwracany HWND tez Ci sie raczej nie przyda.

//OBSŁUGA ZDARZEŃ
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{


LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
switch(msg)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);

/*ktorys z przyciskow zostal klikniety*/
if (wmId >= 1 && wmId <= 16 && wmEvent == BN_CLICKED)
{
/*wmID - na podstawie tej zmiennej wiemy, ktory z przyciskow zostal nacisniety*/
}
break;
1) Jak zrobić, żeby przycisk się nazywał (obecnie nazywają sie 1) tak, jaką wartość ma obecnie i?

Zdaje sie, ze problem juz nieaktualny :)
2) Jak zrobić reakcję programu na przyciski? :/ O tym czytałem, coś tam, że generuje się jakieś WM_COMMAND, ale niestety nie ogarniam tego i nie wiem o co chodzi :/

Patrz wyzej.
3) Przy okazji...jak zrobić z tego "kod"?

Z czego? :)Tomasz K. edytował(a) ten post dnia 28.01.08 o godzinie 19:34
Maciej Radzki

Maciej Radzki Report Expert Office
Lead (Associate Line
Manager)

Temat: WinApi

Rządzisz!!! Dzięki WIELKIE! Działa dokładnie tak jak chciałem :))) Teraz tylko muszę wrzucić algorytm do 'piętnastki' i program będzie gotowy (no, prawie gotowy :))
Co do mojego 3-go pytania, chciałem wrzucić ten tekst w formacie 'code', żeby było ze wcięciami itp...a nie czystym tekstem. Myślałem, że [code] ... [\code], ale to nie to
Maciej Radzki

Maciej Radzki Report Expert Office
Lead (Associate Line
Manager)

Temat: WinApi

hmm...a jak pole pole jest puste?
"if (wmId==NULL)" ani "if (wmId==16)" nie działa...Maciej Radzki edytował(a) ten post dnia 29.01.08 o godzinie 11:41

konto usunięte

Temat: WinApi

Maciej Radzki:
hmm...a jak pole pole jest puste?
"if (wmId==NULL)" ani "if (wmId==16)" nie działa...Maciej Radzki edytował(a) ten post dnia 29.01.08 o godzinie 11:41

Miales tam dwa wywolania funkcji CreateWindowEx. Pierwsze w petli, drugie poza nia. Pewnie nie ustawiles identyfikatora w tym drugim wywolaniu.

Inna sprawa, ze nie powinienes sprawdzac etykiety przycisku w ten sposob. Nie zawsze pusty przycisk bedzie mial identyfikator 16(pamietaj, ze puste pole sie przemieszcza).

Nalezy pobrac uchwyt do przycisku(GetDlgItem), a nastepnie odczytac jego etykiete(GetWindowText) i sprawdzic czy jest pusta.

Następna dyskusja:

WinAPI+Folder Listener




Wyślij zaproszenie do