Dẫn nhập vào lập trình Win32 api

Thật ra thì đây vẫn là C chỉ khác cái platform thôi. + Trước đây chúng ta học ngôn ngữ C với IDE là Borland C ( hoặc Turbo C ) trên nền ntvdm -> 1 sảm phẩm con trong gói sảm phẩm : MS Windows XP + Bây giờ chúng ta học C trên platform là windows, chúng ta sẽ tạo ra các chương trình giao tiếp trực tiếp với nhân của hệ điều hành windows chứ ko phải qua thằng ntvdm nữa. Các bạn chú ý là platform thay đổi chứ ngôn ngữ vẫn thế ( giống như là bạn nói tiếng anh ở nước anh, tiếng anh ở nước mĩ và tiếng anh ở việt nam vậy ) Và vì thế, toàn bộ từ khóa vẫn như thế, ko có từ khóa nào mới cả.

doc8 trang | Chia sẻ: lylyngoc | Lượt xem: 1665 | Lượt tải: 1download
Bạn đang xem nội dung tài liệu Dẫn nhập vào lập trình Win32 api, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
Dẫn nhập vào lập trình Win32 api Dẫn nhập lập trình C trên Windows Hôm nay, langman – x quyết định ngồi viết 1 tut nhằm mục đích đưa ra 1 cách tiếp cận với lập trình C trên windows, hy vọng có thể đơn giản hóa vấn đề 1 cách tốt nhất. Chắc là còn nhiều chỗ sai sót lắm, mong được các bạn giúp đỡ sửa lỗi I. Một vài kiến thức a. Từ khóa Thật ra thì đây vẫn là C chỉ khác cái platform thôi. + Trước đây chúng ta học ngôn ngữ C với IDE là Borland C ( hoặc Turbo C ) trên nền ntvdm -> 1 sảm phẩm con trong gói sảm phẩm : MS Windows XP + Bây giờ chúng ta học C trên platform là windows, chúng ta sẽ tạo ra các chương trình giao tiếp trực tiếp với nhân của hệ điều hành windows chứ ko phải qua thằng ntvdm nữa. Các bạn chú ý là platform thay đổi chứ ngôn ngữ vẫn thế ( giống như là bạn nói tiếng anh ở nước anh, tiếng anh ở nước mĩ và tiếng anh ở việt nam vậy ) Và vì thế, toàn bộ từ khóa vẫn như thế, ko có từ khóa nào mới cả. b. Quy ước đặt tên của microsoft Sẽ thật là khó nắm bắt, thật là hoa mắt nếu bạn ko hiểu được quy tắc đặt tên của ms. Bạn hãy để ý kĩ, chúng có quy tắc đấy, và nó như sau: _ Tất cả các kiểu dữ liệu mở rộng của windows , tên class, tên struct, tên hằng số định sẵn đều được viết in hoa Ví dụ : tên kiểu dữ liệu : UINT , ATOM , HANDLE, HWND, BYTE,…. tên cấu trúc : MSG, PAINSTRUCT, WNDCLASS ,.... (đây là C nên chưa có class) tên hằng số định sẵn : NULL, IDI_APPLICATION, CS_VREDRAW,….. _ Tất cả các method (các hàm, các phương thức) đều được viết hoa (pascal notation). Ví dụ : LoadIcon(…) LoadCursor(…) SomeOtherName(…) _ Tất cả các tên biến, tên đối tượng đều được viết theo camel notation : ( chữ cái đầu viết thường, còn đoạn sau thì được viết theo chuẩn của pascal) Ví dụ: hWnd; // cá nhân tôi thì thích đặt là hwnd hơn cho nó gọn gàng msg; wParam hInstance someOtherName ồ, nếu bạn nắm được quy tắc này, nhìn vào các source sẽ thấy nó đỡ hoa mắt hơn rồi đó, ta đã thấy được nó đơn giản hơn 1 chút rồi !!! Nhân tiện , nói về ms, chúng ta , người vn có lẽ nên tự hào vì đại diện cho ms tại đông nam á chính là 1 tiến sĩ hói đầu người việt nam. He he he……. c. Handle Đây là 1 từ rất hay gặp trong tin học, khuyên chân thành đừng có dùng google để tra nó và cũng ko nên nên tra nó làm gì, từ này ko nên dịch, x sẽ giải thích nó cho bạn ngay giờ đây, ( trình độ tiếng anh của mình hơi lùn, có gì mong được bỏ qua cho) + Số hiệu : xuất phát từ ý tưởng như này, trong ngành công an có rất nhiều người, có nhiều người trùng cả tên lẫn họ , nhưng mỗi đồng chí công an đều có 1 số hiệu riêng, đó là ID của mỗi người, và khi cần tra về 1 ai đó, tất nhiên là tra bằng số hiệu này rồi,.. + File handle : đối với file , chương trình của bạn làm sao để hiểu rằng bạn đang làm việc với file nào ? nằm ở đâu ? chả lẽ mỗi lần bạn mở file để ghi thì tạo 1 biến kiểu xâu kí tự để lưu trữ đường dẫn của file à như thế quá dài dòng, loằng ngoằng. Hệ thống có cung cấp cho chúng ta 1 file table, nó tồn tại trong ổ cứng của bạn với cái tên là FAT table. Mỗi file có 1 số hiệu riêng, và cái chúng ta dùng để định danh nên các file chính là số hiệu này. Ví dụ dễ hiểu 1 cái table nha : (tất nhiên là trên thực tế nó lôm côm hơn nhiều như này) PHP Code: Số hiệu    Tên file    Đường dẫn 007            a.mp3    D:\\Music\\ 008            b.avi     D:\\Setup 009            a.mp3    C:\\  + Window handle : trong màn hình chúng ta có rất nhiều cửa sổ với các cái tên khác nhau, vậy OS nắm bắt các cửa sổ này thế nào ? Mỗi cửa số có 1 số hiệu riêng, nó chính là handle của 1 cửa sổ. và OS sẽ thông qua thông số đó để hiểu từng cửa sổ Vậy handle là 1 số nguyên, nó dùng để định danh lên 1 object cụ thể. Số này được ánh xạ qua handle table để chỉ ra đối tượng đó. Trong windows 32bit nó là 1 số nguyên 4byte Trong các tên do ms định ra, thì từ h được viết tắt của handle Ví dụ : HWND, HINSTANCE, hPrevInstance d. Một số từ khó hiểu + WINAPI , CALLBACK : từ này đặt trước hàm main, ở 1 số tài liệu khác còn có các từ như APIENTRY, PASCAL , APIPRIVATE Thật là khủng bố khi mà có quá nhiều từ đáng sự như thế với nhưng bạn hãy bình tĩnh, sau 1 hồi mở các file .h lên tôi tìm được mấy dòng này : #define CALLBACK __stdcall #define WINAPI __stdcall #define APIENTRY WINAPI #define APIPRIVATE __stdcall #define PASCAL __stdcall Chúng đều là 1, thật tuyệt vời , chúng là 1 cả thôi, google tôi thấy chúng là calling convention. Tuyệt. Vậy chúng thuộc vào nhóm compiler to compiler. Những từ này thêm vào trước tên hàm nhằm mục đích chỉ rõ cho compiler hàm này có cách tổ chức phục vụ cho việc gọi đến như thế nào.... Nói tóm lại, bạn chỉ cần biết : _ chúng thuộc loại “compiler to compiler” và chúng đều là 1 _ Đừng viết lẫn lộn nó để tránh nguy cơ…. bị thầy giáo chém + LRESULT : nói 1 cách đơn giản thế này , đây chính là kiểu dữ liệu nguyên 4byte, và 1 cái nhìn đơn giản : nó là 1 số nguyên. Bạn cũng chỉ cần nhớ thế thôi, (còn nữa) __________________ ^_,^ Đã được chỉnh sửa lần cuối bởi langman : 24-06-2010 lúc 09:09 AM. Lý do: đính chính lại   #2   13-06-2010, 04:39 PM peterdrew Thành viên nhiệt tình Ngày gia nhập: 01 2010 Nơi ở: Горячие блины Bài viết: 2,677 Trích dẫn: Nguyên bản được gửi bởi langman + LRESULT : nói 1 cách đơn giản thế này , đây chính là kiểu dữ liệu 8 byte, Tuy bài này chưa hoàn thiện, nhưng anh muốn bổ sung về vấn đề này! Langman nói nó là một số long 8 byte thì chỉ đúng với môi trường 64 bit thôi; chứ khi mọi người (đa phần) dùng 32 bit thì LRESULT là kiểu trả về tương ứng với số nguyên 4 byte..... Còn vấn đề về Handle thì cũng có nhiều bàn cãi, tuy nhiên anh cũng phân tích thế này (bởi vì ngoài Handle ra còn có một cái là Instance nữa): Mỗi một cửa sổ khi được tạo ra thì nó giống như một công dân bắt đầu nhập cộng đồng; để Nhà nước quản lý được công dân này thì Công dân này phải được cấp quyền công dân thông qua Chứng minh thư; chứng minh thư là một loại thẻ mà không thể có 2 (hoặc nhiều hơn) công dân nào trùng nhau! Windows cũng vậy; nó quản lý các cửa sổ thông qua một địa chỉ (số nguyên) đã được cấp cho cửa sổ, số nguyên này để Windows nhận dạng và điều hành cửa sổ, vậy tất cả các cửa sổ khi tạo ra đều được cấp loại địa chỉ này! Cũng phải mở rộng cái nào được gọi là cửa sổ? Cái nào không được gọi là cửa sổ?.... Cửa sổ bao giờ cũng có Handle, còn một "đối tượng" nào đó khi khởi tạo mà không có Handle thì không được gọi là cửa sổ! Vậy Label trong VB6 (hoặc Static trong MFC,...) đều không được gọi là cửa sổ; còn lại đa phần các đối tượng khác đều được coi là cửa sổ (Button, EditBox,....)... Thêm một cái nữa là Instance (thể hiện): Mỗi cửa sổ được tạo ra nó lại được cung cấp một "địa chỉ" kiểu Handle để quản lý các thể hiện của mình, ví dụ như khi ta mở một chương trình (app), sau đó lại mở chương trình đó một lần nữa; như vậy cùng một chương trình (app) mà có 2 thể hiện khác nhau! Như vậy các bạn cũng cần phân biệt Handle và Instance!..... __________________ Верность познается во время больших смут   #3   15-06-2010, 11:33 AM HTT90 Thành viên nhiệt tình Ngày gia nhập: 10 2008 Bài viết: 270 Em bổ sung thêm vào ý anh peter . Định nghĩa LRESULT trong MSDN thế này . typedef LONG_PTR LRESULT và LONG_PTR #if defined(_WIN64) typedef __int64 LONG_PTR; #else typedef long LONG_PTR; #endif Mong sẽ nhận được các bài tút khác của langman . __________________ chicken   #4   23-06-2010, 08:22 PM langman Thành viên mới Ngày gia nhập: 06 2007 Nơi ở: C:\WINDOWS\system32\dllcache\ Bài viết: 3,505 anh pt ơi, với vs2010 và vs2008 đều là 8byte hết, e chạy os windows7 32bit mà hôm trước, e test máy thầy giáo chạy os windows 7 64 bit, thấy int vẫn là 4byte,( trên borland và dev-C ), tuần sau đề nghị thầy giáo test hộ trên VS xem có khác ko @HTT90 : mình ôn thi nốt tuần nữa được nghỉ hè sẽ tập trung toàn bộ sức mạnh nhỏ mọn của bản thân vào C việt __________________ ^_,^   #5   23-06-2010, 08:30 PM peterdrew Thành viên nhiệt tình Ngày gia nhập: 01 2010 Nơi ở: Горячие блины Bài viết: 2,677 Ừ, vậy chắc anh mới chỉ thấy nó là 4 byte; cũng không sao mà, chú tiếp tục đi, chủ đề này hay đó... __________________ Верность познается во время больших смут   #6   23-06-2010, 08:40 PM richtran Thành viên chính thức Ngày gia nhập: 04 2009 Bài viết: 64 Mấy bác cho một chương trình demo thử!   #7   24-06-2010, 08:59 AM langman Thành viên mới Ngày gia nhập: 06 2007 Nơi ở: C:\WINDOWS\system32\dllcache\ Bài viết: 3,505 Trích dẫn: Nguyên bản được gửi bởi peterdrew Ừ, vậy chắc anh mới chỉ thấy nó là 4 byte; cũng không sao mà, chú tiếp tục đi, chủ đề này hay đó... a để e đính chính lại Trích dẫn: Nguyên bản được gửi bởi richtran Mấy bác cho một chương trình demo thử! nốt vụ ôn thi nầy rồi viết tiếp sẽ đưa demo lên __________________ ^_,^   #8   27-06-2010, 12:02 AM langman Thành viên mới Ngày gia nhập: 06 2007 Nơi ở: C:\WINDOWS\system32\dllcache\ Bài viết: 3,505 cám ơn anh pt, em đã check. đúng như a nói, nó chỉ là 8b trong môi trường 64bit em test máy thầy windows7 64bit và vs2010 cho chính tay e cài, lúc cài chọn 64 bit __________________ ^_,^   #9   27-06-2010, 08:47 PM benina Thành viên mới Ngày gia nhập: 09 2008 Bài viết: 24 Handle: em thấy dịch là "thẻ quản" là hay nhất. cho em góp lửa chút nhe.   #10   28-07-2011, 08:54 PM tuoitho Thành viên mới Ngày gia nhập: 09 2008 Nơi ở: Bắc Ninh Bài viết: 3 hix, bài viết này cũng khá lâu rùi, nhưng mình mới học vc++ nên đọc đc bài này rất bổ ích, chủ topic có thể tiếp tục chủ đề được không?
Tài liệu liên quan