Giáo trình Ngôn ngữ lập trình - Lập trình C trên Windows

Mục lục

 

 

 Chương 1 Tổng quan lập trình C trên Windows 2

 Hệ điều hành Microsoft Windows

 Lập trình trên Microsoft Windows

 Các viết một ứng dụng trên Microsoft Windows

 

 Chương 2 Hộp thoại (dialog) và thanh trình đơn (menu) 25

 Hộp thoại

 Menu

 

 Chương 3 Các đối tượng điều khiển 60

 Lớp Button

 Lớp Edit Text

 Lớp List box

 Lớp Combo box

 Lớp Scroll Bar

 

 Chương 4 Xử lý bàn phím, thiết bị chuột và bộ định thời gian 92

 Bàn phím

 Thiết bị chuột

 Bộ định thời gian

 

 Chương 5 Xử lý văn bản và font chữ 124

 Xử lý văn bản

 Font chữ

 

 Chương 6 Đồ họa và các đối tượng CGI 147

 Device context

 Một số hàm đồ họa cơ sở

 In ấn

 

 Chương 7 Quản lý bộ nhớ và tập tin 171

 

 

doc203 trang | Chuyên mục: C/C++ | Chia sẻ: dkS00TYs | Lượt xem: 2233 | Lượt tải: 1download
Tóm tắt nội dung Giáo trình Ngôn ngữ lập trình - Lập trình C trên Windows, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
n.
Nếu thành công, và lpDistanceToMoveHigh bằng NULL, giá trị trả về là DWORD thấp của con trỏ tập tin. Nếu lpDistanceToMoveHigh khác NULL, hàm trả về DWORD thấp của con trỏ tập tin, và trỏ trường này đến DWORD cao của con trỏ tập tin.
Nếu hàm thất bại và lpDistanceToMoveHigh bằng NULL, giá trị trả về là 0xFFFFFFFF. Để biết thêm thông tin lỗi, ta dùng hàm GetLastError. Nếu hàm trả về 0xFFFFFFFF và lpDistanceToMoveHigh, có thể hàm thành công hoặc thất bại, cần phải gọi hàm GetLastError để xác định. Đoạn chương trình sau trình bày vấn đề này :
/* Trường hợp 1: Gọi hàm với lpDistanceToMoveHigh == NULL */
/* Cố gắng di chuyển con trỏ tập tin của hFile một đoạn */
dwPtr = SetFilePointer(hFile, lDistance, NULL, FILE_BEGIN); 
if (dwPtr == 0xFFFFFFFF) // Kiểm tra thất bại
{ 
dwError = GetLastError() ; // Nhận mã lỗi 
. . . // Xử lý lỗi 
} // Cuối phần xử lý lỗi
/* Trường hợp 2: Gọi hàm với lpDistanceToMoveHigh != NULL */
/* Cố gắng di chuyển con trỏ tập tin hFile một đoạn dài */
dwPtrLow = SetFilePointer(hFile, lDistLow, & lDistHigh, FILE_BEGIN); 
/* Kiểm tra thất bại */
if (dwPtrLow==0xFFFFFFFF&&(dwError=GetLastError())!=NO_ERROR)
{ 
// Xử lý lỗi 
// . . . 
} // Cuối phần xử lý lỗi 
Để di chuyển tiến, ta thiết lập độ dịch chuyển một giá trị dương. Ngược lại, thiết lập giá trị âm để di chuyển lùi con trỏ tập tin. Nếu giá trị con trỏ tập tin sau khi dịch chuyển âm, hàm thất bại, và mã lỗi mà hàm GetlastError trả về là ERROR_NEGATIVE_SEEK. 
Nếu muốn di chuyển con trỏ đến cuối tập tin để ghi tiếp, ta cũng có thể dùng hàm SetEndOfFile.
BOOL SetEndOfFile(HANDLE hFile); 
Trường hFile là handle của tập tin cần di chuyển con trỏ đến cuối tập tin cần được tạo với dạng truy cập GENERAL_WRITE. Nếu thành công, hàm trả về giá trị khác 0. Ngược lại, giá trị trả về là 0.
Hàm ReadFile đọc dữ liệu từ một tập tin, từ điểm xác định bởi con trỏ tập tin. Sau khi đọc, con trỏ tập tin dịch chuyển một đoạn ứng với số byte thật sự đọc được. Tương tự, để ghi vào tập tin ta dùng hàm WriteFile.
BOOL ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped);
BOOL WriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped);
Handle tập tin hFile cần được tạo với dạng truy cập GENERAL_READ hoặc GENERAL_WRITE. 
Trường lpBuffer trỏ đến vùng nhớ đệm nhận dữ liệu đọc từ tập tin, hay chứa dữ liệu cần ghi. Trường nNumberOfBytesToRead xác định số byte cần đọc. Trường lpNumberOfBytesRead trỏ đến các byte đọc được. Hàm ReadFile thiết lập giá trị này bằng 0 trước khi thực hiện các thao tác khác để kiểm tra lỗi. 
Trường nNumberOfBytesToWrite xác định số byte cần ghi. Nếu trường này bằng 0, hàm không ghi dữ liệu, nhưng vẫn được gọi thực hiện. Trường lpNumberOfBytesWritten xác định số byte ghi được, trường này cũng được hàm WriteFile thiết lập về 0 trước khi thực hiện các thao tác khác để kiểm tra lỗi. 
Cuối cùng, trường lpOverlapped trỏ đến cấu trúc OVERLAPPED. Nếu tập tin được mở với cờ FILE_FLAG_OVERLAPPED, giá trị này phải khác NULL. Để đơn giản ta thiết lập giá trị bằng NULL, hàm sẽ đọc (ghi) tập tin từ vị trí con trỏ hiện tại và hàm chỉ trả kết quả về sau khi đọc (ghi) xong.
Hàm ReadFile sẽ dừng với một số lý do sau : thao tác ghi hoàn tất cuối đường ống ghi, đã đọc hết số byte yêu cầu, hoặc xảy ra lỗi khi đọc. 
Nếu thành công, các hàm trả về giá trị khác 0. Ngược lại, giá trị trả về bằng 0.
7.3.5 Khoá và mở khoá tập tin
Mặc dù hệ thống cho phép nhiều ứng dụng có thể mở và ghi vào cùng một tập tin, các ứng dụng không nên thực hiện song song. Để ngăn chặn ứng dụng khác ghi vào phần dữ liệu của mình, ta có thể sử dụng hàm LockFile. Để mở khoá tập tin, cho phép các ứng dụng khác truy cập vùng dữ liệu, ta dùng hàm UnlockFile.
BOOL LockFile(HANDLE hFile, DWORD dwFileOffsetLow, DWORD dwFileOffsetHigh, DWORD nNumberOfBytesToLockLow, DWORD nNumberOfBytesToLockHigh);
BOOL UnlockFile(HANDLE hFile, DWORD dwFileOffsetLow, DWORD dwFileOffsetHigh, DWORD nNumberOfBytesToUnlockLow, DWORD nNumberOfBytesToUnlockHigh);
Trường hFile là handle của tập tin được mở dưới dạng GENERAL_READ hoặc GENERAL_WRITE, hoặc cả hai.
Trường dwFileOffsetLow và dwFileOffsetHigh xác định word thấp và cao của byte offset đầu tiên cần khoá hay mở khoá.
Trường nNumberofBytesToLockLow (nNumberofBytesTo UnlockLow) và nNumberOfBytesToLockHigh (nNumberOf BytesToUnlockHigh) xác định word thấp và cao độ dài khoảng byte cần khoá hay mở khóa.
Nếu thành công, hàm trả về giá trị khác 0. Ngược lại, giá trị trả về là 0.
Ví dụ sau đây nối một tập tin vào một tập tin khác. Ứng dụng sử dụng hàm CreateFile mở tập tin ONE.TXT để đọc, và TWO.TXT để viết. Sau đó ứng dụng nối phần dữ liệu của tập tin ONE.TXT vào cuối tập tin TWO.TXT bằng cách đọc (dùng hàm ReadFile) và ghi (dùng hàm WriteFile) từng khối 4K dữ liệu. Trước khi viết vào tập tin thứ hai, ứng dụng dịch chuyển con trỏ đến cuối tập tin bằng cách dùng hàm SetFilePointer, sau đó khóa vùng cần ghi dùng hàm LockFile. Sau khi thực hiện thao tác ghi xong, ta mở khoá, dùng hàm UnlockFile, để các ứng dụng khác có thể sử dụng tập tin này.
HANDLE hFile; 
HANDLE hAppend; 
DWORD dwBytesRead, dwBytesWritten, dwPos; 
char buff[4096]; 
/* Mở một tập tin đã có */
hFile = CreateFile("ONE.TXT", // mở tập tin ONE.TXT 
GENERIC_READ, // mở để đọc 
0, // không chia sẻ 
NULL, // không bảo mật 
OPEN_EXISTING, // chỉ mở tập tin đã tồn tại 
FILE_ATTRIBUTE_NORMAL, // tập tin bình thường 
NULL); // không có thuộc tính tạm 
if (hFile == INVALID_HANDLE_VALUE) 
{ 
ErrorHandler("Could not open ONE."); // xử lý lỗi
} 
/* Mở tập tin đã có. Nếu chưa có, tạo tập tin mới */
hAppend = CreateFile("TWO.TXT", // mở tập tin TWO.TXT 
GENERIC_WRITE, // mở để ghi 
0, // không chia sẻ 
NULL, // không bảo mật 
OPEN_ALWAYS, // mở tập tin cũ hoặc tạo mới 
FILE_ATTRIBUTE_NORMAL, // tập tin bình thường
NULL); // không có thuộc tính tạm
if (hAppend == INVALID_HANDLE_VALUE) 
{ 
ErrorHandler("Could not open TWO."); // xử lý lỗi 
} 
/* Nối tập tin thứ nhất vào cuối tập tin thứ hai. Khoá tập tin thứ hai để ngăn chặn các tiến trình khác truy cập khi đang ghi. Mở khoá sau khi ghi xong */
do 
{ 
if (ReadFile(hFile, buff, 4096, &dwBytesRead, NULL)) 
{ 
dwPos= SetFilePointer(hAppend, 0, NULL, FILE_END); 
LockFile(hAppend, dwPos, 0, dwPos+dwBytesRead, 0); 
WriteFile(hAppend, buff, dwBytesRead, &dwBytesWritten, NULL); 
UnlockFile(hAppend, dwPos, 0, dwPos+dwBytesRead, 0); 
} 
} while (dwBytesRead == 4096); 
/* Đóng cả hai tập tin */
CloseHandle(hFile); 
CloseHandle(hAppend); 
7.3.6 Đóng và xoá tập tin
Để sử dụng hiệu quả tài nguyên hệ thống, ứng dụng cần đóng các tập tin khi không cần dùng nữa bằng cách gọi hàm CloseHandle. Nếu ứng dụng bị ngắt và tập tin vẫn đang mở, hệ thống sẽ tự động đóng tập tin này.
BOOL CloseHandle(HANDLE hObject);
Nếu thành công, hàm trả về giá trị khác 0. Ngược lại, giá trị trả về là 0. Để biết các thông tin lỗi mở rộng, ta dùng hàm GetLastError.
Để xoá một tập tin, ta dùng hàm DeleteFile. Lưu ý rằng tập tin này cần phải đóng trước khi bị xóa.
BOOL DeleteFile(LPCTSTR lpFileName);
Trường lpFileName trỏ đến chuỗi (kết thúc bằng ký tự NULL) xác định tập tin cần xoá. Nếu thành công, hàm trả về khá trị khác 0. Ngược lại, giá trị trả về là 0. Hàm thất bại nếu tập nếu tập tin cần xoá không tồn tại. Trong Windows NT, hàm không thể xoá các tập tin đang mở. Tuy nhiên, trong Windows 95, tập tin đang mở vẫn có thể bị xoá. 
7.3.7 Xử lý thư mục
Khi ứng dụng tạo một tập tin mới, hệ điều hành sẽ thêm tập tin này vào một thư mục xác định. Để tạo và xoá một thư mục, ta dùng hàm CreateDirectory và RemoveDirectory.
BOOL CreateDirectory(LPCTSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes);
BOOL RemoveDirectory(LPCTSTR lpPathName);
Trường lpPathName trỏ đến chuỗi (kết thúc bằng ký tự NULL) xác định đường dẫn thư mục cần tạo (hay cần xoá). Kích thước chuỗi mặc định giới hạn cho đường dẫn là MAX_PATH ký tự. Trong trường hợp xoá thư mục, đường dẫn cần xác định thư mục là thư mục rỗng.
Trường lpSecurityAttributes trỏ đến cấu trúc SECURITY_ATTRIBUTES chứa trường lpSecurityDescriptor xác định mô tả mật của thư mục mới. Để đơn giản, ta gán giá trị lpSecurityAttributes bằng NULL, khi đó thư mục mới nhận các giá trị mô tả mật mặc định. 
Nếu thành công, các hàm trả về giá trị khác 0. Ngược lại, giá trị trả về là 0.
Thư mục cuối của đường dẫn đang sử dụng gọi là thư mục hiện hành. Để xác định thư mục hiện hành, ứng dụng gọi hàm GetCurrentDirectory. Để thay đổi thư mục hiện hành, ứng dụng gọi hàm SetCurrentDirectory.
DWORD GetCurrentDirectory(DWORD nBufferLength, LPTSTR lpBuffer);
Trường nBufferLength xác định kích thước vùng đệm của chuỗi ký tự thể hiện thư mục hiện hành. Vùng đệm này phải dài đủ để chứa cả ký tự NULL cuối chuỗi. Trường lpBuffer sẽ chứa chuỗi ký tự này.
Nếu thành công, hàm trả về giá trị xác định số ký tự được ghi vào vùng đệm, không chứa ký tự NULL. Ngược lại, giá trị trả về là 0. Nếu vùng đệm lpBuffer không đủ lớn, giá trị trả về xác định kích thước cần thiết của vùng đệm, gồm cả byte NULL đáng dấu kết thúc chuỗi.
BOOL SetCurrentDirectory(LPCTSTR lpPathName);
Trường lpPathName trỏ đến chuỗi ký tự (kết thúc bằng NULL) xác định đường dẫn mới. Nếu thành công, hàm trả về giá trị khác 0. Ngược lại, giá trị trả về là 0. 
Mục lục
Chương 1 Tổng quan lập trình C trên Windows	2
Hệ điều hành Microsoft Windows
Lập trình trên Microsoft Windows
Các viết một ứng dụng trên Microsoft Windows
Chương 2 Hộp thoại (dialog) và thanh trình đơn (menu)	25
Hộp thoại
Menu
Chương 3 Các đối tượng điều khiển	60
Lớp Button
Lớp Edit Text
Lớp List box
Lớp Combo box
Lớp Scroll Bar
Chương 4 Xử lý bàn phím, thiết bị chuột và bộ định thời gian	92
Bàn phím
Thiết bị chuột
Bộ định thời gian
Chương 5 Xử lý văn bản và font chữ	124
Xử lý văn bản
Font chữ
Chương 6 Đồ họa và các đối tượng CGI	147
Device context
Một số hàm đồ họa cơ sở
In ấn
Chương 7 Quản lý bộ nhớ và tập tin	171

File đính kèm:

  • docGiáo trình Ngôn ngữ lập trình - Lập trình C trên Windows.doc