WM_DRAWITEM & ComboBox

Тема в разделе "WASM.WIN32", создана пользователем RDMess, 18 авг 2011.

  1. RDMess

    RDMess Member

    Публикаций:
    0
    Регистрация:
    28 дек 2009
    Сообщения:
    51
    Здравствуйте!!!
    Есть ComboBox со стилями CBS_NOINTEGRALHEIGHT+CBS_AUTOHSCROLL+CBS_OWNERDRAWFIXED+CBS_DROPDOWNLIST.

    В общем написал ф-ю. DrawComboBoxItem которая прорисовывает итемы ComboBox-a(в выпадающем списке прямоуголники с цветами.. синий красный итд.), дело в том что сообщения ODS_FOCUS и ODS_SELECTED приходят одновременно и прорисовывается не совсем корректно, вроде как при наведении на 1 элементе должна рисоваться рамка (DrawFocusRect) а рисуется на всех, и ещё вопрос, после какой проверки бита мне следует выводить текст чтобы надпись была только в ComboBox а не и во всех его итемах выпадающего списка... Спасибо за внимание и возможную помощь!!!


    Код (Text):
    1. ChildDlgProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
    2.         LOCAL rc:RECT
    3.         LOCAL tm:TEXTMETRIC
    4. ...
    5.  
    6.  
    7.         .ELSEIF uMsg==WM_DRAWITEM
    8.                  INVOKE DrawComboBoxItem,lParam  
    9. ...
    10.  
    11. ;-----------------------------------------------------------------------
    12.  
    13. DrawComboBoxItem proc pDIStruct:DWORD; Указатель на DRAWITEMSTRUCT
    14.       LOCAL hBrush:DWORD
    15.       LOCAL hOldBrush:DWORD
    16.       LOCAL hPenColor:DWORD
    17.       LOCAL hPenStyle:DWORD
    18.       LOCAL hOldPen:DWORD
    19.       LOCAL hPen:DWORD
    20.       ASSUME EDI:PTR DRAWITEMSTRUCT
    21.          MOV EDI,pDIStruct
    22.         ; TEST [EDI].itemState,ODS_DEFAULT
    23.         ; JNE  ENDOdsDefault
    24.              ; MOV hPenColor,111111h
    25.             ;  MOV hPenStyle,PS_SOLID
    26.             ;  JMP ENDItemAction
    27.         ; ENDOdsDefault:
    28.          TEST [EDI].itemState,ODS_SELECTED
    29.          JE   ELSODSSelected
    30.               MOV hPenColor,0CCCCCCh
    31.               MOV hPenStyle,PS_DASH
    32.               JMP ENDODSSelected
    33.          ELSODSSelected:
    34.               MOV hPenStyle,PS_SOLID
    35.               MOV hPenColor,00000h
    36.          ENDODSSelected:
    37.          
    38.          MOV EAX,[EDI].itemID            
    39.          MOV hBrush,FUNC(CreateSolidBrush,szColor[EAX*4]) ; Выборка цвета в зависимости от номера итема
    40.          MOV hPen,FUNC(CreatePen,hPenStyle,01h,hPenColor)            
    41.          MOV hOldBrush,FUNC(SelectObject,[EDI].hdc,hBrush)
    42.          MOV hOldPen,FUNC(SelectObject,[EDI].hdc,hPen)
    43.          INVOKE Rectangle,[EDI].hdc,[EDI].rcItem.left,[EDI].rcItem.top,\
    44.                                      [EDI].rcItem.right,[EDI].rcItem.bottom
    45.          INVOKE SelectObject,[EDI].hdc,hOldBrush
    46.          INVOKE SelectObject,[EDI].hdc,hOldPen
    47.          INVOKE DeleteObject,hBrush
    48.          INVOKE DeleteObject,hPen
    49.          
    50.           TEST [EDI].itemState,ODS_FOCUS
    51.           JNE  @F
    52.                INVOKE DrawFocusRect,[EDI].hdc,ADDR [EDI].rcItem
    53.               ; invoke MessageBox,NULL,NULL,NULL,NULL
    54.           @@:                                                            
    55.        
    56.       ASSUME  EDI:NOTHING
    57.       RET
    58.     DrawComboBoxItem endp
     
  2. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    /
    Код (Text):
    1. /------------------------------------------------------------------------
    2. // Color Selector ComboBox
    3.  
    4. void ColorSelector_Initialize(HWND hwndCombo)
    5. {
    6.     ComboBox_AddItemData(hwndCombo, RGB(0, 0, 0));
    7.     ComboBox_AddItemData(hwndCombo, RGB(255, 255, 255));
    8.     ComboBox_AddItemData(hwndCombo, RGB(255, 0, 0));
    9.     ComboBox_AddItemData(hwndCombo, RGB(0, 255, 0));
    10.     ComboBox_AddItemData(hwndCombo, RGB(0, 0, 255));
    11.     ComboBox_AddItemData(hwndCombo, RGB(255, 255, 0));
    12.     ComboBox_AddItemData(hwndCombo, RGB(255, 0, 255));
    13.     ComboBox_AddItemData(hwndCombo, RGB(0, 255, 255));
    14.     ComboBox_AddItemData(hwndCombo, RGB(192, 192, 192));
    15.     ComboBox_AddItemData(hwndCombo, RGB(128, 128, 128));
    16.     ComboBox_AddItemData(hwndCombo, RGB(128, 0, 0));
    17.     ComboBox_AddItemData(hwndCombo, RGB(128, 128, 0));
    18.     ComboBox_AddItemData(hwndCombo, RGB(0, 128, 0));
    19.     ComboBox_AddItemData(hwndCombo, RGB(0, 128, 128));
    20.     ComboBox_AddItemData(hwndCombo, RGB(0, 0, 128));
    21. }
    22.  
    23. //------------------------------------------------------------------------
    24.  
    25. char* ColorSelector_GetColorName(COLORREF clr)
    26. {
    27.     switch(clr)
    28.     {
    29.     case RGB(0x00, 0x00, 0x00): return "Black";
    30.     case RGB(0xFF, 0xFF, 0xFF): return "White";
    31.     case RGB(0xFF, 0x00, 0x00): return "Red";
    32.     case RGB(0x00, 0xFF, 0x00): return "Lime";
    33.     case RGB(0x00, 0x00, 0xFF): return "Blue";
    34.     case RGB(0xFF, 0xFF, 0x00): return "Yellow";
    35.     case RGB(0xFF, 0x00, 0xFF): return "Fuchsia";
    36.     case RGB(0x00, 0xFF, 0xFF): return "Aqua";
    37.     case RGB(192, 192, 192):    return "Silver";
    38.     case RGB(128, 128, 128):    return "Gray";
    39.     case RGB(128, 0, 0):        return "Maroon";
    40.     case RGB(128, 128, 0):      return "Olive";
    41.     case RGB(0, 128, 0):        return "Green";
    42.     case RGB(0, 128, 128):      return "Teal";
    43.     case RGB(0, 0, 128):        return "Navy";
    44.     }
    45.     return "";
    46. }
    47.  
    48. //------------------------------------------------------------------------
    49.  
    50. BOOL ColorSelector_OnMeasureItem(HWND hwndCombo, PMEASUREITEMSTRUCT pmis)
    51. {
    52.     HDC hdc = NULL;
    53.     HFONT hFont = NULL;
    54.     SIZE Size;
    55.    
    56.     if (pmis->CtlType == ODT_COMBOBOX)
    57.     {
    58.         hdc = GetDC(hwndCombo);
    59.         GetTextExtentPoint32(hdc, "A", 1, &Size);
    60.         ReleaseDC(hwndCombo, hdc);
    61.         pmis->itemHeight = Size.cy;
    62.         return TRUE;
    63.     }
    64.    
    65.     return FALSE;
    66. }
    67.  
    68. //------------------------------------------------------------------------
    69.  
    70. BOOL ColorSelector_OnDrawItem(HWND hwndCombo, PDRAWITEMSTRUCT pdis)
    71. {
    72.     HDC hdc = NULL;
    73.     HFONT hFont = NULL;
    74.     SIZE Size;
    75.     RECT rcIcon;
    76.     HPEN hOldPen = NULL;
    77.     HBRUSH hOldBrush = NULL;
    78.    
    79.     if (pdis->CtlType == ODT_COMBOBOX)
    80.     {
    81.         GetTextExtentPoint32(pdis->hDC, "A", 1, &Size);
    82.         rcIcon.left = pdis->rcItem.left;
    83.         rcIcon.top = pdis->rcItem.top + (pdis->rcItem.bottom - pdis->rcItem.top - Size.cy) / 2;
    84.         rcIcon.right = rcIcon.left + Size.cy;
    85.         rcIcon.bottom = rcIcon.top + Size.cy;
    86.        
    87.         FillRect(pdis->hDC, &pdis->rcItem, GetStockBrush(WHITE_BRUSH));
    88.        
    89.         hOldPen = SelectPen(pdis->hDC, CreatePen(0, 0, RGB(0,0,0)));
    90.         hOldBrush = SelectBrush(pdis->hDC, CreateSolidBrush((COLORREF)pdis->itemData));
    91.        
    92.         Rectangle(pdis->hDC, rcIcon.left, rcIcon.top, rcIcon.right, rcIcon.bottom);
    93.        
    94.         rcIcon.left = rcIcon.right + 2;
    95.         rcIcon.right = pdis->rcItem.right;
    96.         rcIcon.top = pdis->rcItem.top;
    97.         rcIcon.bottom = pdis->rcItem.bottom;
    98.         SetTextColor(pdis->hDC, RGB(0,0,0));
    99.         SetBkMode(pdis->hDC, TRANSPARENT);
    100.         DrawText(pdis->hDC, ColorSelector_GetColorName((COLORREF)pdis->itemData), -1, &rcIcon, DT_VCENTER|DT_SINGLELINE);
    101.        
    102.         if (pdis->itemState & ODS_FOCUS)
    103.             DrawFocusRect(pdis->hDC, &pdis->rcItem);
    104.        
    105.         DeletePen(SelectPen(pdis->hDC, hOldPen));
    106.         DeleteBrush(SelectBrush(pdis->hDC, hOldBrush));
    107.        
    108.         return TRUE;
    109.     }
    110.    
    111.     return FALSE;
    112. }
    113.  
    114. //------------------------------------------------------------------------
    115.  
    116. BOOL CALLBACK DlgProc(HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam)
    117. {
    118.     HWND hwndCtrl = NULL;
    119.  
    120.     switch(msg)
    121.     {
    122.     case WM_INITDIALOG:
    123.        
    124.         hwndCtrl = GetDlgItem(hdlg, IDC_TEXTCOLOR);
    125.         ColorSelector_Initialize(hwndCtrl);
    126.         ComboBox_SetCurSel(hwndCtrl, 0);
    127.  
    128.         break;
    129.  
    130.     case WM_MEASUREITEM:
    131.         {
    132.             PMEASUREITEMSTRUCT pmis = (PMEASUREITEMSTRUCT)lParam;
    133.             HWND hwndCtrl = NULL;
    134.            
    135.             if (pmis->CtlType == ODT_COMBOBOX && pmis->CtlID == IDC_TEXTCOLOR)
    136.             {
    137.                 hwndCtrl = GetDlgItem(hdlg, pmis->CtlID);
    138.                 return ColorSelector_OnMeasureItem(hwndCtrl, pmis);
    139.             }
    140.         }
    141.         return FALSE;
    142.  
    143.     case WM_DRAWITEM:
    144.         {
    145.             PDRAWITEMSTRUCT pdis = (PDRAWITEMSTRUCT)lParam;
    146.             HWND hwndCtrl = NULL;
    147.            
    148.             if (pdis->CtlType == ODT_COMBOBOX && pdis->CtlID == IDC_TEXTCOLOR)
    149.             {
    150.                 hwndCtrl = GetDlgItem(hdlg, pdis->CtlID);
    151.                 return ColorSelector_OnDrawItem(hwndCtrl, pdis);
    152.             }
    153.         }
    154.         return FALSE;
    155.  
    156.     default:
    157.         break;
    158.     }
    159.  
    160.     return FALSE;
    161. }
    [​IMG]
     
  3. RDMess

    RDMess Member

    Публикаций:
    0
    Регистрация:
    28 дек 2009
    Сообщения:
    51
    Хороший пример, спасибо.. но как выводить текст только в ComboBox-e [​IMG] а не и в выпадающем списке я так и не понял.
     
  4. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    Код (Text):
    1. typedef struct tagDRAWITEMSTRUCT {
    2.     UINT CtlType;
    3.     UINT CtlID;
    4.     UINT itemID;
    5.     UINT itemAction;
    6.     UINT itemState;
    7.     HWND hwndItem;
    8.     HDC hDC;
    9.     RECT rcItem;
    10.     ULONG_PTR itemData;
    11. } DRAWITEMSTRUCT;
    12. ...
    13. itemState
    14. 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.
    15. ...
    16. ODS_COMBOBOXEDIT
    17. The drawing takes place in the selection field (edit control) of an owner-drawn combo box.
     
  5. RDMess

    RDMess Member

    Публикаций:
    0
    Регистрация:
    28 дек 2009
    Сообщения:
    51
    Спасибо большое, Ты мне уже второй раз помогаешь и прямо в точку!))

    P.S. Ещё я с TEST-ом напутал. точнее с флагами которыми эта команда устанавливает(JE, JNE)