Tại sao mã của tôi tạo ra màu khu vực cửa sổ máy khách hoàn toàn màu đen mà không có bất kỳ hiển thị nào về việc sử dụng bộ đệm kép để tránh nhấp nháy.

lập trình


Tôi đang sử dụng phương pháp đệm đôi trong cửa sổ chính của chương trình để tránh hiện tượng nhấp nháy, nhưng thay vào đó, tôi đã nhận được khu vực máy khách cửa sổ hoàn toàn màu đen. Điều gì có thể là vấn đề.

Các mã liên quan được hiển thị dưới đây:
Xin lưu ý rằng Hàm WriteDatah không phải là một phần thực tế của ứng dụng thực tế. Tôi đã tạo một dự án mới và đưa mã có vấn đề vào dự án đó để tìm ra dự án nào sai. WriteData đại diện cho mã thực tế về mặt chức năng. Với ứng dụng thử nghiệm mới này, tôi có thể thu hẹp vấn đề là việc đệm đôi không được thực hiện đúng cách hoặc chế độ ánh xạ xung đột với nó. Bạn nghĩ sao.

C++
case WM_CREATE:
    {
        HDC hdc = GetDC(hWnd);

        std::tuple<double, double, int, int> Tuple = GetAppDocumentSize(hWnd, hdc, iPageWidth, iPageHeight);
        iOneMMX = static_cast<int>(Approximate(get<0>(Tuple), 0));
        iOneMMY = static_cast<int>(Approximate(get<1>(Tuple), 0));
        int iWidth = GetSystemMetrics(SM_CXSCREEN);
        int iHeight = GetSystemMetrics(SM_CYSCREEN);
        hMemDC = CreateCompatibleDC(hdc);
        hBitmap = CreateCompatibleBitmap(hdc, iWidth, iHeight);
        hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
        HBRUSH hBrush = (HBRUSH)GetStockObject(WHITE_BRUSH);
        hOldBrush = (HBRUSH)SelectObject(hMemDC, hBrush);

        ReleaseDC(hWnd,hdc);


        break;
    }
C++
case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);
            std::tuple<double,double,int,int> Tuple = GetAppDocumentSize(hWnd, hdc, iPageWidth, iPageHeight);
          
            BitBlt(hdc, 0, 0, iPageWidth, iPageHeight, hMemDC, 0, 0, SRCCOPY);

            EndPaint(hWnd, &ps);
        }
        break;

Mã sau đây được thực hiện bằng mục menu có ID ID_DRAW_DRAW_TEXT. Vì vậy, nó được xử lý bởi WM_COMMAND.

C++
case ID_DRAW_DRAWTEXT:
            {
                Rectangle(hMemDC, 0, 0, iPageWidth, iPageHeight);
                WriteDatah(hMemDC,iOneMMX,iOneMMY,iPageWidth,iPageHeight);

                InvalidateRect(hWnd, NULL, FALSE);

                break;
            }

C++
HFONT CreateAppFont(int cHeight, int cWeight, DWORD bItalic, int cEscapement, DWORD bUnderline, LPCWSTR pszFaceName)
{
    return CreateFont(cHeight, 0, cEscapement, cEscapement, cWeight, bItalic, bUnderline, FALSE, DEFAULT_CHARSET, OUT_OUTLINE_PRECIS,
        CLIP_DEFAULT_PRECIS, CLEARTYPE_QUALITY, VARIABLE_PITCH, pszFaceName);


}
C++
double Approximate(double dNumber, int iDecimalPlaces)
{
    int iMultipier = static_cast<int>(pow(10, iDecimalPlaces));
    dNumber *= iMultipier;

    double dInteger = 0.0;
    double dDecimal = modf(dNumber, &dInteger);

    int Integer = static_cast<int>(dInteger);

    if (dDecimal >= 0.5)
    {
        Integer++;
    }

    double dResult = Integer / iMultipier;

    return dResult;
}
C++
void WriteDatah(HDC hdc,int iOneMMX,int iOneMMY,int iPageWidth,int iPageHeight)
{
    UNREFERENCED_PARAMETER(iPageHeight);

    std::wstring wstData = L"Jesus is Lord of the Nations";
    
    int iOneINCHY = GetDeviceCaps(hdc, LOGPIXELSY);
    double dOneFontPOINT = (double)iOneINCHY / 72.0;
    int iOneFontPOINT = static_cast<int>(Approximate(dOneFontPOINT, 0));

    int iFontSize = 10 * iOneFontPOINT;

    HFONT hFont = CreateAppFont(iFontSize, FW_BOLD);
    HFONT hOldFont = (HFONT)SelectObject(hdc, hFont);

    int iLeft = 10 * iOneMMX;
    int iTop = 10 * iOneMMY;

    SIZE size;
    GetTextExtentPoint32(hdc, wstData.c_str(), lstrlen(wstData.c_str()), &size);
    TEXTMETRIC tm;
    GetTextMetrics(hdc, &tm);

    for (int i = 0; i < 100; i++)
    {
        TextOut(hdc, iLeft, iTop, wstData.c_str(), lstrlen(wstData.c_str()));

        iTop += tm.tmHeight + tm.tmExternalLeading;

    }
      
       


    SelectObject(hdc, hOldFont);
    
}

Những gì tôi đã thử:

Tôi đã gỡ lỗi cả ngày. Tôi cũng có số lượng tìm kiếm trên Google khá nhiều.

Giải pháp 1

Ngay từ cái nhìn đầu tiên: bạn không chỉ định màu bút và cọ vẽ cho bản vẽ.

Giải pháp 2

Tôi đã sử dụng lớp này: Vẽ miễn phí nhấp nháy trong MFC[^] trong nhiều năm và nó hoạt động rất tốt. Tôi cũng đã viết một phiên bản không phải MFC mà tôi đã sử dụng một vài lần. Mã của bạn dường như không sử dụng MFC nhưng các nguyên tắc đều giống nhau. Đó chủ yếu là về việc xử lý tin nhắn WM_PAINT. Tuy nhiên, WM_ERASEBACKGND cũng cần được xử lý bằng cách trả về true. Tôi khuyên bạn nên đọc kỹ bài viết để xem liệu bạn có làm sai điều gì không.

Hãy cho tôi biết nếu bạn muốn xem phiên bản không phải MFC và tôi sẽ đăng nó ở đây. Về cơ bản, nó giống với phiên bản MFC ngoại trừ việc nó sử dụng các lệnh gọi GDI thay vì các phương thức CDC.

コメント

タイトルとURLをコピーしました