Laboratorium: Programowanie w środowisku Windows



Pobieranie 32,99 Kb.
Data29.12.2017
Rozmiar32,99 Kb.

Laboratorium: Programowanie w środowisku Windows
Zajęcia 2.

Wejście/wyjście


Przykładowa funkcja okienkowa
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

PAINTSTRUCT ps; HDC hdc;


switch (message)

{
case WM_CREATE:

CreateWindow("Potomek","To ja!",WS_CHILD | WS_VISIBLE | WS_CAPTION

,0,0,200,80,hWnd,NULL, hInst,NULL);

break;

case WM_PAINT:



hdc = BeginPaint(hWnd, &ps);

// operacje graficzne

EndPaint(hWnd, &ps);

break;


case WM_MOVE:

{

int xPos = (int) LOWORD(lParam); // pozycja w poziomie



int yPos = (int) HIWORD(lParam); // pozycja w pionie

char buff[30];

sprintf(buff,"x:%ld, y:%ld",xPos,yPos);

GetClientRect(hWnd, &rt);

hdc = GetDC(hWnd);

DrawText(hdc, buff, strlen(buff), &rt, DT_LEFT);

ReleaseDC(hWnd,hdc);

break;


}

case WM_DESTROY:

PostQuitMessage(0); // umiesć komunikat WM_QUIT w kolejce

break;


default: return DefWindowProc(hWnd, message, wParam, lParam); // domyślna reakcja

}

return 0;



}
Komunikaty standardowo kolejkowane:

  • od klawiatury (np. WM_KEYDOWN, WM_KEYUP, WM_CHAR)

  • od myszy (WM_MOUSEMOVE, WM_LBUTTONDOWN)

  • zegar systemu (WM_TIMER)

  • odświeżanie ekranu (WM_PAINT)

  • zakończenie działania programu (WM_QUIT)

Pozostałe nie są kolejkowane (np. WM_CREATE, WM_MOVE, WM_SHOWWINDOW)


funkcja wstawiająca komunikat do kolejki kominikatów, funkcja powraca nie czekając na przetworzenie komunikatu

BOOL PostMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)



  • HWND hWnd - uchwyt okna - adresata komunikatu

  • UINT Msg - kod komunikatu

  • WPARAM wParam - parametr komunikatu

  • LPARAM lParam - j.w.

funkcja wysyłająca komunikat do okna (z ominięciem kolejki), funkcja czeka na zakończenie przetwarzania komunikatu

LRESULT SendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)

parametry identyczne z PostMessage


Obsługa wybranych komunikatów.
WM_MOUSEMOVE - komunikat umieszczany w kolejce gdy kursor myszy zmienił położenie w obszarze roboczym okna, lub jeśli mysz została przechwycona (SetCapture) bez względu na położenie

wParam - informacja o naciśniętych klawiszach wirtualnych kombinacja wartości: MK_CONTROL, MK_LBUTTON, MK_MBUTTON, MK_RBUTTON, MK_SHIFT

LOWORD(lParam) - pozioma pozycja kursora względem lewego górnego rogu obszaru roboczego

HIWORD(lParam) - pionowa pozycja kursora


WM_LBUTTONDOWN - komunikat umieszczany w kolejce gdy naciśnięto lewy klawisz myszy w obszarze roboczym okna, interpretacja parametrów jak w komunikacie WM_MOUSEMOVE
WM_KEYDOWN - komunikat generowany gdy okno jest aktywne (ma fokus) i naciśnięto klawisz „niesystemowy” (bez )

(int) wParam - wirtualny kod klawisza (np. VK_RETURN, VK_LEFT)

lParam - licznik powtórzeń autorepetycji, kod klawisza fizycznego, rozszerzony znak, poprzedni stan klawisza
WM_CHAR - jeśli w pętli komunikatów umieszczono funkcję TranslateMessage to komunikat WM_CHAR zostanie wysłany w wyniku obsługi komunikatu WM_KEYDOWN

(TCHAR)wParam - kod znaku

lParam - jak w WM_KEYDOWN
WM_TIMER - komunikat jest umieszczany w kolejce jeśli zainstalowano timer funkcją SetTimer i upłynął zadany kwant czasu, komunikat podobnie jak WM_PAINT ma niski priorytet i zostaje wysłany do okna dopiero gdy kolejka jest pusta. W danej chwili w kolejce może znajdować się tylko jeden komunikat WM_TIMER (tak jak WM_PAINT).

wParam - identyfikator timera

lParam - wskaźnik na procedurę obsługi timera
funkcja rejestrująca timer w systemie

UINT SetTimer(HWND hWnd, UINT nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc)



  • HWND hWnd - uchwyt okna, które ma otrzymywać komunikaty

  • UINT nIDEvent - identyfikator timera (!=0)

  • UINT uElapse - długość interwału w milisekundach

  • TIMERPROC lpTimerFunc - adres procedury obsługi - dla metody z funkcją wywoływaną zwrotnie

Jeśli nie ma w systemie wolnego zegara funkcja zwraca NULL. Liczba timerow: Win3.1 = 32, Win95 = nieograniczona.
funkcja usuwająca timer z systemu

BOOL KillTimer(HWND hWnd, UINT uIDEvent)



  • HWND hWnd - uchwyt okna - właściciela timera

  • UINT uIDEvent - identyfikator timer


WM_HSCROLL, WM_VSCROLL - komunikaty od pasków przewijania

lParam - = 0 dla pasków przewijania okna (dla okien w stylu z flagą WS_HSCROLL lub WS_VSCROLL), lub uchwyt okna dla pozostałych

(int) LOWORD(wParam) - kod operacji np. SB_PAGEDOWN
funkcja ustawiająca parametry paska przewijania

int SetScrollInfo(HWND hwnd, int fnBar, LPSCROLLINFO lpsi, BOOL fRedraw)



  • HWND hwnd - uchwyt okna, którego pasek przewijania ma być zmieniony lub uchwyt paska przewijania (dla pasków tworzonych funkcją CreateWindow)

  • int fnBar - określa który pasek okna będzie modyfikowany (SB_HORZ lub SB_VERT), dla samodzielnych pasków należy podać wartość SB_CTL

  • LPSCROLLINFO lpsi - wskaźnik na strukturę parametrów paska przewijania

  • BOOL fRedraw - parametr określający czy należy odświeżyć pasek na ekranie

struktura SCROLLINFO

typedef struct tagSCROLLINFO { // si

UINT cbSize; // rozmiar struktury

UINT fMask; // maska

int nMin; // minimalna pozycja

int nMax; // maksymalna pozycja

UINT nPage; // rozmiar strony

int nPos; // pozycja suwaka

int nTrackPos; // pozycja suwaka podczas ciągnięcia (drag)

// odczytywana np. w SB_THUMBTRACK

} SCROLLINFO;

typedef SCROLLINFO FAR *LPSCROLLINFO;
funkcja ustawiająca pozycję suwaka paska przewijania

int SetScrollPos(HWND hWnd, int nBar, int nPos, BOOL bRedraw)



  • HWND hWnd, int nBar, BOOL bRedraw - tak samo jak w SetScrollInfo

  • int nPos - nowa pozycja suwaka

funkcja ustawiająca minimalną i maksymalną pozycję suwaka

BOOL SetScrollRange(HWND hWnd, int nBar, int nMinPos, int nMaxPos, BOOL bRedraw)


  • HWND hWnd, int nBar, BOOL bRedraw - tak samo jak w SetScrollInfo

  • int nMinPos - nowa minimalna pozycja suwaka

  • int nMaxPos - nowa maksymalna pozycja suwaka



WM_GETMINMAXINFO - komunikat generowany podczas zmiany rozmiarów lub pozycji okna

(LPMINMAXINFO) lParam - wskaźnik na strukturę opisującą okno


struktura MINMAXINFO

typedef struct tagMINMAXINFO {

POINT ptReserved;

POINT ptMaxSize; // maksymalna szerokość (point.x) i wysokość okna w

// postaci zmaksymalizowanej

POINT ptMaxPosition; // pozycja lewego górnego rogu okna w postaci

// zmaksymalizowanej

POINT ptMinTrackSize; // minimalne rozmiary okna

POINT ptMaxTrackSize; // maksymalne rozmiary okna

} MINMAXINFO;



WM_WINDOWPOSCHANGED - komunikat jest wysyłany do okna którego rozmiar, pozycja lub położenie Z uległo zmianie (na skutek wywołania funkcji SetWindowPos lub innej funkcji zarządzającej oknami)

lpwp = (LPWINDOWPOS) lParam - wskaźnik na strukturę opisującą dane okna


typedef struct _WINDOWPOS {

HWND hwnd; // uchwyt okna

HWND hwndInsertAfter; // pozycja na współrzędnej Z

int x; // pozycja lewej krawędzi okna

int y; // pozycja górnej krawędzi okna

int cx; // szerokość okna

int cy; // wysokość okna

UINT flags; // dodatkowe flagi określające stan okna



} WINDOWPOS;





©operacji.org 2019
wyślij wiadomość

    Strona główna