Отрисовать обычный контрол через WM_DRAWITEM

Тема в разделе "WASM.BEGINNERS", создана пользователем glukker, 16 июл 2008.

  1. glukker

    glukker New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2008
    Сообщения:
    72
    Подскажите как отрисовать обычный контрол через WM_DRAWITEM...
    Допустим создал контрол через CreateWindow, получил его HWND...
    А что нужно сделать в WM_DRAWITEM (нужен код)?
    Код (Text):
    1.         case WM_DRAWITEM:
    2.             lpdis = (LPDRAWITEMSTRUCT) lParam;
    3.             hMemDC = CreateCompatibleDC (lpdis->hDC);
    4.            
    5.             BitBlt (lpdis->hDC,
    6.                     lpdis->rcItem.left,
    7.                     lpdis->rcItem.top,
    8.                     lpdis->rcItem.right - lpdis->rcItem.left,
    9.                     lpdis->rcItem.bottom - lpdis->rcItem.top,
    10.                     hMemDC,
    11.                     0,
    12.                     0,
    13.                     SRCCOPY);
    14.  
    15.         return TRUE;
    подскажите что не так?
     
  2. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    Ну, во-первых, нужно сам контрол создать с флагом WS_OWNERDRAW, иначе он воще не будет посылать своему родителю такие сообщения. А вот что делать внутри - это целиком на ваше усмотрение.

    Напр, вот функция из моего проекта для отрисовки собственных, "тонких" кнопок (т.е. с границей в 1 пиксель).

    Код (Text):
    1.   RepaintBtn proc dis:DWORD, b:HBRUSH, f:HFONT, clr:DWORD;
    2.     PUSHAD;
    3.     MOV EDI, dis;
    4.     MOV ESI, EDI;
    5.     ADD ESI, 28; <---- Offset of RECT structure
    6.     MOV EBX, BDR_SUNKENOUTER;
    7.  
    8.     CMP DWORD PTR [EDI+16], 11h;
    9.     JE @mbso;
    10.     ADD EBX, EBX;
    11.     @mbso:
    12.  
    13.     PUSH BF_RECT;
    14.     PUSH EBX;
    15.     PUSH ESI;
    16.     MOV EBX, DWORD PTR [EDI+24];
    17.     PUSH EBX;
    18.  
    19.     invoke FillRect, EBX, ESI, b;
    20.     CALL DrawEdge;
    21.     CMP DWORD PTR [EDI+16], 11h;
    22.     JNE @neOR;
    23.     invoke OffsetRect, ESI, 1, 1;
    24.     invoke SetTextColor, EBX, clr;
    25.     @neOR:
    26.  
    27.     MOV EDI, DWORD PTR [EDI+20];
    28.     invoke SetBkMode, EBX, TRANSPARENT;
    29.     invoke SelectObject, EBX, f;
    30.     PUSH EAX;
    31.     invoke GetWindowTextLength, EDI;
    32.     PUSH DT_SINGLELINE or DT_CENTER or DT_VCENTER;
    33.     PUSH ESI;
    34.     PUSH EAX;
    35.     PUSH OFFSET tmp;
    36.     PUSH EBX;
    37.     ADD EAX, 1;
    38.     invoke GetWindowText, EDI, ADDR tmp, EAX;
    39.  
    40.     CALL DrawText;
    41.     PUSH EDI;
    42.     CALL SelectObject;
    43.  
    44.     POPAD;
    45.     RET;
    46.   RepaintBtn endp;
    dis - указатель на DRAWITEMSTRUCT (обычно передаётся через LParam), b - кисть для отрисовки задника, f - шрифт, с помощью к-рого рисуем текст, clr - цвет шрифта нажатой кнопки.

    Пользоваться этой процедурой предельно просто: её просто нужно вызвать в обработчике WM_DRAWITEM с нужными парамами.