Bài 1:Gii thiu chung Trn Minh Thái
wcex.lpfnWndProc = (WNDPROC)WndProc; 54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_BT1);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = (LPCSTR)IDC_BT1;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance,(LPCTSTR)IDI_SMALL);
return RegisterClassEx(&wcex);
}
// FUNCTION: InitInstance(HANDLE, int)
// PURPOSE: Saves instance handle and creates main window
// COMMENTS:
// In this function, we save the instance handle in a global variable and
// create and display the main program window.
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
hInst = hInstance; // Store instance handle in our global variable
hWnd = CreateWindow(szWindowClass,
szTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
0,
CW_USEDEFAULT,
0,
NULL,
NULL,
hInstance,
NULL);
if (!hWnd)
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
// FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
// PURPOSE: Processes messages for the main window.
// WM_COMMAND - process the application menu
// WM_PAINT - Paint the main window
// WM_DESTROY - post a quit message and return
Bài ging: Lp trình C for Win .............................................................................................Trang 21/69
Bài 1:Gii thiu chung Trn Minh Thái
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM
wParam, LPARAM lParam)
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
{
int wmId, wmEvent,x,y;
PAINTSTRUCT ps;
HDC hdc;
TCHAR szHello[MAX_LOADSTRING];
LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst,(LPCTSTR)IDD_ABOUTBOX,
hWnd, (DLGPROC)About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message,
wParam, lParam);
}
break;
case WM_LBUTTONDOWN:
hdc = GetDC(hWnd);
// TODO: Add any drawing code here...
x=LOWORD(lParam);
y=HIWORD(lParam);
TextOut(hdc,x,y,(LPCTSTR)szHello, strlen(szHello));
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
RECT rt;
GetClientRect(hWnd, &rt);
DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0); break;
default:
Bài ging: Lp trình C for Win .............................................................................................Trang 22/69
Bài 1:Gii thiu chung Trn Minh Thái
return DefWindowProc(hWnd, message, wParam, lParam); 145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
}
return 0;
}
// Mesage handler for about box.
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam,
LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG: return TRUE;
case WM_COMMAND:
if (LOWORD(wParam)== IDOK||LOWORD(wParam)==
IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));return TRUE;
}
break;
}
return FALSE;
}
Bài ging: Lp trình C for Win .............................................................................................Trang 23/69
Bài 2:Paint và repaint Trn Minh Thái
Bài 2: PAINT VÀ REPAINT
Phân b thi lượng:
- S tiết ging lp: 6 tiết
- S tiết t hc nhà: 6 tiết
- S tiết cài đặt chương trình nhà: 12 tiết
1. Gii thiu
Windows không gi li nhng gì chúng hin th trên vùng làm vic ca ca s,
cho nên chương trình ng dng phi hin th ni dung ca s khi cn thiết. V li
ni dung ca s khi:
Dùng hàm ScrollWindow: D liu hin th thay đổi Æ cp nht li.
Hàm InvalidateRect: Làm bt hp l 1 phn hay toàn b vùng làm vic.
Menu chương trình bt xung làm che khut mt phn ca s.
Di chuyn chut, di chuyn icon.
¾ Vùng hình ch nht hp l và bt hp l thông qua li gi hàm
BOOL InvalidateRect(HWND hwnd, CONST RECT *lpRect, BOOL bErase);
vi: bErase = TRUE thì tô li nn, FALSE thì gi nguyên.
Î Hàm BeginPaint() s làm hp l li vùng bt hp l.
¾ Trong ca s cha PAINTSTRUCT, mc đích là s t hp li 2 hay nhiu
vùng bt hp l chng lên nhau.
typedef struct tagPAINTSTRUCT
{
HDC hdc;
BOOL fErase;
RECT rcPaint;
BOOL fRestore;
BOOL flncUpdate;
BYTE rgReserved[32];
}PAINTSTRUCT;
Vi: fErase =
FALSE: Không xoá mà ghi ch
rcPaint cha to độ vùng bt hp l.
TRUE: xoá vùng hình ch nht bt hp l.
ng lên.
Bài ging: Lp trình C for Win .............................................................................................Trang 24/69
Bài 2:Paint và repaint Trn Minh Thái
typedef tagRECT
{
LONG left, top;
LONG right, bottom;
}RECT;
2. Tng quan v GDI (Graphics Device Interface)
ng dng
Windows
Ng cnh
thiết b GDI
Trình điu
khin thiết b
Thiế
xu
t b
t
a) Làm vic vi ng cnh thiết b
hdc cha các thông tin nn cn thiết cho vic v lên màn hình, t động
giao tiếp vi phn cng.
Có nhiu cách để nhn và gii phóng hdc.
o BeginPaint() và EndPaint() : Cp hàm này ch yếu được dùng trong
phn WM_PAINT.
HDC BeginPaint(HWND hwnd, LPPAINTSTRUCT lpPS);
BOOL EndPaint(HWND hWnd, CONST PAINTSTRUCT *lpPaint);
o GetDC() và ReleaseDC() : Không làm hp l bt c vùng bt hp l
nào.
HDC GetDC(HWND hwnd);
int ReleaseDC(HWND hwnd, HDC hdc);
Æ
tr v TRUE nếu gii phóng được hdc.
Vic ly và gii phóng hdc ch nên được tiến hành bên trong phn x
1 message.
Ngoài ra, còn có th nhn v device context ca toàn màn hình bng
hàm: hDC = CreateDC( "DISPLAY", NULL, NULL, NULL);
Để ly to độ và kích thước ca ca s làm vic ta dùng hàm
BOOL GetClientRect(HWND hWnd, LPRECT lpRect);
tr v giá tr khác không nếu thành công, ngược li tr v 0.
Hin th s lên màn hình
wsprintf(s, “%d + %d= %d”, a, b, a+b);
TextOut(hdc, x, y, s, wsprintf());
b) Chế độ ánh x
Bài ging: Lp trình C for Win .............................................................................................Trang 25/69