Ctrình của em chuyển từ máy QVGA sang VGA vẫn được nhưng tình cờ em phát hiện nó chưa tối ưu:
1.Hàm lấy dài rộng màn hình ::OnSize(UINT nType, int x, int y) đã ko trả về giá trị chính xác của x,y . Nó cho kết quả y chang màn QVGA
2. Khi em copybuffer màn hình
(dùng hàm BitBlt(0,0,xc,yc,&buffDC,1,1,SRCCOPY) )
thì chất lượng từ VGA sụt xuống QVGA dù có fix xc,yc là của VGA.
Nhờ các bác có kinh nghiệm ltrình với VGA chỉ giáo dùm
hì, dạo này hơi căng thẳng nên mình chả có hứng thú gì mấy về mấy cái vấn đề kỹ thuật nữa.
Bác kiểm tra lại mã lệnh đi, mình ko tin là hàm đó sai được. Nếu vẫn ko có gì thay đổi thì bác cho em xin cái kết quả cụ thể (đoạn mã lệnh và kết quả test cuả bác)
Chất lượng sụt là sao hả bác? Ý bác là tốc độ, chất lượng ảnh, …? Còn theo mình thì chất lượng ko thay đổi được, chính là vì nguyên lý của hàm BitBlt rất đơn giản, nó ko cần biết trong địa chỉ bộ nhớ đó có gì, cái này ko phải là vẽ lại, mà là copy theo khối bit, nên chất lượng cũng như tốc độ ko thể giảm được (với cùng 1 khối lượng công việc)
Code ko hẳn là sai, vì nó vẫn chạy bình thường và ko báo lỗi.
Tuy nhiên chất lượng hiển thị rất tồi.
Code nguyen ban nhu sau
CPaintDC dc(this);
CDC buffDC;
CBitmap bmpBuffer;
Và thay bằng đoạn sau :
CPaintDC dc(this);
Display(&dc);
Thì đoạn ctrình dưới trên màn VGA đẹp gấp ngàn lần (Cái đầu nó rạn chân chim, như kiểu anh phóng to 1 cái ảnh 320240 thanh 480640) Mà nguyên do thì em đóan trong quá trình em vẽ tạm lên buffDC rồi mới copy sang DC chính nó gây nên lỗi đó. Tuy nhiên chưa tìm cách khắc phục
Để lập trình cho VGA thì bạn phải khai báo ở chế độ Hi-RES chứ, nếu không nó chỉ nhận ở dạng 320*240 thôi. Đọc mấy cái white-book của SDK SE ấy. Dạo này lú mất rồi, nên không nhớ chính xác lắm.
Với cả xc, yc ở đây là cái gì thế bạn? Sao bạn ko dùng cái testsize cho hàm BitBlt? Ở đây hình vỡ có lẽ là do cái size của mấy hàm BitBlt ra, BitBlt vào của bác có vấn đề.
to Tư Triều, code của bạn không sai chỗ nào cả. Windows Mobile trên VGA có một emulation layer để chạy các ứng dụng chỉ thiết kế cho QVGA, chủ yếu là game, giống như Compatibility trên XP để chạy Windows 95, 98, 2000 vậy đó. Cái bạn cần là nói với Windows Mobile là, “Chương trình tôi có thể chạy trên VGA.” Bằng cách thêm vào resource một item. Có hai cách.
A. Thêm dòng sau trong resource
HI_RES_AWARE CEUX {1} // To turn off the emulation layer
B. Hoặc thao tác như một “môn đồ” của Visual Studio.
To add the HI_RES_AWARE resource item to your program
From the Insert menu, select Resource.
Click the Custom button.
Enter CEUX for the resource type.
Set the resource data to 01 00.
Click the Properties tab.
Rename the item to “HI_RES_AWARE”, including quotes. (If the quotes are omitted, HI_RES_AWARE will be incorrectly defined as a numeric value in resource.h, and you will need to go back and delete the line from resource.h.)
Hê hê trước hết xin cảm ơn bác đã, sau đó em xin trình bày như sau :
Làm như bác chỉ giáo thì đã mọi cái đã okie, Giao diện của em biến thành VGA. Tuy nhiên, vấn đề của em vẫn chưa được giải quyết:
Nếu áp dụng phương pháp của bác thì màn hình sẽ trở thành VGA thực - mọi thứ trở nên bé tí. Mà cái em cần là giải quyết là tại sao hàm copy buffer màn hình của em lại làm giảm chất lượng hiển thị.
Để minh họa em đưa ra bức ảnh sau:
1.Bức thứ nhất là em vẽ ra một buffDC rồi dùng bitblt copy ra DC, kết quả là hình bị vỡ.
2.Bức thứ 2 là em vẽ trực tiếp lên DC. Hình đẹp mỹ mãn
Bức cuối là khi em làm theo bác khaplienhoa, hình đã mịn nhưng lại trở nên bé tí - cũng xấu vô cùng. http://img.photobucket.com/albums/v638/trieubk/VGA2.jpg
Các bác giúp dùm em giải thích để em có thể vẽ đẹp mà vẫn có thể sử dụng copy buffer nhé.
Hình của bạn bé tí đơn giản là DPI của bạn lớn lên thôi, thế mới đúng. Nếu bạn muốn nó lớn thì bạn tạo 2 cái icon lớn nhỏ. Chương trình kiểm tra DPI của device, nếu là VGA thì dùng icon lớn, nếu là QVGA thì dùng icon nhỏ.
1.Bức thứ nhất là em vẽ ra một buffDC rồi dùng bitblt copy ra DC, kết quả là hình bị vỡ.
2.Bức thứ 2 là em vẽ trực tiếp lên DC. Hình đẹp mỹ mãn
Bức cuối là khi em làm theo bác khaplienhoa, hình đã mịn nhưng lại trở nên bé tí - cũng xấu vô cùng.
Rõ ràng là [3] rất tốt, sao lại nói là BitBlt không được.
Làm như thế cũng được. Có điều vấn đề thắc mắc là tại sao dùng bitblt để copy buffer lại ra kq tệ như thế.
Em đã nói là bác phải bắt buộc thêm vào resource cái DPI-aware để Windows Mobile biết mà tắt cái emulation layer đi.
Bác phải biết rằng nếu bác một khi hỗ trợ QVGA và VGA cùng trong chương trình thì tất cả các hàm Drawing như vẽ mũi tên, đường thẳng, v.v… và resource như image, cursor phải sẵn sàng một kích thước gấp đôi trong VGA. Bác phải lấy thông tin device của người dùng, nếu là VGA (thường DPI khoảng trên 160) thì bác dùng những function và resource cho/có kích thước gấp đôi. Đó là điều bắt buộc. Nếu chương trình của bác chưa làm được như thế thì rõ ràng là chưa ready cho VGA.
Em cũng hiểu như thế. Duy chỉ có điều em thắc mắc là khi em chưa setup cho màn hình VGA, em vẽ thẳng lên DC luôn thì tuy nét nó to hơn một tí nhưng lại sắc nét cực kì(hình 2 ở trên), mỗi tội khi em vẽ tạm lên một buffDC rồi mới bitblt sang DC chính thì nó lại bị vỡ điểm ảnh(hình 1 ở trên).
Mục tiêu thực sự em cần ko phải là phân giải VGA mà là vẽ trên màn VGA trông nó mịn mịn một tí.
Giả sử VGA của bạn là 640x480 thì mà kích thước màn hình của bạn luôn luôn là như thế. Nhưng chương trình của bạn không DPI-aware thì sẽ hiểu là 320x240. Khi dùng buffer thì Image của buffer là 320x240 sau khi bạn vẽ xong mới BitBlt thì một điểm trên buffer sẽ thành 4 điểm nên trông hình bạn bị vỡ. Nhưng nếu bạn vẽ thẳng trên DC thực, Image có kích thước là 640x480, thì tất cả những đối số geometry của bạn khi gọi GDI sẽ được nhân đôi lên. Ví dụ bạn gọi.
DrawRectangle (hdc, 4, 6, 30, 40);
thực chất hàm này gọi đến hàm trong emulation layer. Trong layer này sẽ nhân đôi đối vào và gọi hàm GDI thực để vẽ trên Device.
DrawRectangle (hdc, 8, 12, 60, 80);
Lúc đó đương nhiên là hình sẽ đủ lớn và không vỡ rồi.
He he Bác phân tích rất cặn kẽ + chính xác. E đã cũng nghĩ lờ mờ như thế. He he. Vậy là bó tay ko có cách nào giải quyết được chuyện vẽ nét mà vẫn ở chế độ QVGA bác nhỉ.