معلومات إضافية: استخدام رسالة WM_CTLCOLOR

3.00 3، 10 كببرج WINDOWS

ملخص

يتم إرسال رسالة WM_CTLCOLOR إلى إطار كل مرة واحد تحكمه الإطار التابع (زر الخيار، شريط التمرير وما إلى ذلك) طلاؤها على الشاشة. يسبق هذه الرسالة رسم عنصر التحكم. عندما يكون مطلوباً لتغيير مظهر عناصر التحكم، يمكن إجراء ذلك عن طريق معالجة رسالة WM_CTLCOLOR.

مزيد من المعلومات

عندما يتم إرسال WM_CTLCOLOR، wParam يحتوي على مؤشر إلى سياق عرض الإطار الفرعي (في هذه الحالة عنصر التحكم). LOWORD lParam يعرف الإطار الفرعي حسب رقم المعرف الخاص به، و HIWORD lParam يحتوي على إحدى القيم التالية، تحديد نوع عنصر التحكم الذي سيتم سحب:

   CTLCOLOR_BTN            button control
CTLCOLOR_DLG dialog box
CTLCOLOR_EDIT edit control
CTLCOLOR_LISTBOX list box
CTLCOLOR_MSGBOX message box
CTLCOLOR_SCROLLBAR scroll bar
CTLCOLOR_STATIC static text, frame, or rectangle

عند معالجة WM_CTLCOLOR، يجب إرجاع مؤشر إلى فرشاة. سيؤدي عدم عودة مؤشر فرشاة فاتاليكسيت Windows على جهاز العرض التصحيح في إصدار التصحيح ل Windows.


DefWindowProc() مسبقاً بإرجاع مؤشر ردا على هذه الرسالة. ومع ذلك، يمكن إرجاع تطبيق مؤشر آخر لتخصيص لون عناصر التحكم. تحديد المؤشر الذي تم إرجاعه الفرشاة ليتم استخدامه لرسم عنصر التحكم. على سبيل المثال، في Windows 2.x، التعليمات البرمجية التالية يرسم خلفية الرمادي الفاتح كافة الأزرار:

   case WM_CTLCOLOR:      if (HIWORD(lParam) == CTLCOLOR_BTN)
return (GetStockObject(LTGRAY_BRUSH));

return (GetStockObject(WHITE_BRUSH));

في هذه الحالة، الخلفيات لكافة عناصر التحكم الأخرى باللون الأبيض. لاحظ أن GetStockObject() بإرجاع مؤشر إلى فرشاة المخزون المحدد بواسطة المعلمة. لتغيير لون الخلفية لعنصر تحكم زر في Windows 3.0 والإصدارات الأحدث، من الضروري إنشاء زر رسم مالك.


إرجاع مؤشر فرشاة يقدم بعض إمكانيات مثيرة للاهتمام لمؤشرات الفرشاة ليست مقصورة على تلك التي يتم إرجاعها من GetStockObject(). يمكنك إنشاء فرش الحشو من الصور النقطية. إذا تم إرجاع مؤشر فرشاة نقش ردا على رسالة WM_CTLCOLOR، يمكن استخدام الفرشاة لرسم الخلفية من عناصر التحكم.


تغيير التعليمات البرمجية التالية طلاء منطقة المسار الإبهام شريط التمرير إلى نمط نسج سلة في 'الرسام':

   /* Add these global variables. The array of WORDs specifies the */    /* pattern for the brush                                        */ 
HBRUSH hBrush;
HBITMAP hBitmap;
WORD wWeave[]={0x0F, 0x8B, 0xDD, 0xB8, 0x70, 0xE8, 0xDD, 0x8E};

...

/* Add these lines to WinMain */
hBitmap = CreateBitmap(8, 8, 1, 1, (LPSTR)wWeave);
hBrush = CreatePatternBrush(hBitmap);

...

/* Add this case to the Windows procedure or wherever the */
/* messages are processed. */
case WM_CTLCOLOR:
if (HIWORD(lParam) == CTLCOLOR_SCROLLBAR)
return (hBrush);

return (GetStockObject(WHITE_BRUSH));

رسالة WM_CTLCOLOR ينطبق أيضا على الفئات الخمس التالية عناصر التحكم:


  1. خانات الاختيار وأزرار الخيارات وأزرار الأمر: يطلي الجزء المستطيل الذي يتم وضع عنصر التحكم باستخدام فرشاة المحددة؛ يتم رسم الشكل عنصر تحكم والنص إزاء النمط المرسومة.
  2. عنصر تحكم التحرير: طلاء مساحة التحرير.
  3. مربع المجموعة: طلاء مساحة مستطيلة خلف نص العنوان.
  4. أشرطة التمرير: يطلي المنطقة حول المسار الإبهام.
  5. مربع قائمة: طلاء منطقة إدخال القائمة.
نص ثابت والإطارات والمستطيلات لا تتأثر ب WM_CTLCOLOR.


ملاحظة: في Windows 3.0 والإصدارات الأحدث، لا يمكن تطبيق تغيير لون وجه الزر. ومع ذلك، يمكن استخدامها "لوحة التحكم" لتغيير ألوان الأزرار لكافة التطبيقات في النظام. يمكن تحقيق ذلك أيضا عن طريق تعديل المقطع [الألوان] للفوز. Ini إلى إضافة "بوتونفيس =" الخط الذي يحدد قيمة لون RGB للون وجه الزر.


معالجة رسالة WM_CTLCOLOR فقط بتغيير لون الإطارات التابعة التي تم إنشاؤها من قبل تطبيق ما. يرسل Windows رسالة WM_CTLCOLOR إلى الإطار الأصل لكل من عناصر التحكم هذه. أشرطة التمرير التي تم تضمينها من قبل Windows كجزء من تحرير عناصر التحكم أو مربعات القائمة لا تتأثر. يمكن فقط تغيير مجال تعقب الإبهام أشرطة التمرير التي ينشئها النظام في الفوز. INI أو من خلال "لوحة التحكم".


من الممكن أيضا رسم خلفية مربع الحوار بأكمله. يمكن استخدام التعليمات البرمجية التالية لتوفير لون مربع حوار:

   long FAR PASCAL MainWindowProc(....);
...

case WM_CREATE:
hTempBrush = LoadBitmap(hInst, (LPSTR)"MyPatternBrush");
hBrush = CreatePatternBrush(hTempBrush);
DeleteObject(hTempBrush);

...

case WM_DESTROY:
DeleteObject(hBrush);

...

BOOL FAR PASCAL
MyDialogProc(....);

...

case WM_CTLCOLOR:
if (bMonoChrome)
return (FALSE); // Do nothing if on a monochrome monitor
// bMonoChrome is a global set during
// initialization.

if (CTLCOLOR_DLG == HIWORD(lParam))
UnrealizeObject(hBrush);

SelectObject((HDC)wParam, hBrush);

if (CTLCOLOR_DLG == HIWORD(lParam))
SetBrushOrg((HDC)wParam, 0, 0);

SetBkMode((HDC)wParam, TRANSPARENT);

SetTextColor((HDC)wParam, RGB(0, 0, 0));

return(hBrush);

...

وستكفل هذه التعليمة البرمجية أن صورة نقطية منقوشة إلى صف بشكل صحيح عبر مربع الحوار بأكمله. "ميباتيرنبروش" هو اسم صورة نقطية تم إنشاؤها باستخدام سدكباينت. ويجب إدراج هذه الصورة النقطية في. ملف RC.
خصائص

رقم الموضوع: 32685 - آخر مراجعة: 15‏/01‏/2017 - المراجعة: 1

تعليقات