لماذا يُنتج الكود الخاص بي لون منطقة العميل للنافذة باللون الأسود بالكامل دون أي عرض عند استخدام التخزين المؤقت المزدوج لمنع الوميض.


أنا أستخدم طريقة التخزين المؤقت المزدوج في النافذة الرئيسية لبرنامجي لمنع الوميض، ولكنني حصلت على منطقة العميل ذات النافذة السوداء بالكامل بدلاً من ذلك. ماذا ممكن ان تكون المشكلة.

الرموز ذات الصلة موضحة أدناه:
يرجى ملاحظة أن وظيفة WriteDatah ليست جزءًا فعليًا من التطبيق الفعلي. لقد أنشأت مشروعًا جديدًا وأحضرت الكود الإشكالي إليه لأكتشف أنه كان خطأ. تمثل WriteData الكود الفعلي في المتعة. باستخدام تطبيق الاختبار الجديد هذا، تمكنت من تضييق نطاق المشكلة إما أن التخزين المؤقت المزدوج لم يتم بشكل صحيح أو أن وضع التعيين يتعارض معه. ماذا تعتقد.

سي ++
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;
    }
سي ++
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;

يتم تشغيل هذا الكود التالي بواسطة عنصر القائمة بالمعرف ID_DRAW_DRAW_TEXT. لذلك، يتم التعامل معها بواسطة WM_COMMAND.

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

                InvalidateRect(hWnd, NULL, FALSE);

                break;
            }

سي ++
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);


}
سي ++
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;
}
سي ++
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);
    
}

ما حاولت:

لقد تم تصحيح الأخطاء طوال اليوم. لدي قدر كبير جدًا من البحث على Google أيضًا.

الحل 1

من النظرة الأولى: لا تحدد ألوان القلم والفرشاة للرسم.

الحل 2

لقد استخدمت هذه الفئة: وميض الرسم الحر في MFC[^] لسنوات عديدة، وأنها تعمل بشكل جيد حقا. لقد كتبت أيضًا نسخة غير تابعة لـ MFC والتي استخدمتها عدة مرات. يبدو أن التعليمات البرمجية الخاصة بك لا تستخدم MFC ولكن المبادئ هي نفسها. الأمر كله يتعلق بالتعامل مع الرسائل، في المقام الأول WM_PAINT. لكن، WM_ERASEBACKGND يحتاج أيضًا إلى التعامل معه بمجرد العودة إلى الحقيقة. أنصحك بقراءة المقال بعناية لمعرفة ما إذا كنت تفعل شيئًا خاطئًا.

اسمحوا لي أن أعرف إذا كنت تريد رؤية الإصدار غير الخاص بـ MFC وسأقوم بنشره هنا. إنه في الأساس نفس إصدار MFC باستثناء أنه يستخدم مكالمات GDI بدلاً من أساليب CDC.

コメント

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