Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 41 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
41
Dung lượng
0,95 MB
Nội dung
Như vậylàbạnmuốn trở thànhmộtlập
trình viên?
3
Giới thiệu
Thế làbạn nghĩ rằng lậptrình
là mộ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ậptrình thì
đó rõ ràng là 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 là 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ưlà
một cuộc đua tranh. Trong đó, cuộc
sống của bạnlà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 là
đụ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à 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ế là 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 là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ạnlà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ànhmộtlậ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ànhlậptrì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ànhlậptrình
viên. Vấn đề chỉ là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ànhlậptrì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 là có những ngoại
lệ, nếu bạn có hứng thú trong lĩnh
vực đồ họa hay lậptrì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 làbạn cần phải là
thiên tài logic. Nói chung, điều đó
không phải là 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 là cần
thiết? Bị thúc đẩy bởi những thách
thức là yếu tố quan trọng nhất. Đơn
giản là vì 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 là 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 là nơi tuyệt vời để
học mọi thứ ngoại trừ công nghệ.
Đừng cho là tôi sai, tôi không nói
rằng tôi nghĩ trường học là không
quan trọng. Ngược 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ậylàbạnmuốntrởthànhmộtlậ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ộtlậptrì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 là 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ạnlà đủ. Đ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 là 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 là 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à 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 là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 là 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 là 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 là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 là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ậptrì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 là
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 là quá phức
tạp cho người mới bắt đầu hoặc là 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 là 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 là 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, đó là
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ẽ là 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, đó làtrình soạn thảo mã lệnh (code
editor). DevStudio có mộttrình soạn thảo
mã lệnh tích hợp sẵn, và đó là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 là 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 là nhà phát
triển phần mềm. Trong suy nghĩ của họ,
không có phần mềm nào là 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 là 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
đề là 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 là đặ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 là
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 là 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 làbạn nghĩ.
Hãy làm việc theo nhóm!
Nếu bạn dự định trở thànhmộtlậptrì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à 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ể làmột game, mộtbản demo, hay
bất cứ thứ gì. Chỉ cần đó là 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ậpmột dự
án và mời người khác cùng cộng tác. Điều quan trọng
nhất là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 là 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ạnlà 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 là 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 là 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ậptrì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 là 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 là đ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ự là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ậptrì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 là quyển sách dạy lậptrình Windows tốt nhất.
ISBN: 1-57231-995-X
The Art of Ware
Tôi là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 là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ànhmộtlậptrình viên, không phải về mặt kỹ
thuật mà là về mặt tư duy. Cá nhân tôi cho rằng lập
trình là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ậpmộ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 là
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 là 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 là ứ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 là 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 là 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 là các
liên kết OpenGL gọi đến Device
Context. OpenGL Rendering
Context được khai báo là 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 là 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ậpmộ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ạnlà 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 là 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
// là 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 là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 là 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 là đ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 là những phần
cần phải làm nếu nhưbạnmột có mộ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 là khi màu tối
nhất và 1.0f là khi sáng nhất. Thông số đầu tiên của hàm
glClearColor() là cường độ màu đỏ (Red), thông số thứ
hai là xanh lá (Green) và thứ ba là 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ớ là tầm giá trị từ 0.0f đến 1.0f). Thông số
cuối cùng là 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 nó là 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ưlà 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 là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ị là 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 là 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ề là 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 là 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ạnmuố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ạnmuố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 là giải phóng
Rendering Context, Device Context và cuối cùng là
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 là 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 là 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 là ta cần hộp thoại
có một nút bấm có nhãn là “OK” và cuối cùng là 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 là 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 là đ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 là 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 là 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 là 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 là 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 là 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ạnmuố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ế ẽ là TRUE.
Nếu ta không gán fullscreen bằ á trị
fullscreen sẽ vẫn là 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 là các ứng dụng khác không chia sẻ DC này.
WndProc là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 là 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ể là 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 là chiều rộng và chiều cao bạn dùng
trong chế độ toàn màn hình cũng chính là 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ạntrở 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ộtlà chạy ở chế độ cửa sổ, và
hai là 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) là 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 là 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ấpmộ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 là NULL.
Lưu ý là 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 là 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ạnmuố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ạnmuốn tạo một Menu có tên là 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 là 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 là 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 là Contexts... tham số là đườ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 là 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ạnlà xong Công việc còn lại cuối cùng là chương trình của bạnBạ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ố là 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 là các hàm thành viên có thể là hàm ảo trong khi hàm không thành viên thì không Nhưlàmột hệ quả, nếu bạn có một hàm ảo thì hàm ảo đó phải là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ậptrì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ậptrình thủ tục thông thường như C++, Java hay Pascal, một chương trìnhlà sự đặc... cuối cùng mà một hàm trả về, chẳng hạn nhưbạnmuố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ậybạ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 là hàm phải trả về token cuối cùng Cách dùng thứ hai của static là 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ànhmột chương trình hoàn chỉnh (theo thứ tự từ trên xuống dưới), thì bảo đảm là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 là 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 là DriverManager Đó là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 làlà 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 là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
Hình v
à chế độ cửa sổ // tạo lại cửa sổ OpenGL (Trang 14)
nh
1. Hộp thoại điều chỉnh biến môi trường Trong mục System của Control Panel trong Windows 2k và XP (Trang 21)
Hình 2.
Điều chỉnh biến hệ thống trong Windows (Trang 21)
Hình 3.
Chương trình Connect (Trang 22)
Hình 1
Quá trình thiết kế hệ thống số (Trang 27)
Hình 2
Kết quả của giai đoạn thiết kế dữ liệu (Trang 27)