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