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 offset = 10;
0166:         int x = 120;
0167:         CDC *pCdc= this->GetDC();
0168:         this->GetClientRect(&r);
0169:         int h = r.bottom-r.top - 2*offset;
0170:         int w = r.right-r.left - offset - x;
0171:         if(h<0)h=0;
0172:         if(w<0)w=0;
0173:         if(h<w)w=h;else h=w;
0174:         char *pData = Render::GetDataPointer();
0175: 
0176:         for(int j=0;j<h;j++){
0177:         for(int i=0;i<w;i++){
0178:             int no = (j*Render::RENDER_HEIGHT/h)*Render::RENDER_WIDTH
0179:                     + i*Render::RENDER_WIDTH/w;
0180:             pCdc->SetPixel(i+x,j+offset,RGB(
0181:                 pData[4*no+0],
0182:                 pData[4*no+1],
0183:                 pData[4*no+2],
0184:             ));
0185:         }
0186:         }
0187:         ReleaseDC(pCdc);
0188:     }
0189: }
0190: 
0191: // システムは、ユーザーが最小化ウィンドウをドラッグしている間、
0192: // カーソルを表示するためにここを呼び出します。
0193: HCURSOR CMainDlg::OnQueryDragIcon()
0194: {
0195:     return (HCURSOR) m_hIcon;
0196: }
0197: 
0198: //メッセージの処理
0199: void PumpMessages()
0200: {
0201:     MSG msg;
0202:     while (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
0203:         ::TranslateMessage(&msg);
0204:         ::DispatchMessage (&msg);
0205:     }
0206: }
0207: 
0208: void CMainDlg::OnButtonRender() 
0209: {
0210:     bQuit = FALSE;
0211: 
0212:     // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
0213:     for(Render::Begin(); Render::Render(); this->OnPaint()){
0214:         for(int i=0; i<1000; i++) Render::Render();// 1回ずつだととても遅かった
0215:         // メッセージの処理
0216:         PumpMessages();
0217:         // 終了判定
0218:         if(bQuit) return;
0219:     }
0220:     this->OnPaint();
0221: }
0222: 
0223: // ---------------------------------------------------------------------------
0224: // OK ボタンを押したとき
0225: void CMainDlg::OnOK() 
0226: {
0227:     bQuit = TRUE;   // 終了フラグを立てる
0228:     
0229:     CDialog::OnOK();
0230: }
0231: 
0232: // ---------------------------------------------------------------------------
0233: // キャンセル ボタンを押したとき
0234: void CMainDlg::OnCancel() 
0235: {
0236:     bQuit = TRUE;   // 終了フラグを立てる
0237:     
0238:     CDialog::OnCancel();
0239: }
0240: 
0241: // ---------------------------------------------------------------------------
0242: // ウィンドウを閉じるとき
0243: void CMainDlg::OnClose() 
0244: {
0245:     bQuit = TRUE;   // 終了フラグを立てる
0246: 
0247:     CDialog::OnClose();
0248: }
0249: