text: namespace phoenix {
  
  Size pLabel::minimumSize() {
    Size size = pFont::size(hfont, label.state.text);
    return {size.width, size.height};
  }
  
  void pLabel::setText(string text) {
    SetWindowText(hwnd, utf16_t(text));
    InvalidateRect(hwnd, 0, false);
  }
  
  void pLabel::constructor() {
    hwnd = CreateWindow(L"phoenix_label", L"",
      WS_CHILD,
      0, 0, 0, 0, parentHwnd, (HMENU)id, GetModuleHandle(0), 0);
    SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)&label);
    setDefaultFont();
    setText(label.state.text);
    synchronize();
  }
  
  void pLabel::destructor() {
    DestroyWindow(hwnd);
  }
  
  void pLabel::orphan() {
    destructor();
    constructor();
  }
  
  static LRESULT CALLBACK Label_windowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {
    HWND parentHwnd = GetParent(hwnd);
    Label* label = (Label*)GetWindowLongPtr(hwnd, GWLP_USERDATA);
    if(label == nullptr) return DefWindowProc(hwnd, msg, wparam, lparam);
    Window* window = (Window*)label->Sizable::state.window;
    if(window == nullptr) return DefWindowProc(hwnd, msg, wparam, lparam);
  
    switch(msg) {
    case WM_GETDLGCODE: return DLGC_STATIC | DLGC_WANTCHARS;
    case WM_ERASEBKGND: return TRUE;
    case WM_PAINT: {
      PAINTSTRUCT ps;
      BeginPaint(hwnd, &ps);
      RECT rc;
      GetClientRect(hwnd, &rc);
      DrawThemeParentBackground(hwnd, ps.hdc, &rc);
      SetBkMode(ps.hdc, TRANSPARENT);
      SelectObject(ps.hdc, ((Widget*)label)->p.hfont);
      unsigned length = GetWindowTextLength(hwnd);
      wchar_t text[length + 1];
      GetWindowText(hwnd, text, length + 1);
      text[length] = 0;
      DrawText(ps.hdc, text, -1, &rc, DT_CALCRECT | DT_END_ELLIPSIS);
      unsigned height = rc.bottom;
      GetClientRect(hwnd, &rc);
      rc.top = (rc.bottom - height) / 2;
      rc.bottom = rc.top + height;
      DrawText(ps.hdc, text, -1, &rc, DT_LEFT | DT_END_ELLIPSIS);
      EndPaint(hwnd, &ps);
      return FALSE;
    }
    }
  
    return DefWindowProc(hwnd, msg, wparam, lparam);
  }
  
  }
  