Hỏi các cao thu eVC

Tư Triều

GẮN KẾT
GÂY DỰNG
Các bác lập trình eVC có biết cách nào copy buffer màn hình không.
Em đang cần tạo một CDC, Vẽ , chỉnh sửa trên nó rồi mới đưa ra DC màn hình nhưng loay hoay mãi không làm được.
Kính mong các bác chỉ dạy.
 

knoppix

GẮN KẾT
GÂY DỰNG
Bác tạo một cái CDC có chức năng như bộ đệm, tạo một bitmap và gắn với cái DC đó; vẽ lên DC vừa tạo, sau đó dùng BitBlt để copy ra DC màn hình.
Ví dụ:
CDC memDC;
CBitmap memBmp;
memDC.CreateCompatibleDC(pDC);
memBmp.CreateCompatibleBitmap(pDC, 100, 100);

CBitmap *pOldBmp = memDC.SelectObject(&bmp);
//Vẽ trên memDC...
pDC->BitBlt( 0, 0, 100, 100, &memDC, 0, 0, SRCCOPY ); //copy ra màn hình

memDC.SelectObject(pOldBmp);
 

Tư Triều

GẮN KẾT
GÂY DỰNG
memDC.SelectObject(&bmp); là đủ
thực ra ko cần khai thêm pOldBmp vẫn OK. Cái pOldBmp chỉ để lưu lại bmp cũ của memDC. Cái này chỉ cần thiết nếu ta muốn lưu lại bimap của device context hiện thời

đã làm được từ mấy hôm trước, nhưng cũng rất cảm ơn bác đã quan tâm. Gặp vấn đề mới sẽ hỏi thêm bác nhiệt tình :)
 

DellAximX5

androidcore.com
GẮN KẾT
GÂY DỰNG
Tư Triều said:
memDC.SelectObject(&bmp); là đủ
thực ra ko cần khai thêm pOldBmp vẫn OK. Cái pOldBmp chỉ để lưu lại bmp cũ của memDC. Cái này chỉ cần thiết nếu ta muốn lưu lại bimap của device context hiện thời

Sao lại không cần thiết hả bác! Nếu bác ko làm vậy, sẽ có lúc bác thấy lỗi ;). Bác phải làm vậy mới giải phóng tài nguyên cho máy được chứ. Win bây giờ cũng xịn rồi, chứ Win cũ bác thử ko làm vậy xem, tèo OS ngay!
 

Tư Triều

GẮN KẾT
GÂY DỰNG
Em không nghĩ là lỗi nếu ko có poldBmp vì sau khi dùng memDC thường ta sẽ giải phóng nó luôn.Không biết có đúng không nhỉ.

Em lại có vấn đề mới, các bác có biết cách nào để capture cái bimap của một dc nào đó không. em thấy hàm CDC.selectObject(&bmpTemp) se trả ra CBitmap* là con tro tro den cai bitmap hien thoi của nó, tuy nhiên em dùng hàm này để lấy bitmap ra thì ko thể được.
Cảm ơn các bác
 

DellAximX5

androidcore.com
GẮN KẾT
GÂY DỰNG
Tư Triều said:
Em không nghĩ là lỗi nếu ko có poldBmp vì sau khi dùng memDC thường ta sẽ giải phóng nó luôn.Không biết có đúng không nhỉ.

Khi bạn attach 1 GDI (resource) object như vậy, nếu bạn ko deselect (pOld = dc.SelectObject() sẽ deselect object hiện tại mà dc đang giữ, tức là đẩy object đó ra) thì tài nguyên đó sẽ không thể giải phóng được do nó đang bị nắm giữ và sẽ sinh re leack resource (mem). Bạn muốn test thì dùng Win 98 sẽ thấy ngay kết quả (thử làm 1 vòng for xem, máy sẽ tèo ngay). Do Win XP quản lý mem khá tốt nên ta thử trên WinXp sẽ ko thấy được vì ngay sau khi thoát chương trình thì toàn bộ tài nguyên của chương trình đó sẽ được giải phóng. Vả lại nếu ko cần làm như vậy thì chẳng có lý do gì mà trong tất cả các ví dụ của MSDN cũng đều làm như vậy.

Khi ta khai báo 1 biến trong hàm, khi ra khỏi hàm đó thì biến đó sẽ tự động được giải phóng, đúng ko? Nhưng bạn thử đọc trong MSDN xem, riêng đối với các biến GDI, mặc dù nó có thể tự giải phóng, nhưng MS luôn khuyên ta nên dùng hàm để giải phóng, vd: ReleaseDC(&dc);

