// SampleProjectDialog.h
#pragma once
class CSampleProjectDialog :
public CAppStdDialogImpl<CSampleProjectDialog>,
public CUpdateUI<CSampleProjectDialog>,
public CMessageFilter, public CIdleHandler
{
public:
DECLARE_APP_DLG_CLASS(NULL, IDR_MAINFRAME, L"Software\\WTL")
enum { IDD = IDD_MAINDLG };
CScrollBar m_scroll_r; // [R]スクロールバー
CScrollBar m_scroll_g; // [G]スクロールバー
CScrollBar m_scroll_b; // [B]スクロールバー
CRect m_rect; // 色表示用矩形
virtual BOOL PreTranslateMessage(MSG* pMsg){
return CWindow::IsDialogMessage(pMsg);
}
virtual BOOL OnIdle(){
return FALSE;
}
BEGIN_UPDATE_UI_MAP(CSampleProjectDialog)
END_UPDATE_UI_MAP()
BEGIN_MSG_MAP(CSampleProjectDialog)
MSG_WM_PAINT(OnPaint)
MSG_WM_HSCROLL(OnHScroll)
MSG_WM_INITDIALOG(OnInitDialog)
MSG_WM_DESTROY(OnDestroy)
CHAIN_MSG_MAP(CUpdateUI<CSampleProjectDialog>)
CHAIN_MSG_MAP(CAppStdDialogImpl<CSampleProjectDialog>)
END_MSG_MAP()
void OnPaint(CDCHandle /*dc*/){
CPaintDC dc(m_hWnd);
CBrush brush;
brush.CreateSolidBrush(RGB(m_scroll_r.GetScrollPos(SB_CTL),
m_scroll_g.GetScrollPos(SB_CTL), m_scroll_b.GetScrollPos(SB_CTL)));
dc.FillRect(m_rect, brush);
}
void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar pScrollBar){
// 操作されたスクロールバーの現在位置を取得
int color = pScrollBar.GetScrollPos(SB_CTL);
switch(nSBCode){
case SB_PAGELEFT:
color -= 15;
case SB_LINELEFT:
color = max(0, color - 1);
break;
case SB_PAGERIGHT:
color += 15;
case SB_LINERIGHT:
color = min(255, color + 1);
break;
case SB_LEFT:
color = 0;
break;
case SB_RIGHT:
color = 255;
break;
case SB_THUMBPOSITION:
case SB_THUMBTRACK:
color = nPos;
break;
}
// 新しい位置に設定
pScrollBar.SetScrollPos(color);
// 色表示用矩形を更新
InvalidateRect(m_rect);
}
BOOL OnInitDialog(CWindow wndFocus, LPARAM lInitParam){
AtlCreateEmptyMenuBar(m_hWnd);
// コントロール設定
m_scroll_r = GetDlgItem(IDC_SCROLLBAR_R);
m_scroll_g = GetDlgItem(IDC_SCROLLBAR_G);
m_scroll_b = GetDlgItem(IDC_SCROLLBAR_B);
// スクロールバーの範囲設定
m_scroll_r.SetScrollRange(0, 255);
m_scroll_g.SetScrollRange(0, 255);
m_scroll_b.SetScrollRange(0, 255);
// スクロールバーの初期位置設定
m_scroll_r.SetScrollPos(0);
m_scroll_g.SetScrollPos(0);
m_scroll_b.SetScrollPos(0);
// 色表示用矩形を取得
CStatic view = GetDlgItem(IDC_STATIC_VIEW);
view.GetWindowRect(m_rect);
ScreenToClient(m_rect);
// メッセージループにメッセージフィルタとアイドルハンドラを追加
CMessageLoop* pLoop = _Module.GetMessageLoop();
pLoop->AddMessageFilter(this);
pLoop->AddIdleHandler(this);
SetMsgHandled(false);
return TRUE;
}
void OnDestroy(){
// メッセージループからメッセージフィルタとアイドルハンドラを削除
CMessageLoop* pLoop = _Module.GetMessageLoop();
pLoop->RemoveMessageFilter(this);
pLoop->RemoveIdleHandler(this);
}
};
|