When to use OnDrawItem, DrawItem and OnPaint?
Note: This post assumes that owner draw flag for controls is set.
OnDrawItem is mainly provided to facilitate owner drawing child controls in a parent window class without sub classing them. An e.g. can be a tab/button/listbox/combobox/menu control, we can ownerdraw these without sub classing using this function. Note that OnDrawItem is called as result of the event WM_DRAWITEM which is sent to the owner window of an owner-drawn button, combo box, list box, or menu when a visual aspect of the button, combo box, list box, or menu has changed.
Signature of OnDrawItem is as follows, nIDCtl points to the ID of the controls that’s meant to owner drawn. So here you will get the id of your tab control in nIDCtl and you can owner draw it here.
afx_msg void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct);
There is another option, that’s by sub classing and overriding DrawItem virtual function. Note that DrawItem get’s called by OnDrawItem.
Stack trace to DrawItem virtual member function is as follows…
CListBoxEx::DrawItem(tagDRAWITEMSTRUCT * 0x0012f6d4) line 20 CListBox::OnChildNotify(unsigned int 43, unsigned int 1000, long 1242836, long * 0x00000000) line 125 CWnd::SendChildNotifyLastMsg(long * 0x00000000) line 2683 CWnd::ReflectLastMsg(HWND__ * 0x0004089a, long * 0x00000000) line 2721 CWnd::OnDrawItem(int 1000, tagDRAWITEMSTRUCT * 0x0012f6d4) line 1156 + 14 bytes CLearnDrawingDlg::OnDrawItem(int 1000, tagDRAWITEMSTRUCT * 0x0012f6d4) line 46 CWnd::OnWndMsg(unsigned int 43, unsigned int 1000, long 1242836, long * 0x0012f4f0) line 1930
DrawItem messages makes things easier for developers, we get OD flags that tells which action requires painting.
We just have to do the painting stuff.
But if we are going via OnPaint then we are on our own, we’ve got to find out when an item is selected, when it’s in focus, when it’s disabled based on every paint event that we get. Maybe even scrolling too. So that’s for the tough guys. 😉
So basically for quick and easy painting things we go via OnDrawItem, or DrawItem else for full control use OnPaint.
Quickest way to owner draw would be to use OnDrawItem.