Vertical Text Centering in an Edit Control

I have come across many posts asking about the ability to center text vertically in a simple, single-line edit control. Therefore, I decided to sit down and write a code that demonstrates how to achieve this. I have used a WM_NCCALCSIZE message to adjust the NC area.

Because a control in a dialog is subclassed, all messages needed to create a window and calculate window areas were already handled before subclassing occurs. To force the WM_NCCALCSIZE NC area, I decided to call SetWindowPos once, from the WM_CTLCOLOR reflection message handler (WM_CTLCOLOR_REFLECT) to establish new NC area dimensions.

WM_CTLCOLOR is received by the control after subclassing, before the control is visible. You can use any other message handler to call SetWindowPos; make sure it occurs before the control is shown. Of course, because the NC area has changed, I had to handle WM_NCPAINT to paint a new NC area that the edit control does not handle because it has no idea about its existence whatsoever.

For that, I have added two member variables of the CRect type that hold calculated bottom and top rectangles of the new NC area after calculating the client area height that is needed to accommodate the font. Computation of the new NC is handled in the WM_NCCALCSIZE handler. Because the control is not resized, this computation has to be performed once only. In WM_NCPAINT, I simply use rectangles to tell DC what to fill with a color of the default system brush, so be careful when changing background color.

To use this class:

  1. Copy the CVEdit header and implementation file to your project directory (or central repository of your custom classes).
  2. Include both files in a project. Delete the .clw file and invoke a class wizard to re-create it.
  3. In the dialog containing the edit control, use the wizard to subclass the control (add member variable). Make sure you choose the control type and CVEdit class from the combo.

THIS CODE IS DESIGNED TO WORK WITH A SINGLE-LINE EDIT CONTROL. It just illustrates how to use WM_NCCALCSIZE to adjust the vertical margins of the edit control. Modify it to your needs.



About the Author

John Z. Czopowik VC++ MVP

Microsoft VC++ MVP

Downloads

Comments

  • One minor suggestion.

    Posted by DennisWoo on 10/30/2004 11:02am

    Hi John, I have made a small change to the code to handle brush color when the edit control is in "Read only" mode. Here is the line modified in the CVEdit::OnNcPaint() function: CBrush Brush = (this->GetStyle() & ES_READONLY) == ES_READONLY ? GetSysColor(COLOR_BTNFACE) : GetSysColor(COLOR_WINDOW) ;

    • Re: One minor suggestion.

      Posted by JohnCz on 10/30/2004 11:25am

      I think this is very good suggestion. Again: This article (as I have indicated) is dedicated only to showing how vertically center text in a single edit control. It was intended only for that purpose, not for developing a class for new control. This small project is open for any suggestions/addition to make it such if needed.

      Reply
    Reply
Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • With 81% of employees using their phones at work, companies have stopped asking: "Is corporate data leaking from personal devices?" and started asking: "How do we effectively prevent corporate data from leaking from personal devices?" The answer has not been simple. ZixOne raises the bar on BYOD security by not allowing email data to reside on the device. In addition, Zix allows employees to maintain complete control of their personal device, therefore satisfying privacy demands of valued employees and the …

  • Managing your company's financials is the backbone of your business and is vital to the long-term health and viability of your company. To continue applying the necessary financial rigor to support rapid growth, the accounting department needs the right tools to most efficiently do their job. Read this white paper to understand the 10 essentials of a complete financial management system and how the right solution can help you keep up with the rapidly changing business world.

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds