CreatePen API and styles

We create pen GUI object by CreatePen() API. CreatePen(fnPenStyle, nWidth, crColor) takes three arguments.

  • fnPenStyle - pen style
  • nWidth - pen width
  • crColor - pen color

PEN styles

CreatePen() takes first argument as style of the pen. Below are the basic style definitions of pen object.

StyleDescription
PS_SOLIDPen is solid.
PS_DASHPen is dashed. This style is valid only when the pen width is one or less in device units.
PS_DOTPen is dotted. This style is valid only when the pen width is one or less in device units.
PS_DASHDOTPen has alternating dashes and dots. This style is valid only when the pen width is one or less in device units.
PS_DASHDOTDOTPen has alternating dashes and double dots. This style is valid only when the pen width is one or less in device units.
PS_NULLPen is invisible.
PS_INSIDEFRAMEPen is solid. When this pen is used in any graphics device interface (GDI) drawing function that takes a bounding rectangle, the dimensions of the figure are shrunk so that it fits entirely in the bounding rectangle, taking into account the width of the pen. This applies only to geometric pens.

CreatePen() PEN styles Demo

#include <windows.h>

LRESULT CALLBACK WndProc(HWND hWnd,
                         UINT message, 
                         WPARAM wParam,
                         LPARAM lParam);

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
  WNDCLASS wc;
  MSG msg;
  HWND hWnd;
  ZeroMemory(&amp;wc, sizeof(WNDCLASS));

  wc.style           = CS_HREDRAW | CS_VREDRAW;
  wc.lpfnWndProc     = (WNDPROC)WndProc;
  wc.hInstance       = hInstance;
  wc.hCursor         = LoadCursor(NULL, IDC_ARROW);
  wc.hbrBackground   = (HBRUSH)(COLOR_BACKGROUND);
  wc.lpszClassName   = (LPCTSTR)"MyPenDemo";


  RegisterClass(&wc);

   hWnd = CreateWindow("MyPenDemo", "MyPenDemo", WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

  ShowWindow(hWnd, nCmdShow);
  UpdateWindow(hWnd);
  while (GetMessage(&msg, NULL, 0, 0)) 
  {
    DispatchMessage(&msg);
  }
  return 0;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
  switch (message) 
  {
    case WM_DESTROY:
      PostQuitMessage(0);
      break;
    case WM_PAINT:
  {
      HDC hdc;
    HPEN hpen, old_hpen;
    HBRUSH hbrush, old_hbrush;
      LOGBRUSH logbrush;
      
      hdc = BeginPaint(hWnd, &ps);
      /* CreatePen (style, width, color) */
      hpen = CreatePen(PS_SOLID, 1, RGB(50,50,50));
      logbrush.lbColor = RGB(200,200,200);
      logbrush.lbStyle = BS_SOLID;
      logbrush.lbHatch = 0;
      hbrush = CreateBrushIndirect(&logbrush);
      old_hbrush = (HBRUSH) SelectObject(hdc, (HGDIOBJ)hbrush);
      old_hpen = (HPEN) SelectObject(hdc, (HGDIOBJ)hpen);
      Rectangle(hdc, 10, 10, 100, 100);
      SelectObject(hdc, (HGDIOBJ)old_hbrush);
      SelectObject(hdc, (HGDIOBJ)old_hpen);
      DeleteObject(hbrush);
      DeleteObject(hpen);
      EndPaint(hWnd, &ps);
      break;
  }
    default:
      return DefWindowProc(hWnd, message, wParam, lParam);
   }
   return 0;
}

PEN styles program output

CreatePen API demo shows PS_SOLID, PS_DASH, PS_DOT,PS_DASHDOT,PS_DASHDOTDOT,PS_NULL,PS_INSIDEFRAME styles

About our authors: Team EQA

Further readings

Where is WinMain() function in MFC application ?

MFC hides WinMain in its framework and includes source file on WinMain(). This explains how framework calls global CWinApp::Initinstance() from entry WinMain.

What is the utility of CWinApp class?

This is constructed during global C++ objects are constructed and is already available when Windows calls the WinMain function, which is supplied by the ...

Basic steps in Win32 GUI Application with source code.

Define a custom Window class structure, Register the class name, CreateWindow, Show windows and write message get and dispatch loop statements. Define the Window CallBack procedure and write the handlers.

What is a Window CallBack procedure and what is its utility?

DispatchMessage() is a API which indirectly triggers the Window CallBack procedure. Message structure members from this function are passed to the CallBack procedure. CallBack procedure should implement event handlers depending on the need of the application.

What are LPARAM and WPARAM in window proc function?

LPARAM and WPARAM are the two parameters in Window CallBack procedure. They signifies parameters of various events. They are used in handing individual events.

What are the basic steps of a typical MFC based application?

We need to write WinMain and need to follow all these in a Win32 application. However we need not to write much if we are writing an application with MFC ...

#