// MainWindow.h
#pragma once
class CMainWindow : public CWindowImpl<CMainWindow>,
public CMessageFilter, public CIdleHandler
{
public:
DECLARE_WND_CLASS(_T("SampleProject"));
CBitmap m_bitmap;
virtual BOOL PreTranslateMessage(MSG* pMsg){
return FALSE;
}
virtual BOOL OnIdle(){
return FALSE;
}
BEGIN_MSG_MAP(CMainWindow)
MSG_WM_PAINT(OnPaint)
MSG_WM_ACTIVATE(OnActivate)
MSG_WM_SETTINGCHANGE(OnSettingChange)
MSG_WM_CREATE(OnCreate)
MSG_WM_DESTROY(OnDestroy)
END_MSG_MAP()
void OnPaint(CDCHandle /*dc*/){
CPaintDC dc(m_hWnd);
if(!m_bitmap.IsNull()){
// メモリデバイスコンテキストを作成し、ビットマップを選択
CDC dcMem;
dcMem.CreateCompatibleDC(dc);
HBITMAP hOldBitmap = dcMem.SelectBitmap(m_bitmap);
// クライアント矩形と画像矩形を取得し、中央に画像を表示
CRect rect;
GetClientRect(rect);
CSize size;
m_bitmap.GetSize(size);
int nX = rect.Width() / 2 - size.cx / 2;
int nY = rect.Height() / 2 - size.cy / 2;
dc.BitBlt(nX, nY, size.cx, size.cy, dcMem, 0, 0, SRCCOPY);
// 元のビットマップを選択
dcMem.SelectBitmap(hOldBitmap);
}
}
void OnActivate(UINT nState, BOOL bMinimized, CWindow wndOther){
SHFullScreen(m_hWnd, SHFS_HIDESIPBUTTON);
}
void OnSettingChange(UINT uFlags, LPCTSTR lpszSection){
SHFullScreen(m_hWnd, SHFS_HIDESIPBUTTON);
}
int OnCreate(LPCREATESTRUCT lpCreateStruct){
// ビットマップファイル読み込み
TCHAR szImage[_MAX_PATH];
::GetModuleFileName(NULL, szImage, sizeof(szImage) / sizeof(TCHAR));
::StringCbCopy(::_tcsrchr(szImage, _T('\\')) + 1,
sizeof(szImage), _T("sample.bmp"));
m_bitmap = ::SHLoadImageFile(szImage);
// メッセージループにメッセージフィルタとアイドルハンドラを追加
CMessageLoop* pLoop = _Module.GetMessageLoop();
pLoop->AddMessageFilter(this);
pLoop->AddIdleHandler(this);
return 0;
}
void OnDestroy(){
// メッセージループからメッセージフィルタとアイドルハンドラを削除
CMessageLoop* pLoop = _Module.GetMessageLoop();
pLoop->RemoveMessageFilter(this);
pLoop->RemoveIdleHandler(this);
PostQuitMessage(0);
}
};
|