Подскажите как отрисовать обычный контрол через WM_DRAWITEM... Допустим создал контрол через CreateWindow, получил его HWND... А что нужно сделать в WM_DRAWITEM (нужен код)? Код (Text): case WM_DRAWITEM: lpdis = (LPDRAWITEMSTRUCT) lParam; hMemDC = CreateCompatibleDC (lpdis->hDC); BitBlt (lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top, lpdis->rcItem.right - lpdis->rcItem.left, lpdis->rcItem.bottom - lpdis->rcItem.top, hMemDC, 0, 0, SRCCOPY); return TRUE; подскажите что не так?
Ну, во-первых, нужно сам контрол создать с флагом WS_OWNERDRAW, иначе он воще не будет посылать своему родителю такие сообщения. А вот что делать внутри - это целиком на ваше усмотрение. Напр, вот функция из моего проекта для отрисовки собственных, "тонких" кнопок (т.е. с границей в 1 пиксель). Код (Text): RepaintBtn proc dis:DWORD, b:HBRUSH, f:HFONT, clr:DWORD; PUSHAD; MOV EDI, dis; MOV ESI, EDI; ADD ESI, 28; <---- Offset of RECT structure MOV EBX, BDR_SUNKENOUTER; CMP DWORD PTR [EDI+16], 11h; JE @mbso; ADD EBX, EBX; @mbso: PUSH BF_RECT; PUSH EBX; PUSH ESI; MOV EBX, DWORD PTR [EDI+24]; PUSH EBX; invoke FillRect, EBX, ESI, b; CALL DrawEdge; CMP DWORD PTR [EDI+16], 11h; JNE @neOR; invoke OffsetRect, ESI, 1, 1; invoke SetTextColor, EBX, clr; @neOR: MOV EDI, DWORD PTR [EDI+20]; invoke SetBkMode, EBX, TRANSPARENT; invoke SelectObject, EBX, f; PUSH EAX; invoke GetWindowTextLength, EDI; PUSH DT_SINGLELINE or DT_CENTER or DT_VCENTER; PUSH ESI; PUSH EAX; PUSH OFFSET tmp; PUSH EBX; ADD EAX, 1; invoke GetWindowText, EDI, ADDR tmp, EAX; CALL DrawText; PUSH EDI; CALL SelectObject; POPAD; RET; RepaintBtn endp; dis - указатель на DRAWITEMSTRUCT (обычно передаётся через LParam), b - кисть для отрисовки задника, f - шрифт, с помощью к-рого рисуем текст, clr - цвет шрифта нажатой кнопки. Пользоваться этой процедурой предельно просто: её просто нужно вызвать в обработчике WM_DRAWITEM с нужными парамами.