Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 12 kết quả

Đề tài: Không paint lại vùng main window bị child window đè

  1. #1
    Ngày gia nhập
    01 2007
    Nơi ở
    Hải Phòng
    Bài viết
    210

    Mặc định Không paint lại vùng main window bị child window đè

    Tui có 1 main window, một child window đè lên nó. Mỗi khi kéo chuột để resize main window ( windows để chế độ kéo đến đâu resize đến đó ), nó paint lại main window rồi paint lại child window. Với máy cấu hình cao thì ko sao. Nhưng ới máy cấu hình thấp ( máy tui ) thì chỗ child window nhìn rất giật. Do nó vẽ main window đè lên child window, sau đó vẽ lại child window. Việc này gây khó chịu cho người sử dụng. Ai có biết cách khắc phục ko ? Để cái main window ko vẽ lại vùng child window nằm đè, tránh gây nhức mắt ???

  2. #2
    Ngày gia nhập
    11 2006
    Bài viết
    75

    Code:
    if (!AnyWindow.Redraw)
       App.Status = "Hang";
    You should read the book "Programming Windows" (Charles Petzold) carefully, HieuBm.
    Our dreams are young and we both know they take us where we want to go...

  3. #3
    Ngày gia nhập
    01 2007
    Nơi ở
    Hải Phòng
    Bài viết
    210

    You should read the book "Programming Windows" (Charles Petzold) carefully, HieuBm.
    Tớ có "Programming Windows" nhưng tớ rất ít đọc mà đọc cái quyển "Lập trình Windows" của Lê Hữu Đạt ( hình như ông này dịch ừ quyển kia sang, thấy giống nhau lắm ). Tuy nhiên tớ mới đang học nên chưa đọc hết và kĩ lắm. Cũng có nhiều phần thấy nói vớ vẩn nên bỏ qua.

    Cảm ơn vì cậu đã bỏ chút thời gian giúp đỡ. Nhưng cậu làm khó tớ quá. Cậu chẳng bảo là cái "AnyWindow.Redraw" nằm ở Chapter nảo. Đến xài search cũng ko có. Mong bạn nhiệt tình giúp hơn một chút.

  4. #4
    Ngày gia nhập
    07 2006
    Nơi ở
    Hà nội
    Bài viết
    204

    Cái này ko phải do cấu hình thấp hay cao, do tạo window ko đúng cách thôi. Khi tạo window bằng CreateWindow phải thêm cái WS_CLIPSIBLINGS vào window style, hay dùng setwindowlong thêm vào cũng được.
    Life:\> dir

  5. #5
    Ngày gia nhập
    01 2007
    Nơi ở
    Hải Phòng
    Bài viết
    210

    Trích dẫn Nguyên bản được gửi bởi hoanglinh9466
    Cái này ko phải do cấu hình thấp hay cao, do tạo window ko đúng cách thôi. Khi tạo window bằng CreateWindow phải thêm cái WS_CLIPSIBLINGS vào window style, hay dùng setwindowlong thêm vào cũng được.
    Cho vô cái CreateWindow nào vậy bạn ? Cho vào cái chính hay là cho vào những cái con ? Sao mà tớ thử cho vào cả 2 cái đều "như cũ" vậy ?

  6. #6
    Ngày gia nhập
    07 2006
    Nơi ở
    Hà nội
    Bài viết
    204

    Mặc định Không paint lại vùng main window bị child window đè

    Cho vào cái chính ấy. Cho vào cả 2 mà ko được ah, thế thì chịu.
    Life:\> dir

  7. #7
    Ngày gia nhập
    01 2007
    Nơi ở
    Hải Phòng
    Bài viết
    210

    Bạn có thể nói rõ về tác dụng, cách làm việc của cái WS_CLIPSIBLINGS có được ko. Mình đọc MSDN vẫn chưa hiểu ý nó lắm ( trình độ E còn low ).
    Nếu mình ko nhầm thì nó bảo là kết hợp với WS_CHILD, sao bạn bảo là để ở cái chính ???
    Mình đã thử làm và thấy nó vẫn còn giật mỗi khi kéo mép như xưa, hay là bạn làm thử coi !

  8. #8
    Ngày gia nhập
    01 2007
    Nơi ở
    Hải Phòng
    Bài viết
    210

    Sao chẳng có ai giúp tớ vậy ?

  9. #9
    Ngày gia nhập
    11 2006
    Bài viết
    75

    Code:
    ...
    case WM_PAINT:
        //static PAINTSTRUCT ps;
        //static HDC hdc;
     
        hdc = BeginPaint (hwnd, &ps) ; 
        //[other program lines]
        EndPaint (hwnd, &ps) ; 
        //Can use WinApi Func ValidateRect instead
    Khi vùng giới hạn (region) của một cửa sổ bị che khuất - một phần hay toàn bộ, Windows sẽ gửi thông điệp WM_PAINT đến cửa sổ đó để yêu cầu vẽ lại region (ref: InvalidateRect, InvalidateRgn, ValidateRect, ValidateRgn - bác có thể dùng các hàm API này để yêu cầu vẽ/vẽ lại tự động khi cần). Thủ tục mặc định dùng để xử lý thông điệp này (DefWindowProc) chính là gồm 2 lệnh BeginPaint và EndPaint.

    Chính vì vậy nếu bác xử lý thông điệp WM_PAINT theo kiểu:

    Code:
    case WM_PAINT:
        return 0; //hay là không vẽ lại cửa sổ
    sẽ làm cho vùng client của cửa sổ không được "hợp lệ hóa" (validate). Và thằng Windows sẽ tiếp tục gửi cho cửa sổ này một thông điệp WM_PAINT khác và do "return 0" nên cửa sổ tiếp tục là "invalidate" --> lại nhận một WM_PAINT khác nữa v...v

    Tóm lại một chuỗi bất tận WM_PAINT sẽ được gửi tới cửa sổ của bác --> treo chương trình.

    if (!AnyWindow.Redraw) App.Status = "hang" :-))

    P.S: Thử cái window procedure này xem sao:

    Code:
    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch (message)                  /* handle the messages */
        {
            case WM_PAINT:
                MessageBox (NULL, TEXT("Forever Msg"), TEXT("WM_PAINT Problem"), 0);
                return 0; 
                 
            case WM_DESTROY:
                PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
                break;
            default:                      /* for messages that we don't deal with */
                return DefWindowProc (hwnd, message, wParam, lParam);
        }
    
        return 0;
    }
    Đã được chỉnh sửa lần cuối bởi ilovecplusplus : 26-01-2007 lúc 10:47 AM.
    Our dreams are young and we both know they take us where we want to go...

  10. #10
    Ngày gia nhập
    11 2006
    Bài viết
    75

    À quên, nếu giật thì thử chơi kiểu window CS_OWNDC xem sao.
    Code:
    wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC ;
    Our dreams are young and we both know they take us where we want to go...

Các đề tài tương tự

  1. Trả lời: 1
    Bài viết cuối: 13-07-2014, 08:06 AM
  2. Cách sử mdiparent - child trong window forms. Giúp mình
    Gửi bởi danhloi trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 5
    Bài viết cuối: 27-10-2013, 10:37 AM
  3. Làm thế nào để tạo một OpenGL Window bên trong một Main Window?
    Gửi bởi bachhaiduong trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 2
    Bài viết cuối: 10-01-2012, 10:09 AM
  4. lỗi không thấy phân vùng trong window 7
    Gửi bởi zstar trong diễn đàn Thắc mắc chung
    Trả lời: 2
    Bài viết cuối: 15-03-2011, 12:31 AM
  5. Hỏi : Làm thế nào để biết khi nào child window được resize
    Gửi bởi quangnh89 trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 6
    Bài viết cuối: 05-08-2009, 09:39 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn