Dec 15, 2005

ちょっと気が利くアドオンクラス、CCenterredWindow

ポスト @ 13:13:28 | プログラミング,ATL/WTL

ATL::CWindow クラスの CenterWindow(parent) は、parent に自分の親ウィンドウを指定しても、その親ウィンドウではなくオーナーウィンドウの位置に対してセンタリングを行います。
でもそうすると、ActiveXコントロールでの表示などでちと妙なことになりかねません。
ではCenterWindow()を使わずに、WM_CREATEまたはWM_INITDIALOGにて自前でセンタリングすればよいかといえば、その時点で既にポップアップウィンドウの親はオーナーウィンドウにすり替えられてしまっているのでムリです。
↓のアドオンクラスを使えば、そんな時に所与の目的を達成できます。

template class CCenterredWindow
{
private:
  CPoint center;
public:
  void DoCenterring(BOOL bRedraw = TRUE)
  {
    CRect rect;
    static_cast(this)->GetWindowRect(rect);
    rect.MoveToXY(center.x - rect.Width() / 2, center.y - rect.Height() / 2);
    static_cast(this)->MoveWindow(rect, bRedraw);
  }
protected:
  void InitCenterring(HWND parent)
  {
    CRect rect;
    ::GetWindowRect(parent, rect);
    center = rect.CenterPoint();
  }
};

使用例は以下のとおり。

class CHogeDialog : public CDialogImpl, public CCenterredWindow
{
   :
  LRESULT OnInitDialog(HWND, LPARAM)
  {
     :
    DoCenterring();
    return 1;
  }
  INT_PTR DoModal(HWND parent = ::GetActiveWindow())
  {
    InitCenterring(parent);
    return CDialogImpl::DoModal(parent);
  }
};

Trackback

No Trackbacks

Track from Your Website

http://blog.izumichan.com/trackback/tb.php?id=120

Comment

No Comments

Post Your Comment


*は入力必須です。E-Mailは公開されません。