webparts can be done as you described, for ascx is easier for the design team to ammend. I prefer not the ascx and belive css should be sufficent.
the webparts that i prefer are located here:
it outlines the recommended way to produce it (best practice). I would also have a base class that you can inherit the webpart from. In the base class you can add the webpart settings and pass the values to the inherited webpart.
for visual webpart I would only think that its easier for the designer perspective to edit the ascx without the need to change code. I would guess its more of an OOD/OOP method.
there are limmitiations to visual webpart as outlined here:
Visual web parts don't support replaceable parameters. For more
information, see Replaceable Parameters.
User controls or visual web parts can't be dragged and dropped or
copied onto visual web parts. This action causes a build error.
Visual web parts don't directly support SharePoint server tokens such
as $SPUrl. For more information, see "Token Restrictions in Sandboxed
Visual Web Parts" in the topic Troubleshooting SharePoint Solutions.
Visual web parts in a sandboxed solution occasionally get the error,
"The sandboxed code execution request was refused because the
Sandboxed Code Host Service was too busy to handle the request." For
more information about this error, see this post in the SharePoint
Developer Team Blog.
debugging isn't supported for breakpoints added to the markup. To
Debugging of inline ASP.NET code must be done in the generated code
file instead of in the markup file.
Visual web parts don't support the use of the <@ Assembly Src=
SharePoint web controls and some ASP.NET controls aren't supported in
the SharePoint sandboxed environment. If unsupported controls are used
on a visual web part in a sandboxed solution, the error, "The type or
namespace name 'Theme' does not exist in the namespace
like so in code:
ScriptManager.RegisterClientScriptBlock(this, typeof(Page), "test", "alert('helloWorld');");
If you want to show hide a custom message box the is tied to the page then you just need to load panel during pageload or createchildcontrols and set visibility to false, have everything in panel that you want to display as a message. Register a clickevent on whatever it is and that would set the panel to visible, you can change the css to make it more appealing ;).
hope it helps :)