Tài liệu Như vậy là bạn muốn trở thành một lập trình viên? pdf

41 422 0
Tài liệu Như vậy là bạn muốn trở thành một lập trình viên? pdf

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Như vậy bạn muốn trở thành một lập trình viên? 3 Giới thiệu Thế bạn nghĩ rằng lập trìnhmột thế giới vô cùng thú vị, và bạn muốn tham gia vào thế giới ấy? Trước khi bạn bắt đầu, điều duy nhất mà tôi muốn khuyên là: nếu bạn thực sự yêu thích lập trình thì đó rõ ràng công việc tốt nhất mà bạn có thể có được. Ngược lại, nếu bạn chỉ cảm thấy thích, hay không quan tâm lắm đến lập trình, thì đó rõ ràng công việc tồi tệ nhất của bạn. Bởi vì bạn đang gia nhập vào một thế giới mà sự cạnh tranh luôn là nỗi ám ảnh không thể tránh khỏi. Phát triển phần mềm gần như một cuộc đua tranh. Trong đó, cuộc sống của bạn một con đường và bạn phải chạy càng nhanh càng tốt, không cần biết dưới chân có gì, cho đến khi gặp đồng bằng hoặc đụng phải vách đá cheo leo. Nếu bạn sẩy chân, mọi thứ kết thúc, và đó hoàn toàn lỗi của bạn. Nghe có vẻ hơi ghê gớm đúng không? Nhưng đừng để những điều đó làm bạn nản lòng. Tôi chỉ không muốn vẽ nên một viễn cảnh tươi đẹp, nơi có những cánh đồng xanh ngút ngàn và những đám mây lững lờ trôi trên nền trời xanh thẳm. Thực tế có thể chỉ vài phút sau đó trời sẽ mưa và bạn thì chẳng mang theo dù. Thế nhưng, chính những điều không chắc chắn, những thách thức và áp lực sẽ làm cho cuộc sống trở nên đầy hứng thú. Bạn vẫn còn đọc đến đây ư? Rất tốt, thế có nghĩa bạn hoàn toàn nghiêm túc về điều này. Bây giờ điều tôi sẽ nói với bạn một bản phác thảo về những gì đang chờ đợi bạn trong thế giới lập trình, chúng ta sẽ nói một ít về kỹ thuật và cả những niềm vui của thế giới ấy. Bạn cần gì để trở thành một lập trình viên? Tôi không nghĩ rằng có một vài yêu cầu khó khăn nào đó khiến bạn không thể trở thành lập trình viên, tôi chỉ đơn giản nghĩ rằng bất cứ ai có một ít (hay rất nhiều) mong muốn đều có thể trở thành lập trình viên. Vấn đề chỉ bạn dành ra bao nhiêu thời gian. Điều đó có nghĩa là tôi nghĩ có nhiều quan niệm sai lầm về những kỹ năng cần có để trở thành lập trình viên. Trước tiên, bạn không cần phải thật xuất sắc trong môn Toán, bạn chỉ cần có khả năng hiểu được những điều cơ bản. Dĩ nhiên có những ngoại lệ, nếu bạn có hứng thú trong lĩnh vực đồ họa hay lập trình game thì một kiến thức Toán vững vàng sẽ giúp bạn rất nhiều. Một quan niệm sai lầm khác bạn cần phải thiên tài logic. Nói chung, điều đó không phải bắt buộc, dĩ nhiên tư duy logic càng tốt thì càng dễ dàng hơn khi tiếp cận thế giới lập trình. Vậy thì kỹ năng nào cần thiết? Bị thúc đẩy bởi những thách thức yếu tố quan trọng nhất. Đơn giản bạn đang tham gia vào một trò chơi trong đó thách thức xuất hiện trong mọi ngõ ngách. Một điều quan trọng khác phải không ngừng theo đuổi mục tiêu, nhưng vẫn phải luôn uyển chuyển để không đuổi theo một cách mù quáng những mục tiêu xa vời. Còn trường học thì sao? Trường học nơi tuyệt vời để học mọi thứ ngoại trừ công nghệ. Đừng cho tôi sai, tôi không nói rằng tôi nghĩ trường học không quan trọng. Ngược lại, tôi nghĩ trường học rất quan trọng, nhưng không phải để học lập trình. Những Như vậy bạn muốn trở thành một lập trình viên? Việt Thanh Tổng hợp từ Internet Không bao giờ sợ phải bắt đầu. Tôi sẽ không viết hai lần cùng một đoạn mã giống nhau. Khi phát triển phần mềm, hãy nghĩ đến tương lai. Viết mã càng ít bao nhiêu, mắc lỗi càng ít bấy nhiêu. Bạn sẽ không bao giờ trở thành một lập trình viên giỏi nếu chỉ tập luyện 2 giờ mỗi ngày. Tất cả các công việc đều có phần thú vị và phần buồn chán, không có ngoại lệ. Kẻ thù số một của các lập trình viên gì? Kiêu căng. Lập trình viên sử dụng hầu hết thời gian của mình vào việc sửa lỗi. Chương trình càng dễ đọc bao nhiêu càng tiết kiệm thời gian bấy nhiêu. Trường học khiến các bạn tin rằng chương trình của bạn chỉ cần thỏa mãn một mình bạn đủ. Điều này hoàn toàn sai lầm. Chương trình phải thỏa mãn khách hàng và các lập trình viên khác. 4 gì bạn nên tập trung thật sự ở trường học cách để làm việc với những người khác trong một đề án. Cũng như học cách những người xung quanh giải quyết vấn đề và cách thức giải quyết của họ khác cách của bạn ở chỗ nào. Trường học thường bắt bạn phải làm những thứ có thể bạn không thích. Chẳng hạn, tôi nhớ lúc tôi học môn “Thiết kế trình biên dịch”, tôi tự nhủ: “Thật mất thời gian một cách vô ích, tôi chẳng bao giờ cần phải thiết kế trình biên dịch làm gì”. Nhưng, điều tôi đã học được làm thế nào để giải quyết những vấn đề hoàn toàn khác nhau, và kiến thức này giúp tôi làm được nhiều việc khác. Một trong những thuận lợi bạn có được từ trường học bạn có thể gặp gỡ bạn bè có cùng chí hướng và có thể sau này trở thành đồng nghiệp của bạn. Ngành công nghiệp phần mềm ở nhiều khía cạnh rất giống với ngành công nghiệp điện ảnh, khi có ai đó bị lôi cuốn vào một đề án đầy tham vọng, họ thường mời bạn bè cùng hợp tác. Nếu bạn không biết họ từ trước, bạn sẽ không thể mời (hay thuê), và trong nhiều trường hợp, trường học chính nơi bạn có thể tìm được những người có cùng sở thích. Một khía cạnh khác không thể bỏ qua trường học không chỉ dạy về kỹ thuật mà còn dạy về lịch sử, về tâm lý,… Và trong khi những thứ ấy có vẻ không liên quan trực tiếp đến lập trình, bạn có thể sẽ rất ngạc nhiên nếu biết rằng đó cũng một trong những nguồn cảm hứng mà tôi từng có. Tôi nên bắt đầu từ đâu? Trước tiên, tôi khuyên bạn nên cân nhắc cẩn thận trước khi có một quyết định quan trọng. Như tôi đã nói, thế giới lập trình có thể rất lý thú, nhưng cũng đầy gian nan. Do đó, đừng bao giờ nhảy bổ vào mà không suy nghĩ kỹ. Việc đầu tiên cần làm dĩ nhiên tìm mua một cuốn sách dạy lập trình. Nhưng có quá nhiều sách và quá nhiều ngôn ngữ. Tôi khuyên bạn nên chọn một trong các ngôn ngữ sau: C, C++, Visual Basic, Pascal (Delphi) hay Java. Khoan hãy nghĩ đến những ngôn ngữ khác, bởi vì chúng hoặc quá phức tạp cho người mới bắt đầu hoặc quá đơn giản để có thể đưa bạn vào thế giới lập trình. Nhưng dù thế nào thì bạn cũng nên chọn một ngôn ngữ vào thời điểm này. Những ngôn ngữ này rất giống nhau, và vô cùng mạnh mẽ. Hầu như mọi ứng dụng thương mại đều có thể được viết bởi một trong những ngôn ngữ trên. Phương pháp của tôi chọn 2 quyển sách cho mỗi ngôn ngữ đã nêu ở trên. Đọc sơ qua trước, và chú ý các ví dụ, mã nguồn trong đó. Sau khi đã đọc sơ qua tất cả các quyển sách đã chọn, hãy chọn quyển sách gây cho bạn nhiều hứng thú nhất. Và ngôn ngữ mà quyển sách đó đề cập chính ngôn ngữ bạn nên học đầu tiên. Bây giờ hãy chọn thêm vài quyển sách về ngôn ngữ đó, mỗi quyển, bạn hãy đọc một phần chương đầu tiên, bạn có cảm thấy quan tâm đến nó không? Nếu không, hãy bỏ quyển sách ấy và chọn một quyển khác; nếu có, hãy lật đến giữa quyển sách và một phần chương mà bạn bắt gặp, vẫn cảm thấy quan tâm đến quyển sách ấy đúng không? Tốt, đó quyển sách có thể bạn sẽ chọn. Đừng cố hiểu nó viết cái gì, chỉ cần tìm hiểu xem nó có mang đến cho bạn sự quan tâm về ngôn ngữ đó hay không. Tiếp tục phương pháp này cho đến khi không còn quyển sách nào cả, bạn có thể tìm được quyển sách gây cho bạn nhiều hứng thú nhất để học ngôn ngữ đó. Những công cụ cần thiết Hãy nhìn thẳng vào vấn đề, chọn đúng công cụ sẽ làm cho công việc trở nên dễ dàng hơn. Điều này càng chính xác hơn trong lĩnh vực phát triển phần mềm. Có thể Microsoft đã tạo ra môi trường phát triển tốt nhất, Microsoft Developers Studio. Do đó, nếu bạn dùng C/C++, Visual Basic,… thì có lẽ đây sẽ thứ bạn cần. Tuy nhiên, vẫn có nhiều công cụ thay thế miễn phí khác cho những ngôn ngữ này. Bạn có thể kiểm tra thử nếu thích. Một công cụ khác cũng rất quan trọng, đó trình soạn thảo mã lệnh (code editor). DevStudio có một trình soạn thảo mã lệnh tích hợp sẵn, và đó một trong những lý do khiến nhiều người dùng nó. Cá nhân tôi không thích bị ràng buộc bởi một môi trường phát triển nào. Do đó, tôi thích dùng công cụ soạn thảo MultiEdit (http://www.analogx.com/cgi-bin/cgirdir. exe?http://www.multiedit.com/). Tôi đã sử dụng nó trong nhiều năm. Và tôi rất tự hào khuyên những ai muốn tìm một công cụ thay thế cho DevStudio hãy dùng nó. Hãy người lạc quan Tôi từng nghe người ta nói rằng kẻ lạc quan nhất trên thế giới chính nhà phát triển phần mềm. Trong suy nghĩ của họ, không có phần mềm nào không thể viết được. Một ví dụ nhỏ, bạn hãy vào thử một site download phần mềm nào đó mà xem. Có hàng trăm hàng ngàn phần mềm bao gồm mọi lĩnh vực. Làm thế nào mà người ta có thể sáng tạo ra từng ấy phần mềm. Chúng nhiều và tốt đến nỗi bạn không thể nghĩ ra nên sáng tạo thêm phần mềm nào. Thế nhưng từng ngày từng giờ, các nhà 5 phát triển phần mềm luôn sáng tạo và cho ra nhiều phần mềm mới hơn nữa, những phần mềm mà đã có thời người ta cho không thể tạo ra được. Dù sao thì lạc quan mấy cũng phải có giới hạn. Mấu chốt của vấn đề họ không nhìn mọi thứ một cách tổng thể, mà ở từng phần cụ thể. Ở một chừng mực nào đó, có thể xem đấy đặc trưng của ngành thiết kế phần mềm, chia dự án ra thành những phần nhỏ và giải quyết từng phần. Nếu bạn không phân phối thời gian hợp lý, bạn sẽ không thể nào hoàn thành công việc. Khi bạn bắt đầu viết chương trình “thực sự” đầu tiên (nghĩa chương trình có thể thực hiện được một công việc nào đó cần thiết cho mọi người, không phải cho riêng bạn), phải chắc chắn rằng bạn dành đủ thời gian để vạch ra kế hoạch về những việc bạn định làm, thứ tự thực hiện, và kết quả cuối cùng gì. Nếu bạn làm điều này, bạn sẽ thấy mọi thứ trở nên dễ dàng hơn và có thể hoàn thành nhanh hơn bạn nghĩ. Hãy làm việc theo nhóm! Nếu bạn dự định trở thành một lập trình viên đơn độc, hãy suy nghĩ lại. 99,9% các dự án đòi hỏi phải làm việc theo nhóm. Và do đó, bạn cần phải có kinh nghiệm làm việc theo nhóm, phối hợp với những người khác trong một dự án. Một khi bạn đã hoàn thành những dự án nhỏ của riêng mình, đó lúc bắt đầu tìm cách tham dự vào một dự án có nhiều người tham gia. Đó có thể một game, một bản demo, hay bất cứ thứ gì. Chỉ cần đó dự án làm bạn quan tâm. Có nhiều các để tìm dự án, bạn có thể gia nhập vào những dự án đã có, tìm kiếm những nhóm vừa mới thành lập và xin gia nhập, hay thậm chí tự lập một dự án và mời người khác cùng cộng tác. Điều quan trọng nhất bạn phải học cách làm việc cùng với những người khác để thực hiện mục tiêu chung. Những thứ nên đọc! Đọc sách nguyên tắc cơ bản… Và điều này càng chính xác trong ngành phát triển phần mềm. Nếu bạn người không thích đọc sách, có lẽ bạn nên chọn một công việc khác. Bởi vì đọc sách chính là chìa khóa để củng cố và hiện thực hóa những tiềm năng của bạn. Bạn có thể tự hỏi vì sao tôi có thể viết nhiều phần mềm trong thời gian ngắn như thế? Có 3 lý do chính: kinh nghiệm, những đồng nghiệp tài năng mà tôi luôn hài lòng khi được làm việc chung và cuối cùng những quyển sách tôi đã đọc. Tôi không thể giúp bạn có được kinh nghiệm và những bạn đồng nghiệp giỏi, nhưng tôi có thể giới thiệu cho bạn những quyển sách hay: Code Complete Đây quyển sách cần thiết cho mọi nhà phát triển phần mềm, bất kể họ đang dùng ngôn ngữ lập trình nào. Nó bao gồm nhiều bài thực hành và nhiều kỹ thuật liên quan đến phong cách viết mã. ISBN: 1-55615-484-4 Rapid Development Quyển sách này hướng đến việc lập kế hoạch cho một dự án, tập trung vào những lỗi tiềm ẩn có thể mắc phải,… Đây quyển sách cho bạn biết thế giới thực sự của ngành phát triển phần mềm. ISBN: 1-55615-900-5 Dynamics of Software Development Quyển sách này có một hướng tiếp cận khác, tập trung vào việc làm việc theo nhóm và động lực của việc lập trình. Đây điều thỉnh thoảng bị xem nhẹ, và hậu quả có thể được thấy trong nhiều dự án bị thất bại. ISBN: 1-55615-823-8 The Mythical Man-Month Đây thực sự một quyển sách nên đọc. Dù rằng nó đã được viết cách đây hơn 20 năm, thế nhưng vẫn có nhiều điều có thể áp dụng. ISBN: 0-201-83595-9 Programming Windows Nếu bạn có ý định lập trình trên Windows (bằng C hay C++), bạn cần phải mua quyển sách này. Theo tôi đây quyển sách dạy lập trình Windows tốt nhất. ISBN: 1-57231-995-X The Art of Ware Tôi một người hâm mộ cuồng nhiệt Tôn Tử, do đó tôi rất thích thú khi đọc quyển sách này. Đây một quyển sách có phong cách viết rất lôi cuốn, với những bài học trong binh pháp Tôn Tử được vận dụng vào ngành phát triển phần mềm. ISBN: 1-55851-396-5 Ghi chú: các bạn có thể tìm những quyển sách trên bằng cách tìm kiếm trên Google hay những site bán sách. Ở Việt Nam, bạn có thể vào site http://www. sachtinhoc.com hay http://www.sachtuhoc.com và nhờ họ mua giúp. Tổng kết Hy vọng tôi đã nêu được một số điều cần thiết để trở thành một lập trình viên, không phải về mặt kỹ thuật mà về mặt tư duy. Cá nhân tôi cho rằng lập trình một công việc đầy hứng thú. Không có gì vui hơn khi nhìn thấy ai đó đang sử dụng phần mềm do bạn viết để làm cho cuộc sống của họ tốt hơn, dù chỉ là một phần nào đấy. Do đó, nếu bạn quyết định theo đuổi ngành phát triển phần mềm, tôi xin chúc bạn may mắn và hy vọng một ngày nào đó tôi sẽ có dịp download phần mềm do bạn viết để sử dụng. 6 Bài này nhằm hướng dẫn bạn cách thiết lập một cửa sổ OpenGL. Cửa sổ này có thể ở chế độ bình thường (window) hay toàn màn hình (fullscreen), có kích cỡ (size), độ phân giải (resolution) và độ sâu màu (color depth) tùy thích. Đoạn mã rất dễ điều chỉnh do đó có thể dùng lại trong tất cả các chương trình OpenGL khác. Tôi sẽ không nói dông dài về lý thuyết mà đi ngay vào phân tích phần mã chương trình. Đây cũng một cách học tốt, bạn sẽ được giải thích từng đoạn mã trong chương trình, và cả những bài viết tiếp theo cũng sẽ như thế. Điều đầu tiên bạn cần phải làm tạo một project mới trong Visual C++. Nếu bạn vẫn chưa biết cách tạo một project, bạn chưa nên học OpenGL lúc này, bạn nên học về Visual C++ trước. Chương trình nguồn cho bài viết này được xây dựng bằng chương trình Visual C++ 6.0. Nhưng bằng cách thay đổi vài chi tiết nhỏ về tên các từ khóa, tôi có thể biên dịch thành công chương trình này bằng VC++4 và VC++5. Sau khi bạn tạo một ứng dụng Win32 mới (không phải ứng dụng console) trong Visual C++, bạn cần liên kết các thư viện OpenGL với chương trình của mình. Trong Visual C++ vào menu Project, Settings, và click vào tab LINK, ở mục “Object/library modules” thêm vào (trước kernel32.lib) OpenGL32. lib GLu32.lib và Glaux.lib. Click OK, giờ thì bạn đã sẵn sàng viết một chương trình OpenGL. Bốn dòng đầu tiên include các chúng ta dùng. #include <windows.h> // File Header cho Windows #include <gl\gl.h> // File Header cho OpenGL32 #include <gl\glu.h> // File Header cho GLu32 #include <gl\glaux.h> // File Header cho GLaux Tiếp theo tất cả các biến toàn cục mà bạn sẽ dùng trong chương trình. Chương trình của chúng ta sẽ tạo ra một cửa sổ OpenGL trống, vì vậy bây giờ chúng ta không cần quá nhiều biến. Các biến mà chúng ta khai báo dưới đây rất quan trọng, và sẽ được dùng trong mọi chương trình OpenGL mà bạn sẽ viết sau này bằng cách dùng lại phần mã này. Dòng đầu tiên khai báo một RC (Rendering Context). Mỗi chương trình OpenGL đều được liên kết với một RC. Rendering Context các liên kết OpenGL gọi đến Device Context. OpenGL Rendering Context được khai báo hRC. Và để chương trình vẽ một cửa sổ bạn cần tạo một DC (Device Context), ở dòng thứ 2 của chương trình, Windows Device Context được khai báo hDC. DC kết nối Window với GDI (Graphics Device Interface). RC kết nối OpenGL với DC. Dòng thứ 3 biến hWnd sẽ giữ một handle (điều khiển) được gán cho cửa sổ của chúng ta bởi Windows, và cuối cùng, dòng thứ 4 tạo một instance (thể hiện) cho chương trình của chúng ta. HGLRC hRC=NULL; // Rendering Context HDC hDC=NULL; // Private GDI Device Context HWND hWnd=NULL; // Handle Window HINSTANCE hInstance; // Instance của ứng dụng Bây giờ chúng ta sang đoạn mã tiếp theo, dòng đầu tiên khai báo một mảng dùng để quản lý các phím Căn bản về OpenGL Bài 1 - Thiết lập một cửa sổ OpenGL Tô Nguyễn Thanh Vũ Theo nehe.gamedev.net 7 được nhấn trên bàn phím. Có nhiều cách để làm điều này, và bạn có thể tự chọn một cách theo bạn tốt nhất. Tôi chọn cách dùng mảng vì nó chính xác và có thể quản lý nhiều hơn một phím nhấn ở một thời điểm. Biến active giúp cho chương trình biết được cửa sổ của chúng ta đang thu nhỏ nằm ở taskbar (minimized) hay không. Nếu như cửa sổ đang thu nhỏ, chúng ta có thể hiện thực bất kì điều gì từ tạm thời dừng chương trình cho đến thoát khỏi chương trình. Tôi thích tạm dừng chương trình. Ý nghĩa của biến fullscreen rất dễ hiểu. Nếu chương trình của chúng ta đang chạy ở chế độ toàn màn hình, fullscreen sẽ bằng TRUE, ngược lại nếu chương trình chạy ở chế độ cửa sổ, fullscreen sẽ bằng FALSE. Biến này nên biến toàn cục vì mỗi thủ tục đều cần phải biết chương trình đang chạy ở chế độ nào. bool keys[256]; // Mảng cho phím nhấn bool active=TRUE; // Cờ Active mặc định // bằng TRUE bool fullscreen=TRUE; // Cờ Fullscreen // mặc định bằng TRUE Tiếp theo chúng ta định nghĩa hàm WndProc(). Lý do ta làm điều này vì hàm CreateGLWindow() có một tham khảo đến WndProc() nhưng WndProc() lại được đặt sau CreateGLWindow(). Trong C nếu chúng ta muốn truy xuất một hàm hay một phần của chương trình đang nằm sau phần chương trình hiện hành, chúng ta phải khai báo phần mã chúng ta muốn truy xuất ở đỉnh chương trình. Vì vậy dòng tiếp theo chúng ta định nghĩa trước WndProc() để CreateGLWindow() có thể tham khảo tới. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // Khai báo WndProc Phần mã tiếp theo dùng để định lại kích thước vùng nhìn OpenGL khi kích thước cửa sổ (giả sử bạn chạy chương trình ở chế độ cửa sổ) được điều chỉnh. Kể cả khi bạn không có khả năng điều chỉnh lại cửa sổ (khi bạn ở chế độ fullscreen), phần mã này vẫn được gọi ít nhất một lần khi chương trình chạy lần đầu để thiết lập khung nhìn. Vùng nhìn OpenGL sẽ được định lại kích thước dựa theo chiều rộng và chiều cao của cửa sổ đang hiển thị. GLvoid ReSizeGLScene(GLsizei width, GLsizei height) // Khởi tạo và điều chỉnh kích thước cửa sổ GL { if (height==0) // Tránh lỗi Divide By Zero { height=1; } glViewport(0, 0, width, height); // Reset vùng nhìn hiện hành Các dòng tiếp theo thiết lập màn hình cho khung nhìn. Nghĩa những gì ở xa hơn sẽ nhỏ hơn. Điều này tạo ra một vùng nhìn thật hơn. Khung nhìn được tính toán với góc nhìn 45 độ và dựa trên chiều rộng và chiều cao của cửa sổ. 0.1f, 100.0f điểm bắt đầu và điểm kết thúc cho độ sâu mà chúng ta có thể vẽ vào màn hình. Lời gọi hàm lglMatrixMode(GL_PROJECTION) cho biết 2 dòng mã tiếp theo sẽ ảnh hưởng đến ma trận chiếu. Ma trận khung nhìn chịu trách nhiệm việc thêm khung nhìn vào vùng nhìn. glLoadIdentity() giống như reset. Nó đưa ma trận được chọn trở về trạng thái ban đầu. Sau khi glLoadIdentity() được gọi chúng ta khai báo khung nhìn mới cho vùng nhìn. glMatrixMode(GL_ MODELVIEW) cho biết bất kì sự thay đổi nào đều sẽ ảnh hưởng lên ma trận Modelview. Ma trận modelview là nơi thông tin đối tượng của chúng ta được lưu giữ. Cuối cùng chúng ta reset ma trận modelview. Đừng lo nếu như bạn không hiểu, chỉ cần biết đây những phần cần phải làm nếu như bạn mộtmột vùng nhìn tốt (^_^). glMatrixMode(GL_PROJECTION); // Select The Projection Matrix glLoadIdentity(); // Reset The Projection Matrix // Tính toán lại hệ số tỷ lệ của cửa sổ gluPerspective(45.0f,(GLfloat)width/ glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix glLoadIdentity(); // Reset The Modelview Matrix } Trong đoạn mã tiếp theo ta thực hiện phần cài đặt cho OpenGL. Ta sẽ thiết lập màu dùng để xóa màn hình, bật vùng đệm độ sâu, cho phép smooth shading, v.v. Phần mã này sẽ không được gọi cho đến khi cửa sổ OpenGL được tạo. Hàm trả về một giá trị nhưng vì phần khởi tạo của chúng ta không quá phức tạp nên chúng ta cũng không cần bận tâm về giá trị này. int InitGL(GLvoid) // Tất cả các cài đặt cho OpenGL đặt ở đây { Dòng tiếp theo cho phép chế độ smooth shading. Chế độ này cho phép hiển thị màu sắc và ánh sáng tốt hơn. glShadeModel(GL_SMOOTH); // Cho phép Smooth Shading Dòng tiếp theo thiết lập màu của màn hình khi nó được xóa. Tôi xin giải thích ngắn gọn về các màu. Tầm giá trị của màu từ 0.0f cho đến 1.0f. 0.0f khi màu tối nhất và 1.0f khi sáng nhất. Thông số đầu tiên của hàm glClearColor() cường độ màu đỏ (Red), thông số thứ hai xanh (Green) và thứ ba xanh dương (Blue). Kết hợp cường độ của ba màu này ta sẽ có các màu sắc 8 khác nhau (nhớ tầm giá trị từ 0.0f đến 1.0f). Thông số cuối cùng giá trị Alpha. Khi dùng cho việc làm sạch (clear) màn hình, chúng ta không bận tâm về thông số thứ 4 này. Ta sẽ thiết lập 0.0f. Để tạo một màu nền đen bạn thiết lập tất cả các màu càng tối càng tốt (0.0f) glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // nền đen Ba dòng tiếp theo liên quan đến Depth Buffer (Bộ đệm độ chiều sâu). Bạn hãy xem depth buffer như các lớp trong màn hình. Bộ đệm này chịu trách nhiệm về việc các đối tượng đang ở sâu bao nhiêu trên màn hình. Ở chương trình này, chúng ta không thật sự dùng đến depth buffer, nhưng mọi chương trình OpenGL vẽ màn hình ở chế độ 3D đều phải dùng đến depth buffer. Nó sắp xếp trật tự vẽ các đối tượng, nhờ đó một hình vuông bạn vẽ sau một hình tròn sẽ không nằm trên hình tròn. Depth buffer một phần rất quan trọng của OpenGL. glClearDepth(1.0f); // Cài đặt Depth Buffer glEnable(GL_DEPTH_TEST); // Cho phép kiểm tra độ sâu glDepthFunc(GL_LEQUAL); // Chế độ kiểm tra Tiếp theo chúng ta thiết lập khung nhìn sao cho việc hiển thị tối ưu. glHint(GL_PERSPECTIVE_CORRECTION_ HINT, GL_NICEST); // chọn chế độ hiển thị tốt nhất Cuối cùng giá trị trả về của hàm TRUE. Nếu muốn biết việc cài đặt OpenGL có thành công hay không, ta có thể kiểm tra giá trị trả về TRUE hay FALSE, để làm việc này bạn cần phải thêm phần mã trả về FALSE nếu như có lỗi xảy ra. return TRUE; } Phần tiếp theo nơi chứa tất cả các mã về việc vẽ lên màn hình. Tất cả những gì bạn muốn hiển thị trên màn hình đều nằm trong phần này. Nếu như bạn đã có một số hiểu biết về OpenGL, bạn có thể tạo thử các dạng hình cơ bản bằng cách thêm mã OpenGL bên dưới dòng glLoadIdentity() và trước return TRUE. Hiện tại, chương trình của chúng ta chỉ dừng ở việc làm sạch màn hình bằng màu đã định trước, xóa vùng đệm độ sâu và reset lại vùng nhìn. Dòng return TRUE cho biết không có lỗi xảy ra. Nếu như bạn muốn chương trình dừng lại vì một vài lí do nào đó, thêm vào dòng return FALSE ở nơi bạn muốn để thông báo việc vẽ thất bại. Chương trình sẽ thoát ra khi thực thi đến dòng mã này. int DrawGLScene(GLvoid) { glClear(GL_COLOR_BUFFER_BIT | GL_ DEPTH_BUFFER_BIT); // Xóa màn hình và bộ đệm glLoadIdentity(); // Reset ma trận Modelview return TRUE; // Mọi thứ OK } Hàm KillGLWindow() được gọi trước khi chương trình kết thúc. Công việc của hàm này giải phóng Rendering Context, Device Context và cuối cùng handle của cửa sổ. Tôi đã thêm vào một ít mã kiểm tra lỗi. Nếu chương trình không thể giải phóng phần nào của cửa sổ, một thông điệp lỗi sẽ hiển thị, cho biết phần nào bị lỗi. Điều này khiến bạn dễ dàng hơn trong việc phát hiện lỗi trong lập trình. GLvoid KillGLWindow(GLvoid) // hàm hủy cửa sổ { Đầu tiên cần phải biết chúng ta có đang ở chế độ toàn màn hình hay không. Nếu có, chúng ta sẽ chuyển về chế độ bình thường. Chúng ta vẫn có thể hủy cửa sổ trước khi tắt chế độ toàn màn hình, nhưng có vài card màn hình nếu chúng ta hủy cửa sổ trước khi tắt chế độ toàn màn hình, thì desktop sẽ bị “treo”. Tốt nhất ta tắt chế độ toàn màn hình trước khi hủy cửa sổ. if (fullscreen) // Đang ở chế độ toàn màn hình? { Ta dùng ChangeDisplaySettings(NULL, 0) để trở về. Việc truyền giá trị NULL và 0 khiến Windows dùng các giá trị hiện thời đang chứa trong registry (độ phân giải mặc định, độ sâu bit màu, tần số, v.v…) để phục hồi lại desktop. Sau khi chuyển sang desktop, chúng ta cho con trỏ chuột hiển thị trở lại. ChangeDisplaySettings(NULL,0); // chuyển về desktop ShowCursor(TRUE); // hiển thị con trỏ chuột } Đoạn mã tiếp theo kiểm tra xem ta có một Rendering Context (hRC) hay không. Nếu không có, chương trình sẽ nhảy đến đoạn mã kiểm tra chúng ta có Device Context hay không. if (hRC) // Rendering Context? { Nếu có, đoạn code bên dưới sẽ cho biết liệu chúng ta có thể giải phóng nó (hRC) hay không (tách hRC khỏi hDC). Lưu ý cách tôi thực hiện việc kiểm tra lỗi. Đầu tiên, cho chương trình giải phóng các Context (bằng wglMakeCurrent(NULL,NULL), sau đó kiểm tra xem việc giải phóng có thành công hay không). if (!wglMakeCurrent(NULL,NULL)) // { Nếu việc giải phóng các context DC và RC không thành công, hộp thoại MessageBox() sẽ tự động bật lên với một thông báo cho ta biết DC và RC không thể giải phóng được. Ý nghĩa của các thông số truyền cho hàm MessageBox() như sau: NULL nghĩa hộp thoại không có các cửa sổ cha. Đoạn văn bản sau NULL sẽ được hiển thị trong hộp thoại. “SHUTDOWN ERROR” là dòng chữ sẽ hiện trên đỉnh của hộp thoại (tiêu đề). 9 Tiếp theo ta có MB_OK, có nghĩa ta cần hộp thoại có một nút bấm có nhãn “OK” và cuối cùng MB_ ICONINFORMATION tạo một ký hiệu chữ i thường xuất hiện bên trong hộp thoại dùng để thông báo. MessageBox(NULL,”Release Of DC And RC Failed.”,”SHUTDOWN ERROR”,MB_OK | MB_ ICONINFORMATION); } Tiếp theo chúng ta sẽ xóa Rendering Context. Nếu không thành công sẽ có một hộp thoại thông báo lỗi. if (!wglDeleteContext(hRC)) // có thể xóa RC hay không? { MessageBox(NULL,”Release Rendering Context Failed.”,”SHUTDOWN ERROR”,MB_OK | MB_ICONINFORMATION); } hRC=NULL; // Set RC To NULL } Tiếp theo việc kiểm tra xem ta có một Device Context hay không và nếu có thì giải phóng nó. Nếu ta không thành công trong việc giải phóng Device Context thì một thông điệp sẽ hiện ra và hDC sẽ được thiết lập là NULL. if (hDC && !ReleaseDC(hWnd,hDC)) // có thể giải phóng DC không? { MessageBox(NULL,”Release Device Context Failed.”,”SHUTDOWN ERROR”,MB_OK | MB_ ICONINFORMATION); hDC=NULL; // Set DC To NULL } Đoạn mã bên dưới đoạn mã tìm và hủy cửa sổ dùng hàm DestroyWindow(hWnd). Nếu chúng ta không hủy được cửa sổ, một thông điệp lỗi sẽ hiện ra và hWnd được gán bằng NULL. if (hWnd && !DestroyWindow(hWnd)) // Có thể hủy cửa sổ không? { MessageBox(NULL,”Could Not Release hWnd.”,”SHUTDOWN ERROR”,MB_OK | MB_ ICONINFORMATION); hWnd=NULL; // Set hWnd To NULL } Điều cuối cùng cần làm hủy bỏ đăng kí Class Windows của chúng ta. Điều này cho phép ta hủy cửa sổ một cách chính quy và sau đó có thể mở cửa sổ khác mà không nhận được thông báo lỗi “Windows Class already registered” if (!UnregisterClass(“OpenGL”,hInstance)) // Có thể hủy đăng ký không? { MessageBox(NULL,”Could Not Unregister Class.”,”SHUTDOWN ERROR”,MB_OK | MB_ ICONINFORMATION); hInstance=NULL; // Set hInstance To NULL } } Kế đến phần mã tạo nên cửa sổ OpenGL của chúng ta. Tôi đã mất rất nhiều thời gian để quyết định nên tạo một cửa sổ toàn màn hình cố định, không đổi và không cần phải viết nhiều mã, hay tạo một cửa sổ thân thiện với người dùng và dể dàng chỉnh sửa. Cuối cùng cửa sổ thân thiện người dùng hướng đi tốt nhất. Vì nhiều người bắt đầu thường rất hay thắc mắc về những điều như: Làm thế nào để tạo ra một cửa sổ thay vì toàn màn hình? Làm thế nào thay đổi tiêu đề cửa sổ? Làm thế nào thay đổi độ phân giải hoặc định dạng điểm của cửa sổ? Phần mã tiếp theo thực hiện tất cả các điều này! Như bạn thấy, thủ tục trả về giá trị BOOL (TRUE hoặc FALSE), nó nhận 5 tham số: tiêu đề của cửa sổ, chiều rộng cửa sổ, chiều cao cửa sổ, số bit màu (16/24/32), và cuối cùng cờ fullscreen (bằng TRUE cho chế độ toàn màn hình, bằng FALSE cho chế độ cửa sổ). Giá trị BOOL trả về cho biết cửa sổ đã được tạo thành công hay chưa. BOOL CreateGLWindow(char* title, int width, int height, int bits, bool { Khi yêu cầu Windows cung cấp cho chúng ta một định dạng điểm phù hợp với mong muốn, giá trị mà Windows tìm được sẽ được cất trong biến PixelFormat. GLuint PixelFormat; // Chứa kết quả định dạng sau khi tìm kiếm Biến wc sẽ được dùng để chứa cấu trúc Window Class. Cấu trúc Window Class giữ thông tin về cửa sổ. Bằng việc thay đổi các vùng trong Class này chúng ta có thể thay đổi cách nhìn và cách vận hành cửa sổ. Mọi cửa sổ đều thuộc về một Window Class. Trước khi bạn tạo một cửa sổ, bạn phải đăng kí một Class cho cửa sổ. WNDCLASS wc; // Cấu trúc Windows Class Các biến dwExStyle và dwStyle sẽ chứa các thông tin về kiểu (Style) Window bình thường và mở rộng (Extended). Việc dùng các biến để chứa các thông tin này khiến cho bạn có thể thay đổi các kiểu phụ thuộc vào loại cửa sổ bạn muốn hiển tạo ra (một cửa sổ popup hoặc toàn màn hình hoặc một cửa sổ có viền ngoài) DWORD dwExStyle; // Window Extended Style DWORD dwStyle; // Window Style Năm dòng mã tiếp theo chứa các giá trị góc trái trên, và góc phải dưới của một hình chữ nhật. Ta sẽ dùng các giá trị này để điều chỉnh cửa sổ sao cho vùng 10 vẽ hiển thị chính xác ở độ phân giải chúng ta cần. RECT WindowRect; // Giữ giá trị góc trên bên trái, góc dưới bên phải hình chữ nhật WindowRect.left=(long)0; // giá trị bên trái bằng 0 WindowRect.right=(long)width; // giá trị bên phải bằng với chiều rộng yêu cầu WindowRect.top=(long)0; // giá trị phía trên 0 WindowRect.bottom=(long)height; // giá trị phía dưới bằng với chiều cao yêu cầu Ở dòng tiếp theo chúng ta cho biến toàn cụ c fullscreen bằng vớ ì nếu chúng ta chuyển cửa sổ thành toàn màn hình, biế ẽ TRUE. Nếu ta không gán fullscreen bằ á trị fullscreen sẽ vẫn FALSE. Nếu chúng ta hủy cửa sổ, và máy tính vẫn đang ở chế độ toàn màn hình, nhưng do biến fullscreen bằng FALSE, chương trình sẽ không chuyển về chế độ desktop trước khi hủy cửa sổ dẫn đến lỗi như phần trên tôi đã trình bày. // cập nhật biến toàn cục fullscreen Các hằng CS_HREDRAW và CS_VREDRAW quy định cửa sổ sẽ được vẽ lại mỗi khi nó được cập nhật kích thước. CS_OWNDC tạo một DC private cho cửa sổ. Nghĩa các ứng dụng khác không chia sẻ DC này. WndProc một thủ tục theo dõi các thông điệp trong chương trình. Do không có các dữ liệu cửa sổ nào khác nên hai vùng cbClsExtra và cbWndExtra bằng không. Cho hIcon bằng NULL nghĩa chúng ta không cần một ICON trên cửa sổ, và giá trị của hCursor cho phép ta dùng con trỏ chuột chuẩn. Màu nền không quan trọng (ta đã thiết lập trong OpenGL). Ta cũng không cần một menu trong cửa sổ này nên cho nó bằng NULL, và tên lớp có thể bất cứ gì bạn muốn. hInstance = GetModuleHandle(NULL); // giữ một thể hiện của cửa sổ wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; wc.lpfnWndProc = (WNDPROC) WndProc; // WndProc điều khiển các thông điệp wc.cbClsExtra = 0; // không có dữ liệu cửa sổ phụ wc.cbWndExtra = 0;//không có dữ liệu cửa sổ phụ wc.hInstance = hInstance; // thiết lập thể hiện wc.hIcon = LoadIcon(NULL, IDI_WINLOGO); // nạp icon mặc định wc.hCursor = LoadCursor(NULL, IDC_ARROW); // nạp con trỏ mặc định wc.hbrBackground = NULL; // màu nền không cần thiết nếu như ta dùng OpenGL wc.lpszMenuName = NULL; // không cần menu wc.lpszClassName = “OpenGL”; // đặt tên lớp Bây giờ ta đăng kí Window Class. Nếu có lỗi xảy ra, một hộp thoại báo lỗi sẽ bật lên. Click vào nút OK sẽ kết thúc chương trình. if (!RegisterClass(&wc)) // đăng kí Window Class { MessageBox(NULL,”Failed To Register The Window Class.”, “ERROR”, MB_OK|MB_ ICONEXCLAMATION); return FALSE; // thoát và trả về FALSE } Có nhiều người thường hay vấp phải lỗi trong việc chuyển sang chế độ toàn màn hình. Bạn nên nhớ vài điều quan trọng khi chuyển sang chế độ toàn màn hình. Phải chắc chắn chiều rộng và chiều cao bạn dùng trong chế độ toàn màn hình cũng chính chiều rộng và chiều cao bạn dùng cho cửa sổ, và quan trọng nhất, thiết lập chế độ toàn màn hình trước khi bạn tạo cửa sổ. DEVMODE dmScreenSettings; // Chế độ thiết bị memset(&dmScreenSettings,0,sizeof(dmScreenSe ttings)); // xóa vùng nhớ dmScreenSettings.dmSize= sizeof(dmScreenSettings); // Kích thước của cầu trúc Devmode dmScreenSettings.dmPelsWidth = width; // chọn chiều rộng dmScreenSettings.dmPelsHeight = height; // và chiều cao dmScreenSettings.dmBitsPerPel = bits; // chọn số bít mỗi điểm dmScreenSettings.dmFields=DM_ BITSPERPEL|DM_PELSWIDTH|DM_ PELSHEIGHT; Trong đoạn mã trên, chúng ta xóa vùng nhớ để chứa các thiết lập video. Thiết lập chiều rộng, chiều cao và số bit của chế độ toàn màn hình. Tất cả các thông tin này được chứa trong dmScreenSettings. Ở dòng mã bên dưới ChangeDisplaySettings sẽ chuyển màn hình sang chế độ phù hợp với những gì chứa trong dmScreenSettings. Tôi dùng thông số CDS_FULLSCREEN khi đổi chế độ, vì cần phải bỏ thanh start ở đáy màn hình, thêm vào việc nó không được dịch chuyển hay định lại kích thước cho đến khi bạn trở lại chế độ cửa sổ bình thường. if (ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN)!= DISP_CHANGE_SUCCESSFUL) { Nếu không thể chuyển sang chế độ toàn màn hình, đoạn mã bên dưới sẽ được thực thi. Một hộp thoại sẽ bật lên với hai tùy chọn… một chạy ở chế độ cửa sổ, và hai thoát chương trình. if (MessageBox(NULL,”The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?”, “OpenGL”, MB_ YESNO|MB_ICONEXCLAMATION)==IDYES) { 11 Nếu người dùng quyết định dùng chế độ cửa sổ, biến fullscreen được chuyển thành FALSE và chương trình tiếp tục chạy. fullscreen=FALSE; // chuyển sang chế độ cửa sổ } else { Nếu người dùng quyết định thoát, một hộp thoại bật lên cho người dùng biết chương trình sẽ đóng. FALSE sẽ được trả về cho biết chương trình đã không hoạt động thành công. // bật hộp thoại cho biết chương trình đang đóng MessageBox(NULL,”Program Will Now Close.”, ”ERROR”,MB_OK|MB_ICONSTOP); return FALSE; // thoát chương trình và trả về FALSE } } } Do phần mã phía trên có thể không thành công và người dùng có thể quyết định chạy chương trình ở chế độ cửa sổ, ta cần kiểm tra lại biến fullscreen bằng TRUE hay FALSE trước khi thiết lập kiểu màn hình/cửa sổ. if (fullscreen) // vẫn đang trong chế độ toàn màn hình? { Nếu đúng, chúng ta thiết lập kiểu mở rộng (extended style) WS_EX_APPWINDOW, đẩy cửa sổ đang nằm trên cùng của window xuống taskbar khi cửa sổ của ta bật lên. Với kiểu cửa sổ (window style) ta sẽ tạo một cửa sổ WS_POPUP, cửa sổ này không có đường viền bao quanh, rất thích hợp cho chế độ toàn màn hình. Cuối cùng, ta tắt con trỏ chuột. Bạn cũng có thể để con trỏ chuột, điều này phụ thuộc vào bạn. dwExStyle=WS_EX_APPWINDOW; // Window Extended Style dwStyle=WS_POPUP; // Windows Style ShowCursor(FALSE); // giấu con trỏ chuột } else { Nếu dùng một cửa sổ thay cho chế độ toàn màn hình, ta sẽ thiết lậ p kiểu m ở r ộng WS_EX_WINDOWEDGE. Điều này khiến cho cửa sổ có vẻ 3D hơn. Với kiểu cửa sổ ta dùng WS_OVERLAPPEDWINDOW thay cho WS_POPUP. WS_OVERLAPPEDWINDOW tạo một cửa sổ có thanh tiêu đề, đường viền kích thước, menu cửa sổ, và các nút minimize/maximize (phóng to/thu nhỏ cửa sổ). dwExStyle=WS_EX_APPWINDOW | WS_EX_ WINDOWEDGE; // Window Extended Style dwStyle=WS_OVERLAPPEDWINDOW; // Windows Style } Dòng mã tiếp theo điều chỉnh cửa sổ theo đúng như các kiểu mà ta đã thiết lập. Sự điều chỉnh này khiến cửa sổ của chúng ta có chính xác độ phân giải như yêu cầu. Bình thường các đường viền sẽ trùng lấp một số phần của cửa sổ. Bằng cách dùng AdjustWindowRectEx sẽ không có phần nào của vùng nhìn OpenGL sẽ bị bao phủ bởi đường viền, thay vào đó, cửa sổ sẽ được làm lớn hơn. Trong chế độ toàn màn hình, lệnh này không có hiệu quả. AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle); // Điều chỉnh lại kích thước cửa sổ Tiếp theo, ta tạo cửa sổ và kiểm tra xem nó được tạo đúng hay không. Ta truyền cho hàm CreateWindowEx() tất cả các thông số cần thiết. Kiểu mở rộng cần dùng. Tên lớp (là tên bạn dùng khi đăng kí Window Class). Tiêu đề cửa sổ. Kiểu cửa sổ. Góc trên bên trái của cửa sổ. Chiều rộng và chiều cao. Ta không cần cửa sổ cha, và cũng không có menu, vì vậy ta thiết lập cả hai thông số này NULL. Lưu ý tôi thêm vào kiểu WS_CLIPSIBLINGS và WS_CLIPCHILDREN dọc theo kiểu cửa sổ. Hai kiểu này hai kiểu cần thiết cho OpenGL. Các kiểu này chống lại việc các cửa sổ khác vẽ đè hay vẽ vào trong cửa sổ OpenGL. if (!(hWnd=CreateWindowEx( dwExStyle, // kiểu mở rộng “OpenGL”, // tên lớp title, // tiêu đề cửa sổ WS_CLIPSIBLINGS | WS_CLIPCHILDREN | dwStyle, // kiểu đã chọn 0, 0, // vị trí cửa sổ WindowRect.right-WindowRect.left, // điều chỉnh chiều rộng WindowRect.bottom-WindowRect.top, // điều chỉnh chiều cao NULL, // không có cửa sổ cha NULL, // không có menu hInstance, // Instance NULL))) // không truyền cho WM_CREATE gì cả Nếu cửa sổ đã được tạo, hWnd sẽ giữ điều khiển cửa sổ. Nếu cửa sổ không được tạo đoạn mã bên dưới sẽ khiến hiển thị một thông báo lỗi và ngừng chương trình. { KillGLWindow(); MessageBox(NULL,”Window Creation Error.”, “ERROR”, MB_OK|MB_ICONEXCLAMATION); return FALSE; // trả về FALSE } Phần tiếp theo mô tả một định dạng điểm (Pixel Format). Ta chọn một định dạng có hỗ trợ OpenGL [...]... mà bạn muốn nó chạy mỗi khi người dùng click vào menu mà bạn mới tạo ra Ví dụ bạn muốn tạo một Menu có tên My Cool Menu, mỗi khi click vào Menu này thì sẽ chạy chương trình Notepad (Nói trước để bạn khỏi phải bực mình, nó sẽ không hoạt động như ta mong muốn) , thì bạn sẽ tạo một khóa như trong hình minh họa Và bạn hãy mở 34 IE ngay để xem kết quả Thật tuyệt Menu của bạn đã xuất hiện nhưng nếu bạn. .. có chương trình Notepad nào được gọi cả Tại sao lại như vậy? Bạn cứ bình tĩnh đọc tiếp rồi sẽ rõ, hãy cứ tạm “ấm ức” như vậy cái đã Bạn sẽ nhận thấy một điều Menu của bạn sẽ luôn xuất hiện khi người dùng nhấp chuột phải, nhưng bạn lại muốn Menu của bạn chỉ xuất hiện khi người dùng nhấp chuột phải vào một link hay một Picture thì sao ? Bạn chỉ cần tạo một Value (kiểu REG_DWORD) mới tên Contexts... tham số đường dẫn của link (tham số URL) người dùng vừa chọn Bạn cũng thắc mắc còn cái tham số Info thì để làm cái gì Cái đó sẽ cho bạn biết thông tin về cái Link Bạn cứ hiểu như vậy còn cụ thể thì bạn sẽ tự khám phá ra khi ngồi “vọc” nó Bạn chỉ cần thay đường dẫn đến chương trình của bạn xong Công việc còn lại cuối cùng chương trình của bạn Bạn phải viết một đoạn mã để lấy kết quả mà bạn đã... tạo ra một đối tượng Rational tương ứng bằng cách gọi hàm khởi dựng của Rational với đối số số nguyên int bạn cung cấp nên nó đã làm như vậy Nói cách khác nó xem lời gọi của bạn tương tự như sau: Nhưng bạn vẫn chưa thỏa mãn Bạn cũng muốn hỗ trợ các thao tác hòa trộn giữa các chế độ (mixed-mode operations) Ví dụ như nhân một đối tượng Rational với một số kiểu int Khi bạn cố gắng làm điều này bạn const... đã dày .xem tiếp trang 40 35 Sự khác nhau giữa hàm thành viên, hàm không thành viên và hàm friend Việt Thanh Sự khác nhau lớn nhất giữa hàm thành viên và hàm không thành viên các hàm thành viên có thể hàm ảo trong khi hàm không thành viên thì không Như một hệ quả, nếu bạnmột hàm ảo thì hàm ảo đó phải thành viên của một lớp nào đó Xét một lớp thể hiện các số hữu tỉ: class Rational { public:... sẽ giúp bạn có cái nhìn cơ bản về Prolog, về những điểm mạnh của nó cũng như sẽ khơi dậy trong bạn niềm hứng thú tìm hiểu về phương pháp lập trình logic Các bạn có thể download chương trình Turbo Prolog 2.0 trên trang web của báo học lập trình: http://baohoclaptrinh.com Lập trình logic Thanh Tùng Trong các ngôn ngữ lập trình thủ tục thông thường như C++, Java hay Pascal, một chương trình sự đặc... cuối cùng mà một hàm trả về, chẳng hạn như bạn muốn chứa giá trị lớn nhất mà một hàm tính được Nếu bạn đang hiện thực một hàm phân tích chuỗi, bạn cũng có thể chứa token cuối cùng được trả về bởi hàm trong một biến static Như vậy bạn có thể lấy giá trị đó đơn giản bằng cách gọi hàm kèm theo một tham số xác định hàm phải trả về token cuối cùng Cách dùng thứ hai của static bên trong một định nghĩa... thiết lập, cài đặt và tạo một cửa sổ OpenGL… Và nếu bạn kết hợp tất cả các đoạn mã mà tôi đã từng bước trình bày thành một chương trình hoàn chỉnh (theo thứ tự từ trên xuống dưới), thì bảo đảm bạn sẽ có một chương trình hoàn chỉnh và có thể chạy được trên nền VC++ 6 Nếu bạn không muốn gõ lại chương trình thì vẫn có thể liên hệ với tòa soạn để nhận source code hoàn chỉnh (tất nhiên giống y như những... Hay như các chương trình hỗ trợ việc Download (NetAnts ), mỗi khi bạn nhấp chuột phải vào một link, thì sẽ xuất hiện một menu con của chương trình giúp bạn Download link đã chọn, làm sao chương trình đó nhúng menu của nó vào menu của IE và làm sao chương trình đó biết được bạn đã chọn Link nào? 1.Nhúng Menu của bạn vào Menu của Internet Explorer Để thêm một MenuItem vào Menu của IE rất đơn giản, bạn. .. trách nhiệm về thiết lập kết nối đến một cơ sở dữ liệu Lớp đầu tiên DriverManager Đó một trong rất ít các lớp thực sự do JDBC API cung cấp DriverManager chịu trách nhiệm quản lý một nhóm (pool) các driver đã đăng kí, mà thực chất trừu tượng hóa các chi tiết về việc sử dụng một driver, cho nên lập trình viên không cần phải làm việc trực tiếp với driver đó Lớp thứ 2 một lớp JDBC Driver . Như vậy là bạn muốn trở thành một lập trình viên? 3 Giới thiệu Thế là bạn nghĩ rằng lập trình là một thế giới vô cùng thú vị, và bạn muốn tham. lại, tôi nghĩ trường học là rất quan trọng, nhưng không phải để học lập trình. Những Như vậy là bạn muốn trở thành một lập trình viên? Việt Thanh Tổng

Ngày đăng: 24/01/2014, 03:20

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan