0001: // mainDlg.cpp : インプリメンテーション ファイル
0002: //
0003: 
0004: #include "stdafx.h"
0005: #include <mmsystem.h>
0006: #include "main.h"
0007: #include "mainDlg.h"
0008: #include "render.h"
0009: 
0010: #ifdef _DEBUG
0011: #define new DEBUG_NEW
0012: #undef THIS_FILE
0013: static char THIS_FILE[] = __FILE__;
0014: #endif
0015: 
0016: /////////////////////////////////////////////////////////////////////////////
0017: // アプリケーションのバージョン情報で使われている CAboutDlg ダイアログ
0018: 
0019: class CAboutDlg : public CDialog
0020: {
0021: public:
0022:     CAboutDlg();
0023: 
0024: // ダイアログ データ
0025:     //{{AFX_DATA(CAboutDlg)
0026:     enum { IDD = IDD_ABOUTBOX };
0027:     //}}AFX_DATA
0028: 
0029:     // ClassWizard は仮想関数のオーバーライドを生成します
0030:     //{{AFX_VIRTUAL(CAboutDlg)
0031:     protected:
0032:     virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV のサポート
0033:     //}}AFX_VIRTUAL
0034: 
0035: // インプリメンテーション
0036: protected:
0037:     //{{AFX_MSG(CAboutDlg)
0038:     //}}AFX_MSG
0039:     DECLARE_MESSAGE_MAP()
0040: };
0041: 
0042: CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
0043: {
0044:     //{{AFX_DATA_INIT(CAboutDlg)
0045:     //}}AFX_DATA_INIT
0046: }
0047: 
0048: void CAboutDlg::DoDataExchange(CDataExchange* pDX)
0049: {
0050:     CDialog::DoDataExchange(pDX);
0051:     //{{AFX_DATA_MAP(CAboutDlg)
0052:     //}}AFX_DATA_MAP
0053: }
0054: 
0055: BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
0056:     //{{AFX_MSG_MAP(CAboutDlg)
0057:         // メッセージ ハンドラがありません。
0058:     //}}AFX_MSG_MAP
0059: END_MESSAGE_MAP()
0060: 
0061: /////////////////////////////////////////////////////////////////////////////
0062: // CMainDlg ダイアログ
0063: 
0064: CMainDlg::CMainDlg(CWnd* pParent /*=NULL*/)
0065:     : CDialog(CMainDlg::IDD, pParent)
0066: {
0067:     //{{AFX_DATA_INIT(CMainDlg)
0068:     //}}AFX_DATA_INIT
0069:     // メモ: LoadIcon は Win32 の DestroyIcon のサブシーケンスを要求しません。
0070:     m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
0071: }
0072: 
0073: void CMainDlg::DoDataExchange(CDataExchange* pDX)
0074: {
0075:     CDialog::DoDataExchange(pDX);
0076:     //{{AFX_DATA_MAP(CMainDlg)
0077:     //}}AFX_DATA_MAP
0078: }
0079: 
0080: BEGIN_MESSAGE_MAP(CMainDlg, CDialog)
0081:     //{{AFX_MSG_MAP(CMainDlg)
0082:     ON_WM_SYSCOMMAND()
0083:     ON_WM_PAINT()
0084:     ON_WM_QUERYDRAGICON()
0085:     ON_BN_CLICKED(IDC_BUTTON1, OnButtonRender)
0086:     ON_WM_CLOSE()
0087:     //}}AFX_MSG_MAP
0088: END_MESSAGE_MAP()
0089: 
0090: /////////////////////////////////////////////////////////////////////////////
0091: // CMainDlg メッセージ ハンドラ
0092: 
0093: BOOL CMainDlg::OnInitDialog()
0094: {
0095:     CDialog::OnInitDialog();
0096: 
0097:     // "バージョン情報..." メニュー項目をシステム メニューへ追加します。
0098: 
0099:     // IDM_ABOUTBOX はコマンド メニューの範囲でなければなりません。
0100:     ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
0101:     ASSERT(IDM_ABOUTBOX < 0xF000);
0102: 
0103:     CMenu* pSysMenu = GetSystemMenu(FALSE);
0104:     if (pSysMenu != NULL)
0105:     {
0106:         CString strAboutMenu;
0107:         strAboutMenu.LoadString(IDS_ABOUTBOX);
0108:         if (!strAboutMenu.IsEmpty())
0109:         {
0110:             pSysMenu->AppendMenu(MF_SEPARATOR);
0111:             pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
0112:         }
0113:     }
0114: 
0115:     // このダイアログ用のアイコンを設定します。フレームワークはアプリケーションのメイン
0116:     // ウィンドウがダイアログでない時は自動的に設定しません。
0117:     SetIcon(m_hIcon, TRUE);         // 大きいアイコンを設定
0118:     SetIcon(m_hIcon, FALSE);        // 小さいアイコンを設定
0119:     
0120:     // TODO: 特別な初期化を行う時はこの場所に追加してください。
0121:     
0122:     return TRUE;  // TRUE を返すとコントロールに設定したフォーカスは失われません。
0123: }
0124: 
0125: void CMainDlg::OnSysCommand(UINT nID, LPARAM lParam)
0126: {
0127:     if ((nID & 0xFFF0) == IDM_ABOUTBOX)
0128:     {
0129:         CAboutDlg dlgAbout;
0130:         dlgAbout.DoModal();
0131:     }
0132:     else
0133:     {
0134:         CDialog::OnSysCommand(nID, lParam);
0135:     }
0136: }
0137: 
0138: // もしダイアログボックスに最小化ボタンを追加するならば、アイコンを描画する
0139: // コードを以下に記述する必要があります。MFC アプリケーションは document/view
0140: // モデルを使っているので、この処理はフレームワークにより自動的に処理されます。
0141: 
0142: void CMainDlg::OnPaint() 
0143: {
0144:     if (IsIconic())
0145:     {
0146:         CPaintDC dc(this); // 描画用のデバイス コンテキスト
0147: 
0148:         SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
0149: 
0150:         // クライアントの矩形領域内の中央
0151:         int cxIcon = GetSystemMetrics(SM_CXICON);
0152:         int cyIcon = GetSystemMetrics(SM_CYICON);
0153:         CRect rect;
0154:         GetClientRect(&rect);
0155:         int x = (rect.Width() - cxIcon + 1) / 2;
0156:         int y = (rect.Height() - cyIcon + 1) / 2;
0157: 
0158:         // アイコンを描画します。
0159:         dc.DrawIcon(x, y, m_hIcon);
0160:     }
0161:     else
0162:     {
0163:         CDialog::OnPaint();
0164: 
0165:         RECT r;
0166:         int i,j;
0167:         int offset = 10;
0168:         int x = 100+20;
0169:         CDC *pCdc= this->GetDC();
0170:         this->GetClientRect(&r);
0171:         int h = r.bottom-r.top - 2*offset;
0172:         int w = r.right-r.left - offset - x;
0173:         if(h<0)h=0;
0174:         if(w<0)w=0;
0175:         if(ASPECT*(float)h<(float)w)w=(DWORD)(ASPECT*(float)h);else h=(DWORD)((float)w/ASPECT);
0176:         char *pData = Render::GetDataPointer();
0177: 
0178:         for(j=0;j<h;j++){
0179:         for(i=0;i<w;i++){
0180:             int no = (j*Render::RENDER_HEIGHT/h)*Render::RENDER_WIDTH
0181:                     + i*Render::RENDER_WIDTH/w;
0182:             pCdc->SetPixel(i+x,j+offset,RGB(
0183:                 pData[4*no+0],
0184:                 pData[4*no+1],
0185:                 pData[4*no+2]
0186:             ));
0187:         }
0188:         }
0189: 
0190:         ReleaseDC(pCdc);
0191:     }
0192: }
0193: 
0194: // システムは、ユーザーが最小化ウィンドウをドラッグしている間、
0195: // カーソルを表示するためにここを呼び出します。
0196: HCURSOR CMainDlg::OnQueryDragIcon()
0197: {
0198:     return (HCURSOR) m_hIcon;
0199: }
0200: 
0201: //メッセージの処理
0202: void PumpMessages()
0203: {
0204:     MSG msg;
0205:     while (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
0206:         ::TranslateMessage(&msg);
0207:         ::DispatchMessage (&msg);
0208:     }
0209: }
0210: 
0211: void CMainDlg::OnButtonRender() 
0212: {
0213:     bQuit = FALSE;
0214: 
0215:     timeBeginPeriod( 500 );// タイマー精度の設定
0216:     unsigned long t = timeGetTime();
0217: 
0218:     // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
0219:     for( ; !Render::Render(); )
0220:     {
0221:         // タイトル変更
0222:         char title[256];
0223:         sprintf(title, "%d回目", Render::GetRenderCount());
0224:         SetWindowText(title);
0225: 
0226:         // メッセージの処理
0227:         PumpMessages();
0228: 
0229:         // 終了判定
0230:         if(bQuit) return;
0231:         
0232:         // 1秒ごとに画面更新
0233:         unsigned long t_now = timeGetTime();
0234:         if(1000 < t_now - t )       // 1秒たったか
0235:         {
0236:             this->OnPaint();
0237:             t = t_now;
0238:         }
0239:     }
0240: 
0241:     timeEndPeriod( 500 );// タイマー精度を戻す
0242: 
0243:     this->OnPaint();
0244: }
0245: 
0246: // ---------------------------------------------------------------------------
0247: // OK ボタンを押したとき
0248: void CMainDlg::OnOK() 
0249: {
0250:     bQuit = TRUE;   // 終了フラグを立てる
0251:     
0252:     CDialog::OnOK();
0253: }
0254: 
0255: // ---------------------------------------------------------------------------
0256: // キャンセル ボタンを押したとき
0257: void CMainDlg::OnCancel() 
0258: {
0259:     bQuit = TRUE;   // 終了フラグを立てる
0260:     
0261:     CDialog::OnCancel();
0262: }
0263: 
0264: // ---------------------------------------------------------------------------
0265: // ウィンドウを閉じるとき
0266: void CMainDlg::OnClose() 
0267: {
0268:     bQuit = TRUE;   // 終了フラグを立てる
0269: 
0270:     CDialog::OnClose();
0271: }
0272: