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)


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)




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)


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 2017
wyślij wiadomość

    Strona główna