سؤال

أقوم بتشغيل هذا الرمز التالي،

HDC hdc;
HDC hdcMem;
HBITMAP bitmap;
RECT c;
GetClientRect(viewHandle, &c);
// instead of BeginPaint use GetDC or GetWindowDC
hdc = GetDC(viewHandle); 
hdcMem = CreateCompatibleDC(hdc); 
// always create the bitmap for the memdc from the window dc
bitmap = CreateCompatibleBitmap(hdc,c.right-c.left,200);

SelectObject(hdcMem, bitmap);

// only execute the code up to this point one time
// that is, you only need to create the back buffer once
// you can reuse it over and over again after that

// draw on hdcMem
// for example  ...
Rectangle(hdcMem, 126, 0, 624, 400);

// when finished drawing blit the hdcMem to the hdc
BitBlt(hdc, 0, 0, c.right-c.left,200, hdcMem, 0, 0, SRCCOPY);

// note, height is not spelled i before e

// Clean up - only need to do this one time as well
DeleteDC(hdcMem);
DeleteObject(bitmap);
ReleaseDC(viewHandle, hdc);

الرمز هو فقط على ما يرام. لكنني أرى اللون الأسود حول هذا المستطيل. لماذا هذا؟ هنا صورة مثال.

هل كانت مفيدة؟

المحلول

من المرجح أن تكون الصورة النقطية تتم تهيئتها أن تكون كلها سوداء. ثم تقوم بإلقاء مستطيل أبيض بحيث بين X-إحداثيات 126 و 624. وبالتالي، فإن كل شيء على يسار x = 126 وإلى يمين X = 624 يبقى أسود.

تحرير: وثائق ل CreateCompatibleBitmap لا تذكر كيف سيتم تهيئة الصورة النقطية، لذلك يجب عليك تهيئة الصورة النقطية بشكل صريح بلون معين، كما يوحي Goz، باستخدام FillRect:

RECT rc;

rc.left=0;
rc.top=0;
rc.right=c.right-c.left;
rc.bottom=200;

FillRect(hdcMem, &rc, (HBRUSH)GetStockObject(GRAY_BRUSH));

يملأ هذا المثال الصورة النقطية باللون الرمادي - قد تحتاج إلى CreateSolidBrush فرشاة الخاصة بك إذا كنت بحاجة إلى لون مختلف. (لا تنسى الاتصال DeleteObject حينما تنتهي.)

كملاحظة جانبية، أجد أنه من الغريب بعض الشيء أن يتم تعيين نقطتك على ارتفاع ثابت قدرها 200 - والشيء الطبيعي هو جعل ارتفاع الصورة النقطية مساوية لارتفاع النافذة (كما هو الحال بالنسبة لل العرض).

نصائح أخرى

قد يكون لأنك لم تهتم منطقة نقطية الذاكرة إلى لون معين؟ حاول fillrect'ing الخلفية بلون مختلف ثم ارسم مستطيلك الأبيض عليه ومعرفة ما يحدث.

لكل MSDN. http://msdn.microsoft.com/en-us/library/dd162898.aspx.:

يتم تحديد المستطيل باستخدام القلم الحالي ومليء باستخدام الفرشاة الحالية.

النظر في الاتصال FillRect بدلا من ذلك، أو حدد قلم مناسب قبل الاتصال Rectangle'.

انا إستعملت:

    // Fill the background
    hdcMem->FillSolidRect(c, hdcMem->GetBkColor());

تماما كملاحظة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top