झिलमिलाहट को रोकने के लिए डबल बफ़रिंग का उपयोग करने पर मेरा कोड बिना किसी डिस्प्ले के पूरी तरह से ब्लैक विंडो क्लाइंट एरिया रंग क्यों उत्पन्न करता है।


मैं फ़्लिकरिंग को रोकने के लिए अपने प्रोग्राम की मुख्य विंडो में डबल बफरिंग विधि का उपयोग कर रहा हूं, लेकिन मुझे इसके बजाय पूरी तरह से ब्लैक विंडो क्लाइंट क्षेत्र मिल रहा है। क्या समस्या हो सकती है।

प्रासंगिक कोड नीचे दिखाए गए हैं:
कृपया ध्यान दें कि 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;

यह निम्नलिखित कोड आईडी आईडी_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);
    
}

मैंने क्या प्रयास किया है:

मैं पूरे दिन डिबगिंग कर रहा हूं। मुझे भी काफी मात्रा में गूगल करना आता है।

समाधान 1

पहली नज़र से: आपको ड्राइंग के लिए पेन और ब्रश के रंग निर्दिष्ट नहीं करने हैं।

समाधान 2

मैंने इस वर्ग का उपयोग किया है: एमएफसी में झिलमिलाहट मुक्त ड्राइंग[^] कई वर्षों तक और यह वास्तव में अच्छी तरह से काम करता है। मैंने इसका एक गैर-एमएफसी संस्करण भी लिखा है जिसका मैंने कई बार उपयोग किया है। ऐसा प्रतीत होता है कि आपका कोड एमएफसी का उपयोग नहीं करता है लेकिन सिद्धांत समान हैं। यह सब मुख्य रूप से संदेशों को संभालने के बारे में है WM_PAINT. तथापि, WM_ERASEBACKGND इसे भी केवल true लौटाकर ही संभालने की आवश्यकता है। मेरा सुझाव है कि आप यह देखने के लिए लेख को ध्यान से पढ़ें कि क्या आप कुछ गलत कर रहे हैं।

यदि आप गैर-एमएफसी संस्करण देखना चाहते हैं तो मुझे बताएं और मैं इसे यहां पोस्ट करूंगा। यह अनिवार्य रूप से एमएफसी संस्करण के समान है, सिवाय इसके कि यह सीडीसी विधियों के बजाय जीडीआई कॉल का उपयोग करता है।

コメント

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