Здравствуйте!!! Есть ComboBox со стилями CBS_NOINTEGRALHEIGHT+CBS_AUTOHSCROLL+CBS_OWNERDRAWFIXED+CBS_DROPDOWNLIST. В общем написал ф-ю. DrawComboBoxItem которая прорисовывает итемы ComboBox-a(в выпадающем списке прямоуголники с цветами.. синий красный итд.), дело в том что сообщения ODS_FOCUS и ODS_SELECTED приходят одновременно и прорисовывается не совсем корректно, вроде как при наведении на 1 элементе должна рисоваться рамка (DrawFocusRect) а рисуется на всех, и ещё вопрос, после какой проверки бита мне следует выводить текст чтобы надпись была только в ComboBox а не и во всех его итемах выпадающего списка... Спасибо за внимание и возможную помощь!!! Код (Text): ChildDlgProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM LOCAL rc:RECT LOCAL tm:TEXTMETRIC ... .ELSEIF uMsg==WM_DRAWITEM INVOKE DrawComboBoxItem,lParam ... ;----------------------------------------------------------------------- DrawComboBoxItem proc pDIStruct:DWORD; Указатель на DRAWITEMSTRUCT LOCAL hBrush:DWORD LOCAL hOldBrush:DWORD LOCAL hPenColor:DWORD LOCAL hPenStyle:DWORD LOCAL hOldPen:DWORD LOCAL hPen:DWORD ASSUME EDI:PTR DRAWITEMSTRUCT MOV EDI,pDIStruct ; TEST [EDI].itemState,ODS_DEFAULT ; JNE ENDOdsDefault ; MOV hPenColor,111111h ; MOV hPenStyle,PS_SOLID ; JMP ENDItemAction ; ENDOdsDefault: TEST [EDI].itemState,ODS_SELECTED JE ELSODSSelected MOV hPenColor,0CCCCCCh MOV hPenStyle,PS_DASH JMP ENDODSSelected ELSODSSelected: MOV hPenStyle,PS_SOLID MOV hPenColor,00000h ENDODSSelected: MOV EAX,[EDI].itemID MOV hBrush,FUNC(CreateSolidBrush,szColor[EAX*4]) ; Выборка цвета в зависимости от номера итема MOV hPen,FUNC(CreatePen,hPenStyle,01h,hPenColor) MOV hOldBrush,FUNC(SelectObject,[EDI].hdc,hBrush) MOV hOldPen,FUNC(SelectObject,[EDI].hdc,hPen) INVOKE Rectangle,[EDI].hdc,[EDI].rcItem.left,[EDI].rcItem.top,\ [EDI].rcItem.right,[EDI].rcItem.bottom INVOKE SelectObject,[EDI].hdc,hOldBrush INVOKE SelectObject,[EDI].hdc,hOldPen INVOKE DeleteObject,hBrush INVOKE DeleteObject,hPen TEST [EDI].itemState,ODS_FOCUS JNE @F INVOKE DrawFocusRect,[EDI].hdc,ADDR [EDI].rcItem ; invoke MessageBox,NULL,NULL,NULL,NULL @@: ASSUME EDI:NOTHING RET DrawComboBoxItem endp
/ Код (Text): /------------------------------------------------------------------------ // Color Selector ComboBox void ColorSelector_Initialize(HWND hwndCombo) { ComboBox_AddItemData(hwndCombo, RGB(0, 0, 0)); ComboBox_AddItemData(hwndCombo, RGB(255, 255, 255)); ComboBox_AddItemData(hwndCombo, RGB(255, 0, 0)); ComboBox_AddItemData(hwndCombo, RGB(0, 255, 0)); ComboBox_AddItemData(hwndCombo, RGB(0, 0, 255)); ComboBox_AddItemData(hwndCombo, RGB(255, 255, 0)); ComboBox_AddItemData(hwndCombo, RGB(255, 0, 255)); ComboBox_AddItemData(hwndCombo, RGB(0, 255, 255)); ComboBox_AddItemData(hwndCombo, RGB(192, 192, 192)); ComboBox_AddItemData(hwndCombo, RGB(128, 128, 128)); ComboBox_AddItemData(hwndCombo, RGB(128, 0, 0)); ComboBox_AddItemData(hwndCombo, RGB(128, 128, 0)); ComboBox_AddItemData(hwndCombo, RGB(0, 128, 0)); ComboBox_AddItemData(hwndCombo, RGB(0, 128, 128)); ComboBox_AddItemData(hwndCombo, RGB(0, 0, 128)); } //------------------------------------------------------------------------ char* ColorSelector_GetColorName(COLORREF clr) { switch(clr) { case RGB(0x00, 0x00, 0x00): return "Black"; case RGB(0xFF, 0xFF, 0xFF): return "White"; case RGB(0xFF, 0x00, 0x00): return "Red"; case RGB(0x00, 0xFF, 0x00): return "Lime"; case RGB(0x00, 0x00, 0xFF): return "Blue"; case RGB(0xFF, 0xFF, 0x00): return "Yellow"; case RGB(0xFF, 0x00, 0xFF): return "Fuchsia"; case RGB(0x00, 0xFF, 0xFF): return "Aqua"; case RGB(192, 192, 192): return "Silver"; case RGB(128, 128, 128): return "Gray"; case RGB(128, 0, 0): return "Maroon"; case RGB(128, 128, 0): return "Olive"; case RGB(0, 128, 0): return "Green"; case RGB(0, 128, 128): return "Teal"; case RGB(0, 0, 128): return "Navy"; } return ""; } //------------------------------------------------------------------------ BOOL ColorSelector_OnMeasureItem(HWND hwndCombo, PMEASUREITEMSTRUCT pmis) { HDC hdc = NULL; HFONT hFont = NULL; SIZE Size; if (pmis->CtlType == ODT_COMBOBOX) { hdc = GetDC(hwndCombo); GetTextExtentPoint32(hdc, "A", 1, &Size); ReleaseDC(hwndCombo, hdc); pmis->itemHeight = Size.cy; return TRUE; } return FALSE; } //------------------------------------------------------------------------ BOOL ColorSelector_OnDrawItem(HWND hwndCombo, PDRAWITEMSTRUCT pdis) { HDC hdc = NULL; HFONT hFont = NULL; SIZE Size; RECT rcIcon; HPEN hOldPen = NULL; HBRUSH hOldBrush = NULL; if (pdis->CtlType == ODT_COMBOBOX) { GetTextExtentPoint32(pdis->hDC, "A", 1, &Size); rcIcon.left = pdis->rcItem.left; rcIcon.top = pdis->rcItem.top + (pdis->rcItem.bottom - pdis->rcItem.top - Size.cy) / 2; rcIcon.right = rcIcon.left + Size.cy; rcIcon.bottom = rcIcon.top + Size.cy; FillRect(pdis->hDC, &pdis->rcItem, GetStockBrush(WHITE_BRUSH)); hOldPen = SelectPen(pdis->hDC, CreatePen(0, 0, RGB(0,0,0))); hOldBrush = SelectBrush(pdis->hDC, CreateSolidBrush((COLORREF)pdis->itemData)); Rectangle(pdis->hDC, rcIcon.left, rcIcon.top, rcIcon.right, rcIcon.bottom); rcIcon.left = rcIcon.right + 2; rcIcon.right = pdis->rcItem.right; rcIcon.top = pdis->rcItem.top; rcIcon.bottom = pdis->rcItem.bottom; SetTextColor(pdis->hDC, RGB(0,0,0)); SetBkMode(pdis->hDC, TRANSPARENT); DrawText(pdis->hDC, ColorSelector_GetColorName((COLORREF)pdis->itemData), -1, &rcIcon, DT_VCENTER|DT_SINGLELINE); if (pdis->itemState & ODS_FOCUS) DrawFocusRect(pdis->hDC, &pdis->rcItem); DeletePen(SelectPen(pdis->hDC, hOldPen)); DeleteBrush(SelectBrush(pdis->hDC, hOldBrush)); return TRUE; } return FALSE; } //------------------------------------------------------------------------ BOOL CALLBACK DlgProc(HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam) { HWND hwndCtrl = NULL; switch(msg) { case WM_INITDIALOG: hwndCtrl = GetDlgItem(hdlg, IDC_TEXTCOLOR); ColorSelector_Initialize(hwndCtrl); ComboBox_SetCurSel(hwndCtrl, 0); break; case WM_MEASUREITEM: { PMEASUREITEMSTRUCT pmis = (PMEASUREITEMSTRUCT)lParam; HWND hwndCtrl = NULL; if (pmis->CtlType == ODT_COMBOBOX && pmis->CtlID == IDC_TEXTCOLOR) { hwndCtrl = GetDlgItem(hdlg, pmis->CtlID); return ColorSelector_OnMeasureItem(hwndCtrl, pmis); } } return FALSE; case WM_DRAWITEM: { PDRAWITEMSTRUCT pdis = (PDRAWITEMSTRUCT)lParam; HWND hwndCtrl = NULL; if (pdis->CtlType == ODT_COMBOBOX && pdis->CtlID == IDC_TEXTCOLOR) { hwndCtrl = GetDlgItem(hdlg, pdis->CtlID); return ColorSelector_OnDrawItem(hwndCtrl, pdis); } } return FALSE; default: break; } return FALSE; }
Хороший пример, спасибо.. но как выводить текст только в ComboBox-e а не и в выпадающем списке я так и не понял.
Код (Text): typedef struct tagDRAWITEMSTRUCT { UINT CtlType; UINT CtlID; UINT itemID; UINT itemAction; UINT itemState; HWND hwndItem; HDC hDC; RECT rcItem; ULONG_PTR itemData; } DRAWITEMSTRUCT; ... itemState Specifies the visual state of the item after the current drawing action takes place. This member can be a combination of the values shown in the following table. ... ODS_COMBOBOXEDIT The drawing takes place in the selection field (edit control) of an owner-drawn combo box.
Спасибо большое, Ты мне уже второй раз помогаешь и прямо в точку!)) P.S. Ещё я с TEST-ом напутал. точнее с флагами которыми эта команда устанавливает(JE, JNE)