Lập trình C Windows
Trang 1Lập trình C trên Windows
Ví dụ và Bài tập (T4)
Nguyễn Đức Hoàng Hạ Khoa CNTT – Trường ĐHKHTN
Email: ndhha@fit.hcmuns.edu.vn
Trang 2Graphics Device Interface
(GDI)
Trang 3WM_PAINT
• HDC BeginPaint( HWND hwnd, // input
LPPAINTSTRUCT lpPaint // output );
• BOOL EndPaint( HWND hWnd,
PAINTSTRUCT *lpPaint );
Không phải trong WM_PAINT
• HDC GetDC( HWND hWnd);
• int ReleaseDC( HWND hWnd,
HDC hDC // handle to DC );
Chọn các đối tượng vẽ vào trong DC
• HGDIOBJ SelectObject( HDC hdc, HGDIOBJ hgdiobj);
Trang 4HPEN
• HPEN CreatePen( int fnPenStyle,
int nWidth, COLORREF crColor);
• BOOL DeleteObject( HGDIOBJ hObject);
• Ví dụ:
hdc = BeginPaint(hWnd, &ps);
hPen = CreatePen(PS_SOLID,2,0);
hOld = SelectObject(hdc,hPen);
MoveToEx(hdc,100,200,NULL);
LineTo(hdc,200,100);
SelectObject(hdc,hOld);
DeleteObject(hPen);
EndPaint(hWnd, &ps);
Trang 5• CreateBrushIndirect: Creates a brush with a specified style,
color, and pattern
• CreateDIBPatternBrushPt: Creates a brush with the pattern
from a DIB
• CreateHatchBrush: Creates a brush with a hatch pattern and
color
• CreatePatternBrush: Creates a brush with a bitmap pattern
• CreateSolidBrush: Creates a brush with a solid color
• Ví dụ:
hBr = CreateSolidBrush(255);
hOldBr = SelectObject(hdc,hBr);
Trang 6HFONT
• BOOL ChooseFont(LPCHOOSEFONT lpcf );
• HFONT CreateFontIndirect(
CONST LOGFONT* lplf);
(xem thêm tại GDI.pdf-tr26)
Trang 7• HBITMAP LoadBitmap(
HINSTANCE hInstance, LPCTSTR lpBitmapName);
• HANDLE LoadImage(
HINSTANCE hinst,LPCTSTR lpszName, UINT uType, int cxDesired,
int cyDesired, UINT fuLoad );
uType: IMAGE_BITMAP,IMAGE_CURSOR,IMAGE_ICON
Trang 8Ví dụ 4
Robot
• Mô tả:
Hãy viết 1 chương trình có một robot bước đi trên màn hình
• Yêu cầu:
– Mô tả dữ liệu
– Mô tả xử lý các sự kiện cần thiết
Trang 9Robot
Trang 10Robot
typedef struct {
HBITMAP hBmp;
int next;
int dx,dy;
} CANH;
CANH robot[4];
int nMAX = 4;
int n;
int x,y; //vi tri anh
Trang 11void DrawRobot(HDC hdc)
{
HDC hRobot = ::CreateCompatibleDC(hdc);
HGDIOBJ hOld = SelectObject(
hRobot,
robot[n].hBmp );
BitBlt(hdc,x,y,50,50,hRobot,0,0,SRCCOPY);
SelectObject(hRobot,hOld);
DeleteDC(hRobot);
}
Trang 12Robot
case WM_CREATE:
robot[0].hBmp = LoadBitmap(hInst,LPCTSTR(IDB_BITMAP1));
robot[0].next =1; robot[0].dx = 27-13; robot[0].dy =0;
robot[1].hBmp = LoadBitmap(hInst,LPCTSTR(IDB_BITMAP2));
robot[1].next =2; robot[1].dx = 38-27; robot[1].dy =0;
robot[2].hBmp = LoadBitmap(hInst,LPCTSTR(IDB_BITMAP1));
robot[2].next = 3; robot[2].dx = 27-13; robot[2].dy =0;
robot[3].hBmp = LoadBitmap(hInst,LPCTSTR(IDB_BITMAP3));
robot[3].next =0; robot[3].dx = 38-27; robot[3].dy =0;
n = 0;
x = y = 0;
SetTimer(hWnd,1,1000,NULL);
break;
Trang 13case WM_TIMER:
x += robot[n].dx;
y += robot[n].dy;
n = robot[n].next ; InvalidateRect(hWnd, NULL,TRUE);
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
DrawRobot(hdc);
EndPaint(hWnd, &ps);
Trang 14Bài tập 4
• Mô tả:
Viết một chương trình cho phép điều khiển robot di chuyển trên màn hình Robot luôn di chuyển, người sẽ điều khiển hướng đi của robot
Trang 15Bài tập 5 Đồng hồ KIM
• Mô tả
Viết chương trình mô phỏng đồng hồ kim trên máy tính.
Trang 16Bài tập 5
• Hướng dẫn:
Sử dụng hàm sau để lấy ngày giờ hệ thông:
void GetLocalTime( LPSYSTEMTIME lpSystemTime );
typedef struct _SYSTEMTIME {
WORD wYear; WORD wMonth;
WORD wDayOfWeek; WORD wDay;
WORD wHour; WORD wMinute; WORD wSecond; WORD wMilliseconds;
} SYSTEMTIME
Trang 17Ví dụ 6
Hãy đóng gói HDC thành lớp CMyDC nhằm hỗ trợ người lập trình C trên Windows.
classCMyDC {
Public:
PAINTSTRUCT m_ps;
HDC m_hdc;
HWND m_hwnd;
HDC BeginPaint(HWND);
void EndPaint();
void MoveTo(POINT);
void LineTo(POINT);
void Line(POINT, POINT);
Trang 18Ví dụ 6
HDC CMyDC::BeginPaint(HWND hwnd)
{
m_hwnd = hwnd;
m_hdc = BeginPaint(m_hwnd, &m_ps);
return m_hdc;
}
void CMyDC::EndPaint()
{
EndPaint(m_hwnd,&m_ps);
}
void CMyDC::Line(POINT p1, POINT p2)
{
MoveTo(p1);
LineTo(p2);
}
Trang 19Microsoft Foundation Class (MFC)
Library
Trang 20DLL?