Tuesday, March 22, 2016

Feedback on “Design of Everyday Things” by D.Norman

Some time ago we’ve discussed general GUI improvements which might greatly improve usability in some lucky release. We’ve even investigated Adobe and other software, for comparing reasons.

From reading “Design of Everyday Things” I’ve learned that in development process, and even in GUI improvement, we miss user feedback.
Example 1
A company was selling car of one model, while having already developed second model. Car #1 has got recognition from automobile community, got prizes on car show. But they didn’t get feedback from customers. Car #2 has adopted some issues from car #1. Design #2 didn’t react any negative feedback from car #1.

We have the same, while developing release #4, we put release #3 GUI errors to backlog. We even don’t have anything special for usability, and users don’t file DRs, since usability issues are not errors. But some issues are very urgent, and easy to fix. If we had official usability channel for handling GUI issues which are easy to fix (alternative to DR bug tracking), we might better keep/satisfy some customers.

I adore AE's work of features,  predicting future needs, so that we have good future. But when relating only on application engineers (not customer feedback), all GUI related things will go to backlog, while 1/5 of GUI things are urgent for customer and are very easy to fix.

ON_NOTIFY vs. OnNotify

It is not always easy to catch WM_NOTIFY send from control to its parent window. 

In this case they want to notify parent CFileView from control CViewTree with WM_NOTIFY TVN_SELCHANGED message. And here message map just doesn't work:

ON_NOTIFY(TVN_SELCHANGED, 4, OnItemsSelChanged)

They should do it in virtual OnNotify function, not using message map. If OnNotify doesn't met correct handler, message would go to parent CMainFrame, and there you can use message map.

BOOL CFileView::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
   if (nmHdr->idFrom != 4)
      return CDockablePane::OnNotify(wParam, lParam, pResult);
   if (nmHdr->code == TVN_SELCHANGED)
   {
      OnItemsSelChanged((NMHDR*)lParam, pResult);
      return TRUE;
   }
   return FALSE;
}