Tư Triều said:
Em lại có vấn đề mới, các bác có biết cách nào để capture cái bimap của một dc nào đó không. em thấy hàm CDC.selectObject(&bmpTemp) se trả ra CBitmap* là con tro tro den cai bitmap hien thoi của nó, tuy nhiên em dùng hàm này để lấy bitmap ra thì ko thể được.
Cảm ơn các bác

Ý capture của bạn ở đây là sao? mình ko hiểu, bạn muốn save cái bitmap đó? nếu vậy thì phụ thuộc vào kỹ thuật lập trình, tức là giống như save file thôi, bạn phải save header, data, nén data, ...
 

knoppix

GẮN KẾT
GÂY DỰNG
Các biến khai báo local bên trong hàm được cấp phát trong stack. Vì vậy khi thoát khỏi hàm, các biến này được giải phóng. Còn các GDI object (hay bất cứ object nào của Windows) thì cần phải gọi hàm release như DellAximX5 nói. Nếu bạn đã sử dụng Win32 API để viết chương trình, bạn sẽ thấy các đối tượng như brush, font, bitmap... đều phải gọi hàm DeleteObject sau khi đã sử dụng xong. Trên MFC, lời gọi hàm này được thực hiện trong destructor của các class MFC như CBitmap. MSDN khuyến cáo không được gọi DeleteObject khi đối tượng còn đang được sử dụng trong DC (bạn tra hàm DeleteObject trong MSDN sẽ thấy). Như trong đoạn code ở trên, bmp là biến local, do vậy nó sẽ bị release khi thoát khỏi hàm, dẫn đến destructor được gọi. Nếu bạn bỏ lời gọi memDC.SelectObject(pOldBmp), tức là bmp vẫn được memDC sử dụng, lúc này sẽ vi phạm nguyên tắc trên.
 

knoppix

GẮN KẾT
GÂY DỰNG
Trong MSDN có hướng dẫn "Storing an Image". Bác tra BITMAPFILEHEADER, sau đó lần ngược ra phần "using bitmap" sẽ thấy.
 

Tư Triều

GẮN KẾT
GÂY DỰNG
Ý em không phải là ko cần giải phóng. Em muốn nói là không cần khai thêm
CBitmap *pOldbmp và có thể bỏ dòng lệnh memdc.selecobject(pOldbmp ). Thay vào đó ta chỉ cần giải phóng memdc là được. Để rõ hơn sau đây là đoạn code của em, các bác xem xem có lỗi không nhé(em chạy trên WInCE bét nhè mà chưa lỗi thì phải):
CDC buffDC;
CBitmap bmpBuffer;

buffDC.DeleteDC();
bmpBuffer.DeleteObject();

bmpBuffer.CreateCompatibleBitmap(&dc,xc,yc);
buffDC.CreateCompatibleDC(&dc);
buffDC.SelectObject(&bmpBuffer);

// vẽ , thao tác đồ họa với buffDC

dc.BitBlt(0,0,xc,yc,&buffDC,1,1,SRCCOPY);
ReleaseDC(&buffDC);


2. Capture màn hình em làm được rồi bác à. Em làm cái đó để tăng tốc độ xử lý đồ họa. Trong một số trường hợp, ta có thể capture lại màn hình của device context lúc đó, sau khi xử lý một số tác vụ ta load lại bimap đó lên dc hiện thời, tránh việc vẽ lại các đối tượng đồ họa trong onPaint(). Một ví dụ cực kỳ cụ thể các bác cũng thấy là trong chương trình handMap, trong quá trình sử dụng công cụ PAN, bác sẽ thấy nó dịch chuyển bitmap của DC hiện thời chứ không phải là RePaint() một cách liên tục.

3. Em lại phát sinh ra vấn đề mới. Các bác có biết cách nào tăng tốc việc đọc file dữ liệu không. Em đọc một file text 60kb vào một mảng mà PDA của em chạy mất gần 10s mới đau chứ. Tốc độ như thế là có vấn đề đúng không các bác
Rất cảm ơn các bác góp ý nhiệt tình.
Đợi phản hồi...
 

knoppix

GẮN KẾT
GÂY DỰNG
Bác đã dùng thử kỹ thuật file-mapping chưa? Có lẽ sẽ cải thiện được tốc độ đọc file.
 

Bài viết cần bạn xem thêm

Gửi All
Theo mình để đảm bảo tính minh bạch cũng như an toàn trong việc tham gia đấu giá nên chăng hhvn nên xác thực tài khoản tất cả các thành viên tham gia đấu giá. Xác thực tài khoản bằng việc yêu cầu thanh viên tham gia phải xác thực giấy tờ tuỳ ...
Top