MFC的程式怎么在訊息環中添加代碼實作功能?要做一個游戲在訊息回圈中實作讓場景移動。
uj5u.com熱心網友回復:
僅供參考:// OpenGL的程式框架.cpp : Defines the entry point for the application.
// 學程式編游戲系列叢書
// 唐明理 E_mail: [email protected]
//====================================================================
#include "stdafx.h"
#include "OpenGL.h"
//////////////////////////////////////////////////////////
OpenGL* m_OpenGL;
HDC hDC; // GDI設備句柄,將視窗連接到 GDI( 圖形設備介面)
HGLRC hRC=NULL; // 渲染描述句柄,將OpenGL呼叫連接到設備描述表
HWND hWnd=NULL; // 保存 Windows 分配給程式的視窗句柄
int Width = 800;// 視窗寬
int Height= 600;// 視窗高
int bits = 16; // 顏色深度
void GameLoop()
{ MSG msg;
BOOL fMessage;
PeekMessage(&msg, NULL, 0U, 0U, PM_NOREMOVE);
while(msg.message != WM_QUIT) // 訊息回圈
{ fMessage = PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE);
if(fMessage) //有訊息
{ TranslateMessage(&msg);
DispatchMessage(&msg);
}
else m_OpenGL->Render(); //無訊息
}
}
LRESULT WINAPI MsgProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam )// 訊息處理
{ switch(message)
{ case WM_CREATE: // 建立視窗
hDC = GetDC(hWnd); // 獲取當前視窗的設備句柄
m_OpenGL->SetupPixelFormat(hDC);// 呼叫顯示模式安裝功能
return 0; break;
case WM_CLOSE: // 關閉視窗
m_OpenGL->CleanUp(); // 結束處理
PostQuitMessage(0);
return 0; break;
case WM_SIZE: // 視窗尺寸變化
Height = HIWORD(lParam); // 視窗的高
Width = LOWORD(lParam); // 視窗的寬
if (Height==0) Height=1; // 防止被0 除
m_OpenGL->init(Width,Height);
return 0; break;
case WM_DESTROY: // 退出訊息
PostQuitMessage(0);
return 0; break;
case WM_KEYUP: // 按ESC退出,全屏模式必需要加入的退出方式。
switch (wParam)
{ case VK_ESCAPE:
m_OpenGL->CleanUp(); // 結束處理
PostQuitMessage(0);
return 0;break;
}
default: break;
}
return (DefWindowProc(hWnd, message, wParam, lParam));
}
INT WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,INT )// WinMain程式入口
{ // 注冊視窗類
bool fullScreen =TRUE;
DWORD dwExStyle; // Window 擴展風格
DWORD dwStyle; // Window 視窗風格
RECT windowRect; // 視窗尺寸
int nX=0,nY=0;
dwExStyle=WS_EX_APPWINDOW|WS_EX_WINDOWEDGE; // 使視窗具有3D外觀
dwStyle=WS_OVERLAPPEDWINDOW; // 使用標準視窗
//WS_OVERLAPPEDWINDOW是有標題欄,視窗選單,最大、小化按鈕和可調整尺寸的視窗
int wid=GetSystemMetrics(SM_CXSCREEN); // 獲取當前螢屏寬
int hei=GetSystemMetrics(SM_CYSCREEN); // 獲取當前螢屏高
nX=(wid-Width)/2;nY=(hei-Height)/2; // 計算視窗居中用
//-------------------------------------------------------------------
AdjustWindowRectEx(&windowRect,dwStyle,FALSE,dwExStyle);
//根據視窗風格來調整視窗尺寸達到要求的大小
char cc[]="tml";
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
cc, NULL };
RegisterClassEx( &wc );
m_OpenGL=new OpenGL();//
hWnd = CreateWindowEx(NULL,cc,"學OpenGL編3D游戲 [ 1.OpenGL的程式框架 ])",
dwStyle|WS_CLIPCHILDREN|WS_CLIPSIBLINGS,
nX, nY,Width, Height,
NULL,NULL,hInst,NULL); // 創建視窗
ShowWindow( hWnd, SW_SHOWDEFAULT ); // 顯示視窗
UpdateWindow( hWnd ); // 重繪視窗
GameLoop(); // 進入訊息回圈
return 0;
}
uj5u.com熱心網友回復:
參考http://blog.sina.com.cn/s/blog_a2aa00d70101im9b.htmluj5u.com熱心網友回復:
非常感謝,雖然現在已經不搞mfc了uj5u.com熱心網友回復:
WM_TIMER+OnTimer ??uj5u.com熱心網友回復:
創建定時器,在WM_TIMER事件中(或者使用回呼函式中)修改引數場景引數,呼叫Invalidate()函式
在WM_PAINT中,根據場景引數繪畫場景
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/72223.html
標籤:基礎類
