2012-03-27 25 views
5

Tôi muốn tạo hệ thống GUI không cửa sổ nhỏ bé của riêng tôi, vì tôi đang sử dụng GDI +. Tôi không thể đăng mã ở đây vì nó có rất lớn (C++) nhưng dưới đây là các bước chính tôi đang theo dõi ...Làm thế nào để hiệu quả làm cho cửa sổ đệm đôi mà không có bất kỳ hiệu ứng rách?

  1. Tạo bitmap có kích thước bằng cửa sổ ứng dụng.
  2. Đối với tất cả các sự kiện chuột và bàn phím cập nhật trạng thái điều khiển tùy chỉnh (ví dụ: nếu chuột hiện được giữ trên một điều khiển cụ thể, v.v.)
  3. Đối với sự kiện WM_PAINT vẽ nền sang bitmap offscreen và sau đó vẽ tất cả các điều khiển được cập nhật ở đầu nó và cuối cùng sao chép toàn bộ hình ảnh offscreen vào bộ đệm phía trước thông qua Graphics :: DrawImage (..) gọi.
  4. Để WM_SIZE/WM_SIZING xóa bitmap offscreen trước đó và tạo một ảnh khác có kích thước cửa sổ mới.

Ngoài ra còn có một số kiểm tra để ngăn việc vẽ lặp lại các điều khiển tức là khi điều khiển được vẽ chỉ khi trạng thái của điều khiển chỉ thay đổi thì nó được sơn e.t.c.

Hệ thống hoạt động tốt nhưng chỉ với một ngoại lệ ... khi cửa sổ đang được thay đổi kích thước, một loại tác dụng rách sẽ xuất hiện. Bây giờ tôi muốn giải thích ...

Trên cạnh/biên có kích thước có một khoảng trống nhấp nháy khi tôi kéo đường viền. Nó giống như hàm DrawImage() của tôi trả về ngay lập tức và trong khi một hoạt động hoán đổi được thực hiện một nửa, một bản vẽ hình ảnh khác bắt đầu lên.

Bây giờ bạn có thể nghĩ rằng đó là hiện vật phổ biến xảy ra trong nhiều ứng dụng khác cho thực tế là thay đổi kích thước backbuffer không phải lúc nào cũng nhanh như thay đổi kích thước cửa sổ nhưng trong các ứng dụng khác tôi nhận thấy trong các ứng dụng khác mặc dù có một chân giữa kích thước cửa sổ và kích thước khu vực khách hàng như cửa sổ tăng kích thước không có gì nhấp nháy gần mép (nền thường chỉ trắng của nó xuất hiện dưới dạng dải đồng nhất mỏng dọc theo đường viền). Ngoài ra các điều khiển động di chuyển với cửa sổ thay đổi kích thước hoạt động giật trong quá trình định kích thước.

Lúc đầu, dường như với tôi rằng việc sử dụng bề mặt màn hình có kích thước toàn màn hình không đổi có thể giảm thiểu hiện vật nhưng khi tôi thử kết quả thì không thỏa đáng. Tôi cũng đã cố gắng gọi cho Sleep() trong quá trình định kích thước để việc lật được thực hiện hoàn toàn trước khi một lượt lật khác bắt đầu nhưng điều lạ lùng thậm chí không hiệu quả đối với tôi!

Tôi đã nghe nói rằng GDI trên vista không phải là phần cứng tăng tốc, có thể đó có thể là vấn đề không? Ngoài ra tôi tự hỏi làm thế nào khuôn khổ như Qt ám GUI không cửa sổ rất trơn tru, ngay cả khi bạn kích thước một cửa sổ Qt GUI phức tạp rất nhanh không đáng kể tạo tác nhỏ xuất hiện. Theo như tôi biết Qt có thể sử dụng opengl cho giao diện đồ họa nhưng đó là tùy chọn thứ hai.

Nếu tôi sử dụng directx thì việc thay đổi kích thước thời gian thực thậm chí còn khó hơn, mặt khác có vẻ tốt hơn để thay đổi kích thước mà không gặp bất kỳ vấn đề nào nhưng tôi sẽ mất hết khả năng vẽ 2d của GDI +.

Nếu có ai trong số các bạn đã làm bất cứ điều gì như thế này trước khi hãy hướng dẫn tôi. Ngoài ra nếu bạn có bất kỳ con trỏ mà tôi nên xem xét cho thiết kế giao diện người dùng tùy chỉnh sau đó cung cấp cho tôi các liên kết.

Cảm ơn!

Tôi luôn muốn thiết kế giao diện như windows media player 11 nhưng ai đó có thể cho tôi biết rằng có một giải pháp chuyển tiếp thẳng cho lập trình viên C++ (Tôi muốn biết cách sử dụng một số khung hiện có, v.v.)? Subclassing, chủ sở hữu bản vẽ, tùy chỉnh vẽ không có gì để cung cấp cho bạn mức độ kiểm soát, tôi không biết một cách để vẽ kiểm soát bán trong suốt với điều khiển chung, vì vậy tôi nghĩ rằng câu hỏi này xứng đáng được chú ý đặc biệt. Cảm ơn một lần nữa.

+0

Đó là một vấn đề quen thuộc: http://stackoverflow.com/questions/9786218/drawing-in-window-while-resizing-leaves-unpainted-border –

+0

Tôi đã tự mình trải qua nỗi đau này - Tôi cần một biểu mẫu hỗ trợ alpha đầy đủ và nhấp qua biến. Tôi không bao giờ quản lý để có được làm việc thay đổi kích thước trơn tru (và phải mất một thời gian dài để làm việc ra tất cả các kinks nhỏ khác như proxying sự kiện). Tôi muốn được quan tâm để biết nếu bạn tìm thấy một giải pháp phong nha. – Basic

+0

Nhưng còn các khung công tác khác như qt làm thay đổi kích thước trơn tru thì sao? và nếu tôi nhớ chính xác gtk cũng sử dụng các điều khiển được vẽ không có bản đồ tùy chỉnh không cửa sổ. Tôi tin rằng có tồn tại một giải pháp nhưng tôi ngạc nhiên rằng có rất ít tài nguyên trực tuyến về chủ đề này. Rất ít người sẽ không đồng ý rằng có một GUI phong nha tùy chỉnh không phải là giá trị nỗ lực. – smit

Trả lời

5

Có thể đó là tin nhắn WM_ERASEBKGND gây ra nó?

thấy câu hỏi này: GDI+ double buffering in C++

Ngoài ra, nếu bạn cần phản ứng nhanh từ GUI của bạn tôi sẽ tham mưu chống GDI +.

+0

Vâng, tôi đã quan tâm đến điều đó. – smit

Các vấn đề liên quan