?? 讓我動吧dlg.cpp
字號:
// 讓我動吧Dlg.cpp : implementation file
/*********************************
[學VC編游戲]
編著、程序設計:唐明理 2004.7
E-mail: cqtml@163.com
**********************************/
#include "stdafx.h"
#include "讓我動吧.h"
#include "讓我動吧Dlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////
// 全局變量定義
/////////////////////////////////////////////
HBITMAP bit; //設備相關位圖 [2章]
HDC MemDC; //角色設備場景 [2章]
int w,h; //圖形尺寸 [2章]
CString dir; //定義路徑變量 [2章]
CString cc; //公用變量 [2章]
int p; //當前圖形序號 [2章]
char appdir[256]; //當前目錄 [3章]
CRect rect; //定義窗口尺寸變量 [3章]
int js; //角色[0男,1女] [3章]
int fw; //方位[0南1西南2西3西北4北5東北6東7東南][3章]
int m0; //動畫初值 [3章]
int m1; //動畫終值 [3章]
////////////////////////////////////////////
// 函數定義
////////////////////////////////////////////
BOOL getpic(CString cc,int p);//調圖片到相關位圖[3章]
BOOL loadbmp(CString cc); //調BMP圖片[2章]
/////////////////////////////////////////////////////////////////////////////
// CMyDlg dialog
CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/)//[MFC自動生成]
: CDialog(CMyDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CMyDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CMyDlg::DoDataExchange(CDataExchange* pDX)//[MFC自動生成]
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMyDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)//[MFC自動生成]
//{{AFX_MSG_MAP(CMyDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMyDlg message handlers
BOOL CMyDlg::OnInitDialog()//對話框程序的初始入口,[MFC自動產生]
{
CDialog::OnInitDialog();
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
//A、顯示說明信息
CString cc;
cc="\r\n 這是《學VC、編游戲》的第二個示例:\r\n\r\n";
cc+=" 在這一章我們使用了以下知識、技術\r\n\r\n";
cc+="1.介紹計算機動畫的基本知識和實現方法\r\n";
cc+="2.在VC++中建立時鐘消息,使用時鐘消息產生動畫。\r\n";
cc+="3.介紹動態地獲取圖形文件名。\r\n";
cc+="4.介紹在VC++中窗口、控件大小控制和定位的方法。\r\n";
cc+="5.程序運行時的目錄定位方法。\r\n\r\n";
cc+="重點:計算機動畫的原理和方法。";
SetDlgItemText(IDC_EDIT1,cc);
//B、窗口定位
MoveWindow(0,0,640,480); //窗口定位
CenterWindow(); //居中窗口
GetDlgItem(IDOK)->MoveWindow(640-60,0,55,18,TRUE);//2確定按鈕控件位置
//C、建立圖形環境
MemDC =CreateCompatibleDC(0); //創建設備場景
//D、設主角數據
js=0; //角色,0號人物
fw=0; //方位,0南
m0=js*400+fw*4; //初值,0號人物首
m1=(js+1)*400-1; //終值,1號人物首
p=m0; //當前圖形序號
//E、設置路徑
GetCurrentDirectory(256,appdir); //取當前目錄
dir=appdir;
if(dir.Right(8)=="運行程序")
dir="圖片/";
else
dir="../運行程序/圖片/"; //圖片路徑
//F、調入顯示背景
loadbmp(dir+"地面.BMP"); //調背景圖片
SelectObject(MemDC,bit); //調入位圖關聯到地圖設備場景
//G、在背景上顯示文字
SetTextColor(MemDC,RGB(255,255,255)); //設置地圖設備場景字色
SetBkMode(MemDC,TRANSPARENT); //字為透明方式
cc="嘿嘿!我可以動了!!走走、跑跑,世間真美好!!!"; //設文字內容
TextOut(MemDC,150,100,cc,lstrlen(cc)); //在MemDC顯示文字
SetTextColor(MemDC,RGB(255,255,255)); //設置地圖設備場景字色
cc="不對呀,弄個框框把我籠起? 放開我 !!!"; //
TextOut(MemDC,150,220,cc,lstrlen(cc)); //在MemDC顯示文字
cc="BMP圖片是矩形的,圖片的底色是白色。怎樣去掉這個框?";
TextOut(MemDC,151,250,cc,lstrlen(cc)); //在MemDC顯示文字
return TRUE; // return TRUE unless you set the focus to a control
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CMyDlg::OnPaint() //[MFC自動生成]
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
HCURSOR CMyDlg::OnQueryDragIcon()//[MFC自動生成]
{
return (HCURSOR) m_hIcon;
}
void CMyDlg::OnOK() //確定鍵,[類向導中定義生成]
{ GetDlgItem(IDC_EDIT1)->ShowWindow(SW_HIDE);//隱藏文本框
CClientDC dc(this);
GetWindowRect(rect); //2取當前窗口尺寸
BitBlt(dc.m_hDC,0,0,rect.Width(),rect.Height(),MemDC,0,0,SRCCOPY);//
//啟動時鐘
SetTimer(1,150,NULL); //設定時器150毫秒
}
void CMyDlg::OnCancel() //退出,[類向導中定義生成]
{//////////////////////////////////
DeleteDC(MemDC); //1刪除暫存設備場景
DeleteObject(bit); //1刪除暫存設備相關位圖
//////////////////////////////////
CDialog::OnCancel();
}
void CMyDlg::OnTimer(UINT nIDEvent) //時鐘函數,[類向導中定義生成]
{ CClientDC dc(this);
if(getpic("人",p)==FALSE)//調角色圖片
{AfxMessageBox(cc+"沒找到!");return;}
SelectObject(MemDC,bit);//設備相關位圖關聯到暫存設備場景
BitBlt(dc.m_hDC,200,160,w,h,MemDC,0,0,SRCCOPY); //顯示游戲角色
p++; //下一動作
if(p>m1) p=m0; //若動作完成
CDialog::OnTimer(nIDEvent);
}
//**************************************************
// getpic(CString cc,int p) 調圖片到相關位圖
// 由p得到將調的圖形文件名。
// 在指定目錄中調入圖形到相關位圖bit
//**************************************************
BOOL getpic(CString cc,int p)//調圖片到相關位圖[2章]
{ char name[256];
SetCurrentDirectory(appdir); //置當前目錄
sprintf(name,"%s%s/c%05d.bmp",dir,cc,p);//生成將調的圖形文件名
loadbmp(name); //調BMP圖片
return TRUE;
}
//**************************************************
// loadbmp(CString cc)//調BMP圖片
// 調cc指定的圖形;取得的圖形在設備相關位圖bit中
// 圖形的寬、高存于全局變量w,h中
//**************************************************
BOOL loadbmp(CString cc)//調BMP圖片
{ DeleteObject(bit); //刪除上次的位圖內存。
bit=(HBITMAP)LoadImage //調入cc指定的圖形
(AfxGetInstanceHandle(),//
cc, //文件名
IMAGE_BITMAP, //位圖方式
0, //圖形寬
0, //圖形高
LR_LOADFROMFILE|LR_CREATEDIBSECTION//方式
);
if(bit==NULL) return FALSE; //調圖失敗
DIBSECTION ds; //
BITMAPINFOHEADER &bm = ds.dsBmih; //
GetObject(bit,sizeof(ds),&ds); //取位圖的信息->bminfo
w = bm.biWidth; //得到位圖寬度值
h = bm.biHeight; //得到位圖高度值
return TRUE;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -