Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 54 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
54
Dung lượng
421 KB
Nội dung
Nếu ngày nào windows còn tồn tại thì ngày đó lập trình win32 bằng API vẫn sẽ tồn tại và phát triển. Hiện nay có rất nhiều thư viện lập trình cao cấp trong windows, rất thuận tiện và dễ dùng như MFC. Song những thư viện đó không hoàn toàn làm được những điều bạn mong muốn khi bạn muốn đi sâu hơn về lập trình hệ thống.Những chuỗi bài về lập trình API sẽ giúp bạn làm quen với lập trình windows từ đơn giản đến phức tạp. Bùi Minh Trường kosen01 Chương 1 Chương mở đầu Để sử dụng bài viết này một cách hiệu quả , bạn đọc phải có một cơ sở vững chắc về ngôn ngữ lập trình C hoặc C++.Sau nữa là bạn phải là người dùng Windows và đã có những kinh nghiệm cơ bản về Windows ví dụ như giao diện được trình bày như thế nào, nút bấm để làm gì, check box để làm gì, được tác động như thế nào, list box được sử dụng ra sao,vân vân Với tư cách là người dùng, bạn chỉ cần biết thế là đủ, nhưng với tư cách là một nhà lập trình, các bạn sẽ khám phá những bí mật của Windows. Bạn cũng cần một trình biên dịch cho chương trình mà bạn sẽ viết ra, có rất nhiều chương trình dịch mà bạn có thể sử dụng, tiêu biểu là Visual C++ và chương trình dịch miễn phí của Borland.Nếu bạn không có điều kiện mua Visual C++ thì hãy sử dụng chương trình dịch miễn phí của Borland.Ưu điểm của Visual C++ là cho phép bạn thiết kế giao diện một cách trực quan, và có nhiều chức năng khác nữa, còn với chương trình dịch của Borland thì bạn phải thiết kế giao diện bằng các dòng lệnh, tôi sẽ hướng dẫn bạn thiết kế giao diện một cách khái quát mà từ đó bạn có thể nghiên cứu thêm.Mã nguồn kèm theo những bài viết này sẽ giúp bạn hiểu sâu hơn các kiến thức tôi trình bày. Mọi lời nhận xét xin gửi thư cho tôi theo địa chỉ: truongtoba136@yahoo.co.jp Bạn có thể download ebooks này và mã nguồn tại http://vcsj.net Chú ý là thông tin về ebooks này sẽ được cập nhật thường xuyên.Sau này chúng tôi sẽ dịch thành file pdf để các bạn down luôn về vì vậy hãy thường xuyên kiểm tra thông tin tại http://vcsj.net. Chương 2 Tổng quan về hệ điều hành Windows và lập trình trong môi trường Windows Bài 1: Hệ điều hành Windows Như chúng ta đã biết, hiện nay có rất nhiều hệ điều hành như Linux, BSD, Lindow,Windows, Mỗi hệ điều hành có những ưu và nhược điểm riêng, trong phạm vi quyển sách này tôi không thể đề cập đến từng hệ điều hành được mà tôi chỉ tập trung vào Windows, hệ điều hành tương đối phổ biến ở Việt Nam hiện nay và trên thế giới. Bạn là người sử dụng Windows hẳn bạn biết rõ lịch sử của Windows vì thế tôi sẽ không nói về lịch sử cũng như quá trình phát triển của windows nữa, như vậy sẽ tiết kiệm thời gian cho bạn hơn. Windows có một giao diện trực quan ( Visual interface) hay môi trường cửa sổ đồ hoạ (graphical windowing environtment) hay còn gọi là giao tiếp người dùng đồ hoạ (graphical user interface viết tắt là GUI) GUI sử dụng đồ hoạ dựa trên màn hình ảnh nhị phân (bitmapped video display), nó rất thân thiện vì thế nó được gọi là có khả năng WYSIWYG (what you see is what you get).Qua đây bạn cũng thấy rằng màn hình desktop của chúng ta cũng chỉ là một cái ảnh bitmap sau này tôi sẽ hướng dẫn bạn copy cái ảnh bitmap đó mà không cần dùng đến nút print Screen trên bàn phím. Cốt lõi của Windows là sử dụng các thư viện liên kết động, các thư viện dll (dynamic linking library). Windows cung cấp cho bạn rất nhiều hàm để cài đặt giao diện người dùng và hiển thị văn bản cũng như đồ hoạ.Thư viện là một file có phần mở rộng là dll hoặc exe, trong windows có 3 thư viện chính là kernel, user và GDI.Thư viện Kernel quản lý bộ nhớ, ghi chép tập tin thư viện user quản lý giao diện người dùng và thư viện GDI quản lý thiết bị đồ hoạ, bạn chỉ cần hiểu sơ lược như vậy.Điều quan trọng là bạn phải biết được ứng dụng của thư viện dll này.Thư viện dll cho phép chương trình của bạn gọi những hàm đã định nghĩa sẵn trong windows và nạp vào trong bộ nhớ, ngoài ra một ứng dụng quan trọng của thư viện loại này là cho phép bạn nâng cấp chương trình của bạn mà bạn không phải gửi lại toàn bộ các tập tin cho người dùng nữa, bạn chỉ việc gửi thư viện bạn mới viết cho họ.Một ví dụ điển hình là bạn dung winamp, chương trình nghe nhạc này có thể thay đổi skin (màu nền, giao diện ) bằng cách bạn download phiên bản mới hơn của chương trình và sử dụng.Sau này tôi cũng sẽ hướng dẫn bạn cách viết thư viện và sử dụng nó. Chương 2 Bài 2: Chương trình đầu tiên Khi bạn học lập trình bằng C hay C++ chắc hẳn bạn đã biết đến chương trình "hello world" dưới đây: Bùi Minh Trường kosen01 #include <stdio.h> int main() { printf("hello world n"); return 0; } Chương trình này chỉ ghi ra màn hình dòng chữ "hello world", cũng tương tự như vậy chúng ta hãy viết một chương trình "hello world" nhưng bằng Win32 API, tức là lập trình với windows chứ không phải với giao diện là một cửa sổ màu đen nữa. Trước hết tôi xin giới thiệu qua cách tạo một project(dự án) trong Visual C. Bước 1: Khởi dộng Visual C++ Bước 2: Trên menu(trình đơn) chọn "New" Bước3: Quan sát hình 1 dưới đây, bạn chọn "Win32 Application" Bước 4: Đặt tên cho project trong phần "project name" Bước 5: Chọn Finish(mặc định là empty project) Bước 6: Lại chọn new bây giờ hãy xem hình 2 và bạn chọn kiểu file là C++ source file Sau đó đánh dấu phần "add to project" rồi đặt tên file là main. Sau đó chúng ta bắt đầu soạn thảo mã lệnh.Bạn hãy nhớ cách tạo project này để từ đây về sau chúng ta sẽ viết các chương trình cho Win32 application. Hình 1 Hình 2 Chương trình đầu tiên của bạn cũng chỉ hiện lên một hộp thông báo với dòng chữ "hello world". //Chương trinh helloworld //Mục đích : Hiện lên dòng chữ "hello world" //Filename: hello.cpp #include <windows.h> int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd) { MessageBox(NULL,"Hello World!","Hello World Application",0); return 0; } Tôi sẽ giải thích từng phần cho các bạn hiểu, trước hết cũng như chương trình hello đầu tiên trong bài này chúng ta phải có dòng lệnh "include " để báo với chương trình dịch rằng chúng ta sử dụng thư viện của window, bạn cũng chưa cần hiểu nó bao gồm những tập tin nào trong tập tin này, chúng ta cứ tạm hiểu rằng tất cả các chương trình chúng ta sẽ viết sau này đều cần dòng lệnh này. Tiếp theo là hàm WinMain, hàm này trả về giá trị integer(giá trị nguyên), bạn sẽ hỏi tại sao lại cần thêm WINAPI sau "int", rất đơn giản là windows đòi hỏi chúng ta làm như vậy, thực ra thì nó tương đương với _stdcall được định nghĩa trong windef.h, nó quy ước gọi hàm chứa cách thức tạo mã máy đặt các dối số hàm trên ngăn xếp.Nói chung bạn cũng chỉ cần hiểu là chúng ta sẽ dùng hàm WinMain này xuyên suốt từ giờ đến khi bạn còn muốn viết băng Win32 API.Tiếp đó là "HINSTANCE hInstance,HINSTANCE hPrevInstance" hai tham số này là handle cho instance hiện tại và trước đó.Thế nào là một instance?Giả sử bạn đã có một chương trình chạy được là hello.exe bạn chạy nó rồi chưa để nó kết thúc bạn lại chạy chương trình đó một lần nữa(tức là bạn chạy file hello.exe 2 lần), khi đó bạn có 2 instances, một cái trước và một cái sau.Còn "handle"?Khi bạn điều khiển một phần nào đó trong windows bạn đều cần đến handle của nó, handle giống như một chứng chỉ cho bạn, hay nói rõ hơn là một quyền quản lý cửa sổ hay nút bấm hay hộp hội thoại, vân vân Tham số tiếp theo là "LPSTR lpCmdLine" và "int nShowCmd",trong DOS chắc bạn đã từng sử dụng các lệnh, hay chạy các chương trình kiểu như: tên_chương_trình tham_số, ví dụ MD vd, lpCmdLine là con trỏ trỏ đến các tham số dòng lệnh , trong ví dụ này nó là "vd", nShowCmd là giá trị nguyên quản lý minimize, maximize, khi bạn cho chương trình tạm thời xuống taskbar hay mở rộng windows ra, tham số này sẽ quản lý các giá trị đó. Hàm MessageBox(), chỉ đơn giản hiện lên một thông báo, bạn chú ý là chuỗi ký tự đầu tiên hiển thị giữa hộp thông báo , còn chuỗi ký tự thứ 2 chính là tiêu đề của hộp thông báo đó. Chúng ta tạm dừng bài 2 ở đây, và chuyển qua bài 3.Bạn hãy tự mình tạo những hộp hội thoại thông báo khác nhau để hiểu rõ thêm về hàm MessageBox(). Mã nguồn của chương trình hello world : source code.Bạn chỉ việc bấm vào file có đuôi .dsw thì nó sẽ tự gọi Visual C++ lên cho bạn. Chương 2 Bài 3 Cấu trúc một chương trình trong windows Trong windows tất cả những nút bấm(button), editbox (hộp soạn thảo), listbox,combo box, đều được coi là một windows(cửa sổ), chính vì thế khi làm việc trong windows bạn hãy cứ coi mỗi thành phần chúng ta làm là một cửa sổ để điều hành và quản lý chúng. Mỗi cửa sổ windows(như nói ở trên) có một handle, handle là giá trị chứa quyển quản lý windows đó, khi bạn có một button hay một static text, bạn sẽ có một handle của nó, và bạn có thể điều khiển(thay đổi nội dung, làm cho nhìn thấy được, ẩn đi, ) những thành phần này. Bùi Minh Trường Kosen01 Cốt lõi của windows là việc xử lý thông điệp, thông điệp là gì, thông điệp là những thứ ta gủi qua nó để điều khiển windows, ví dụ chúng ta bấm chuột vào windows thì sự kiện bấm chuột đó được gửi tới windows thông qua thông điệp WM_LBUTTONDOWN, thông điệp này sẽ nằm trong hàng đợi và đợi windows xử lý, việc nằm trong hàng đợi trong khoảng thời gian ngắn nên bạn không thể xác định được, và cửa sổ của bạn lại đợi tiếp những thông điệp khác đến khi chương trình bạn kết thúc. Chúng ta hãy xét một ví dụ cụ thể sau đây: Một chương trình windows hoàn toàn cơ bản, bạn có thể lấy mã nguồn của nó để sử dụng cho việc lập trình sau này.Chú ý một điều là bạn không phải nhớ bất kỳ một mã lệnh nào, bạn chỉ cần hiểu cấu trúc của chương trình, sau khi lập trình nhiều tự khắc bạn sẽ nhớ.Các nhà lập trình cũng không ai nhớ hết mà họ sự dụng lại những mã nguồn cũ và sửa theo ý của mình. //filename program1: #include <windows.h> //Bạn luôn cần đến dòng lệnh này khi lập trình trong windows #include <stdio.h> //Thư viện chuẩn của C để cho xuất và nhập dữ liệu //Dưới đây là hàm mẫu (funtion prototype) hay hàm nguyên thuỷ, tại sao ta phải cần hàm này?Vì trong hàm //WinMain bạn sẽ cần đến nó nên ta phải khai báo nó ra đây, nếu không chương trình dịch sẽ không hiểu //hàm WinProc tồn tại.Giá trị trả về là LRESULT, chữ L viết tắt cho Long, còn Result có nghĩa là kết quả //trả về, lập trình trong win32 ta cần giá trị trả về là 32 bits nên hàm này trả về LRESULT.Sau giá trị trả về //là CALLBACK, thông số này là quy ước cho callback function.Nếu bạn muốn biết rõ callback function là //gì bạn có thể tìm hiểu trong các sách dạy về C, hay C++, tôi xin nêu qua như sau: callback funtion được //dùng khi chương trình chính phải bảo tồn thông tin từ chương trình con khác.Bạn cứ tạm hiểu là nó được //dùng để trao đổi thông tin giữa các chương trình. //Các tham số trong hàm này tôi sẽ giải thích kỹ ở phần dưới. LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { HWND hwnd; //handle cho window của bạn MSG msg; //Đây chính là thông điệp quản lý khi bạn bấm chuột, tắt chương trình, WNDCLASSEX wndclass; //Đây chính là class lưu trữ thông tin về tên, icon, cursor, màu , menu của chương trình của bạn //Tiếp theo chúng ta sẽ cài đặt các giá trị cho lớp window này. wndclass.cbSize = sizeof (wndclass);//Đặt kích cỡ cho lớp, tức là cung cấp bộ nhớ cho nó wndclass.style = CS_HREDRAW | CS_VREDRAW; //Kiểu của cửa sổ là vẽ lại theo chiều ngang và chiều dọc wndclass.lpfnWndProc = WndProc; //Đây là một thủ tục của cửa sổ , nó sẽ kiểm tra các thông điệp tác động đến wndclass.cbClsExtra = 0; //Chúng ta không cần cấp phát thêm phần mở rộng cho cửa sổ wndclass.cbWndExtra = 0; //Thông số này cũng vậy, tạm thời ta chưa quan tâm đến. wndclass.hInstance = hInstance; //instance hiện thời của chúng ta, bạn có thể có nhiều instance cùng một lúc wndclass.hIcon = LoadIcon (NULL, IDI_WINLOGO);//icon của chương trình là logo của windows wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);//Cursor được lấy từ cursor định nghĩa sẵn //GetStockObject() giúp ta lấy một thiết bị đồ hoạ như chổi tô, bút vẽ, nó trả về HGDIOBJ (handle cho GDI) //Vì vậy chúng ta cần phải biến đổi sang HBRUSH(handle cho chổi tô).Chúng ta chọn chổi tô là màu trắng wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH); wndclass.lpszMenuName = NULL; //Chúng ta chưa quan tâm đến menu của chương trình, hãy tạm thời bỏ qua wndclass.lpszClassName = "Window Class 1";//Đặt tên cho lớp cửa sổ này, để phân biệt với các cửa sổ khác wndclass.hIconSm = LoadIcon (NULL, IDI_WINLOGO);//icon này nằm ở bên trái phía trên của cửa sổ, hãy tạm thời dùng logo của windows RegisterClassEx (&wndclass);/*Bạn chú ý ở điểm này, chúng ta phải đăng ký với hệ điều hànhwindows rằng chúng ta sử dụng lớp này.Chúng ta cũng cần hệ điều hành cung cấp bộ nhớ cho cửa sổ này vì thế chúng ta dùng thêm ký tự "&".Bây giờ chúng ta mới chính thức tạo cửa sổ của mình với các thông số được cài đặt ở trên.*/ hwnd = CreateWindow ("Window Class 1",//lớp mà chúng ta đã đăng ký bên trên "My First Window",//Tiêu đề của cửa sổ, nó sẽ hiện trên đầu của cửa sổ và trên task bar WS_OVERLAPPEDWINDOW,/*Kiểu của cửa sổ là kiểu thông dụng, có những tính năng như thay đổi kích cỡ, làm nhỏ, phóng to, tắt cửa sổ,vv */ CW_USEDEFAULT, /*Cài đặt toạ độ x, tức là toạ độ x của góc trên bên tay trái của cửa sổ.Ta để windows tự đặt cho chúng ta.*/ CW_USEDEFAULT, /*Cài đặt toạ độ y, toạ độ y của góc trên bên tay trái của cửa sổ.Ta cũng để windows đặt cho.Bạn có thể tự đặt nếu muốn.*/ CW_USEDEFAULT,//Cài đặt chiều rộng của cửa sổ, windows sẽ đặt cho chúng ta CW_USEDEFAULT, //Cài đặt chiều cao của cửa sổ, windows cũng sẽ tự đặt NULL, /*Cửa sổ cha của cửa sổ chúng ta, vì chúng ta chưa có cửa sổ cha nên đặt nó là NULL*/ NULL,/*Tham số này là handle của cửa sổ, vì chúng ta chưa có menu nên đặt là NULL */ hInstance,/*Tham số này là handle của chương trình */ NULL);/*Tham số cuối cùng này là handle của instance, chúng ta chỉ gửi instance của chúng ta trong winmain , vì thế hệ điều hành sẽ lưu trữ hết thông tin cho chúng ta, chúng ta không cần quan tâm đến nữa, vậy để nó là NULL*/ ShowWindow (hwnd, iCmdShow); //Sau khi tạo xong chúng ta hiện thị cửa sổ vừa tạo lên. UpdateWindow (hwnd);//Bạn phải có dòng lệnh này để cập nhật khi thông tin của cửa sổ bị thay đổi. //Vòng lặp này là trung tâm của cửa sổ, nó đợi các thông điệp đến và xử lý chúng đến khi chương trình kết thúc //Hàm GetMessage() sẽ điền đầy đủ thông tin cho cấu trúc msg, chúng ta để handle của cửa sổ là NULL vì muốn nhận //thông điệp từ tất cả các cửa sổ, các tham số sau không quan trọng, ta tạm đặt cho nó bằng 0 while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg);//Dòng lệnh này sẽ dịch thông điệp để windows có thể hiểu chúng DispatchMessage (&msg);//Dòng lệnh này sẽ gửi thông điệp vừa dịch đến thủ tục WinProc để xử lý } return msg.wParam ;/*Giá trị trả về là 32 bits , msg.wParam chứa thông tin của thông điệp, đó là tại sao chúng ta lại chọn cho hàm WinMain trả về giá trị nguyên.Bạn sẽ thấy chúng ta sử dụng thông số này trong các bài sau*/ } //Bạn chú ý thủ tục này rất quan trọng, trong các chương trình khác nhau thì sẽ khác nhau, còn hàm WinMain thì có thể giống nhau //Vì thế bạn không cần nhớ cấu trúc của hàm WinMain vội mà hãy nhớ lấy cấu trúc của WinProc LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { switch (iMsg)//Kiểm tra thông điệp đến cửa sổ { //Trong bài này bạn chỉ cần chú ý đến thông điệp WM_DESTROY, tôi chỉ giới thiệu các thông điệp //khác cho có hệ thống.Chú ý là những thông điệp có tiếp đầu ngữ là WM_ đã được định nghĩa sẵn. case WM_CREATE: //Thông điệp này được xử lý khi cửa sổ được tạo, bạn hãy khởi tạo tất cả ở đây break; case WM_SIZE: //Thông điệp xảy ra khi cửa sổ bị thay đổi kích cỡ break; case WM_PAINT:/*Thông điệp này được gửi tới khi cửa sổ cần vẽ lại, tức là khi bạn di chuyển cửa sổ, thay đổi kích cỡ, làm to, thu nhỏ, nó sẽ vẽ lại cửa sổ cho bạn*/ break; case WM_DESTROY:/*Thông điệp này được gửi đến khi người dùng đóng cửa sổ*/ PostQuitMessage(0);/*Hàm này báo với windows là chúng ta muốn đóng cửa sổ.Bạn nên giải phóng bộ nhớ,đóng các chương trình tại đây*/ break; } //Dòng lệnh này sẽ báo với windows để xử lý các thông điệp mà chúng ta không quan tâm, hay những thông điệp //chúng ta chưa biết đến.Mục đích là tất cả các thông điệp đều được xử lý. return DefWindowProc (hwnd, iMsg, wParam, lParam); } Đó là toàn bộ một khung chương trình cơ bản trong windows, chúng ta sẽ cùng nhau ôn lại các bước làm : Bước 1: Khởi tạo lớp Bước 2: Đăng ký lớp Bước 3: Tạo cửa sổ Bước 4: Nhận thông điệp từ WinProc Bước 5: Dịch thông điệp và xử lý thông điệp đó. Nói tóm lại, khi bạn đã khởi tạo cửa sổ xong, người dùng sẽ tác động đến chương trình của bạn và đó là những thông điệp. WinProc sẽ có nhiệm vụ nhận những thông điệp đó và gửi cho WinMain, WinMain sẽ dịch thông điệp và xử lý thông điệp đó. Bạn đã biết tạo một chương trình trong windows và hãy tự mình làm một cửa sổ với những thông số mới về kích cỡ, màu nền, bạn muốn tìm hiểu sâu hơn thì xin hãy tra trong MSDN.Chúng ta sẽ chuyển qua bài mới. Chương 2 Bài 4 Device context Trong bài này tôi sẽ giới thiệu với các bạn về Device context(viết tắt là DC). Trước hết trong phạm vi của những bài tutorials này tôi sẽ giới thiệu về GDI (graphics device interface).Trong windows GDI cung cấp cho bạn nhứng hàm để vẽ ra vùng cửa sổ.DC có sách dịch là thiết bị ngữ cảnh nhưng theo tôi cứ để là DC, chắc các bạn sẽ dễ nhớ hơn.DC là một cấu trúc dữ liệu được duy trì bởi GDI, nó kết hợp với thiết bị cụ thể như màn hình hay máy in. Bùi Minh Trường kosen01 Nói như vậy rất rắc rối cho bạn mới học vì thế tôi xin nói vắn tắt như thế này, bạn cần có một handle của DC để vẽ, vì vậy trước khi vẽ bạn phải lấy được handle đó, trong windows handle đó được viết là HDC (handle to a device context). Bây giờ chúng ta sẽ bắt tay vào xây dựng một ví dụ cụ thể, như vậy sẽ dễ hiểu hơn phải không? Bạn có thể sử dụng ngay chương trình helloworld mà chúng ta viết ở bài trước, chỉ thêm vài dòng mã lệnh.Bạn chú ý là chúng ta có thể vẽ ở bất cứ đâu , bất cứ lúc nào, vì thế những dòng mã lệnh sắp thêm vào bạn có thể để trong hàm WinProc hoặc trong WinMain vì handle của cửa sổ trong tình huống này là như nhau.Tôi sẽ để những dòng mã lệnh mới trong hàm winmain. //filename: hdc.cpp #include <windows.h> #define WIN_WIDTH 320 //chiều rộng của cửa sổ đơn vị đo pixels(điểm ảnh) #define WIN_HEIGHT 240 //chiều cao của cửa sổ đơn vị đo pixels(điểm ảnh) #define class_name "vcsj_HDC" // Tương tự như bài trước, ta phải có hàm WinProc LRESULT CALLBACK WinProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam); int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprev, PSTR cmdline, int ishow) { HWND hwnd; MSG msg; WNDCLASSEX wndclassex = {0}; wndclassex.cbSize = sizeof(WNDCLASSEX); wndclassex.style = CS_HREDRAW | CS_VREDRAW; wndclassex.lpfnWndProc = WinProc; wndclassex.hInstance = hinstance; wndclassex.lpszClassName = class_name; wndclassex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); RegisterClassEx(&wndclassex); /*Dưới đây là một hàm tạo cửa sổ mới so với bài trước.Bạn có thể dùng hàm CreateWindow như bài trước, Hàm này nhiều hơn hàm trước hai tham số, đó là tham số đầu tiên, nó là kiểu mở rộng của cửa sổ và tham số cuối cùng là thông tin thêm gửi cho WinProc.Hàm này hiện nay được dùng nhiều hơn.Trong ví dụ này phần mở rộng chúng ta chưa xét đến mà hãy để NULL.*/ hwnd = CreateWindowEx(NULL, // Phần mở rộng, NULL có nghĩa là không có gì class_name, // Tên của lớp mà chúng ta đã đặt "http://vcsj.net HDC's", //Tiêu đề của cửa sổ WS_OVERLAPPEDWINDOW, // Kiểu của cửa sổ, xin hãy tham khảo trong MSDN CW_USEDEFAULT, //Toạ độ x góc trên bên trái CW_USEDEFAULT, // Toạ độ y góc trên bên trái WIN_WIDTH, // Chiều rộng của cửa sổ đã định nghĩa bên trên WIN_HEIGHT, // Chiều cao của cửa sổ đã được định nghĩa bên trên NULL, // Handle của cửa sổ cha, chúng ta không có cửa sổ cha trong ví dụ này [...]... lý được khi đó tất cả các thông điệp bạn muốn gửi tới chương trình không được xử lý hết.Lý do thứ hai là khi bạn dùng các phím đặc biệt của hệ thống, chẳng hạn Alt+Tab, khi đó chương trình của bạn sẽ mất focus và những thông điệp bàn phím của chương trình này chưa đựơc xử lý thì những thông điệp đó lại được gửi đến chương trình khác Lập trình trong windows, để xử lý bàn phím bạn xử lý các thông điệp... 2 Bài 7: Nâng cao: nhận thông điệp từ bàn phím Bài trước tôi đã trình bày với các bạn về cách nhận thông điệp từ bàn phím, cách đó đơn giản và thường được dùng trong trường hợp chúng ta không cần phải xử lý ngay lập tức thông điệp từ bàn phím mà có thể đợi các thông điệp khác trươc.Việc này sẽ khác khi bạn lập trình game, vì trong lập trình game bạn cần xử lý thật nhanh bàn phím để cho mọi sự biểu... windows trong các bài tiếp sau đây Bạn chú ý thực hành và tự cài đặt một chương trình nào minh thích Chương 2 Bài 8: Nhận thông điệp từ chuột Chuột là một thiết bị rất tiện lợi trong việc sử dụng máy tính hiện nay, nếu bạn xử lý tốt việc nhận thông điệp từ các thiết bị như chuột, bàn phím, joystick, thì bạn có thể dễ dàng tạo ra những chương trình giao tiếp người dùng thật thân thiện.Trong bài này chúng... chương trình Khi bấm nút "R" hoặc "r" Khi bấm nút "G" hoặc "g" Khi bấm nút "B" hoặc "b" Như vậy trên đây bạn đã có thể xử lý các thông điệp từ bàn phím, và các phím bây giờ chỉ là các phím có ký tự, trong bài tới đây tôi sẽ giới thiệu về cách nhận thông điệp từ bàn phím nhanh hơn, và hiệu quả hơn với tất cả các phím có mặt trên bàn phím của bạn Chương 2 Bài 7: Nâng cao: nhận thông điệp từ bàn phím Bài. .. hai dòng lệnh BeginPaint() và EndPaint().Mã nguồn của chương trình này nằm trong file hdc2.cpp Chúng ta tạm thời dừng nói về HDC tại đây, hi vọng bạn đã nắm bắt được cách làm và hãy tự làm một số ví dụ để quen với những hàm của GDI Chương 2 Bài 5 Viết một dòng chữ màu lên màn hình Như bài trước các bạn đã được tìm hiểu qua về HDC, trong bài này tôi sẽ nói về việc dùng HDC để viết ra một dòng chữ có... chương trình /*Dưới đây là những hàm liên quan đến HDC, bạn chú ý ghi nhớ phần này, đây mới thực sự là trọng tâm của bài này*/ HDC hdc = GetDC(hwnd);//Đây là một trong những phương pháp lấy handle HDC từ một cửa sổ có handle la hwnd if(!hdc) //Kiểm tra xem chúng ta có lấy được không , nếu không thì báo lỗi và kết thúc chương trình return EXIT_FAILURE; //Bây giờ chúng ta hiển thị cửa sổ, giống như bài. .. Kết quả khi chạy chương trình : Bây giờ bạn có thể dễ dàng xử lý với chuột để áp dụng vào những game sau này mà bạn sẽ viết.Tuy vậy chúng ta cũng còn rất nhiều điều để nói về cách xử lý chuột.Trong bài này tôi chỉ đề cập đến một thông điệp chuột di chuyển để cho đơn giản và dễ hiểu, bạn chỉ cần chú ý là thông số LPARAM sẽ quản lý toạ độ của chuột hiện thời là đủ trong bài này, bài tiếp theo tôi sẽ hướng... rất quan trọng.Bạn nên chú ý ghi nhớ những cách làm này.*/ UnregisterClass(class_name,hinstance); return msg.wParam; // Cuối cùng thoát khỏi chương trình } /*Hàm WinProc này không có gì mới so với bài trước, chỉ có thêm WM_CLOSE, tôi sẽ giải thích rõ ở các bài sau Hai thông điệp này gần giống nhau, tất nhiên sẽ có sự so sánh.*/ LRESULT CALLBACK WinProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)... xử lý bàn phím bạn xử lý các thông điệp WM_KEYDOWN,WM_KEYUP, với các phím thông thường và WM_SYSKEYDOWN,WM_SYSKEYUP, với các phím hệ thống.Trong chương trình dưới đây tôi sẽ trình bày về cách xử lý thông điệp WM_CHAR //filename vcsj_kb1.cpp //Chương trình dưới đây #include #define WIN_WIDTH 640 #define WIN_HEIGHT 480 #define X_COOR 300 //hoành độ điểm mà tại đó sẽ in chữ ra màn hình #define... iMsg, wParam, lParam); } Trong bài này bạn đã biết thêm được cách sử dụng hàm RGB(), cách sử dụng cấu trúc RECT để lấy thông tin về kích cỡ của cửa sổ, và cuối cùng là sử dụng được TEXTMETRIC để lấy thông tin về font hệ thống.Bạn hãy thực hành bằng cách in ra các dòng chữ khác nhau và với các màu khác nhau, bạn cũng không quên update bài học trên http://vcsj.net Chương 2 Bài 6: Nhận thông điệp từ bàn . hơn về lập trình hệ thống.Những chuỗi bài về lập trình API sẽ giúp bạn làm quen với lập trình windows từ đơn giản đến phức tạp. Bùi Minh Trường kosen01 Chương 1 Chương mở đầu Để sử dụng bài viết. Nếu ngày nào windows còn tồn tại thì ngày đó lập trình win32 bằng API vẫn sẽ tồn tại và phát triển. Hiện nay có rất nhiều thư viện lập trình cao cấp trong windows, rất thuận tiện và dễ. với tư cách là một nhà lập trình, các bạn sẽ khám phá những bí mật của Windows. Bạn cũng cần một trình biên dịch cho chương trình mà bạn sẽ viết ra, có rất nhiều chương trình dịch mà bạn có thể