Hiding fields when creating node and showing them only when editing
This is certainly without a doubt a job for hook_form_alter() and quite easy to accomplish, eg, something along the lines of:

function YOURMODULE_form_alter(&amp;$form, &amp;$form_state, $form_id) {

  switch ($form_id) {

    case 'foo_node_form':

      if ($_GET['q']=='node/add/foo') {

        // we are creating a node of type foo so do stuff to the form one way here

      } else {

        // we are editing a node of type foo so do stuff to the form another way here

      }

      break;

   // other forms here

  }

}