游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1980|回复: 0

版主,你的书我有不明白的地方,帮我看看。

[复制链接]

10

主题

54

帖子

54

积分

注册会员

Rank: 2

积分
54
发表于 2004-12-4 12:39:00 | 显示全部楼层 |阅读模式
//-------------------------------源文件----------------------------------------------------------------


// 别给我框框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;
HDC                MemDC;
HDC                DCBak;
int                w,h;
CString dir;
CString cc;       
char        appdir[256];
CRect        rect;       
int                js;       
int                fw;       
int                m0;       
int                m1;       
int                p;       

BOOL getpic(CString cc,int p);
BOOL loadbmp(CString cc);
void TransparentBlt2( HDC hdc0,       
                                        int nX0,int nY0,
                                        int nW0,int nH0,
                                        HDC hdc1,
                                        int nX1,int nY1,
                                        int nW1,int nH1,
                                        UINT Tcol
                                        );
/////////////////////////////////////////////////////////////////////////////
// CMyDlg dialog

CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/)
        : 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:oDataExchange(CDataExchange* pDX)
{
        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)
        //{{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()
{
        CDialog::OnInitDialog();

        SetIcon(m_hIcon, TRUE);                        // Set big icon
        SetIcon(m_hIcon, FALSE);                // Set small icon
       
        // TODO: Add extra initialization here
        cc="\r\n    这是《学VC、编游戏》的第三个示例:\r\n\r\n";
        cc+="    在这一章我们使用了以下知识、技术\r\n\r\n";
        cc+="1、 逻辑与运算 0*0=0;0*1=0;1*0=0;1*1=1。 \r\n";
        cc+="    见0为0; 全1为1。0乘任何数都是0,1乘任何数都不变。\r\n";
        cc+="2、 逻辑或运算 0+0=0;0+1=1;1+0=1;1+1=1。 \r\n";
        cc+="    见1为1; 全0为0。0加任何数都不变,1加任何数都是1。\r\n";
        cc+="3、 学习利用位图拷贝BitBlt()的逻辑运算生成透明位图的方法。\r\n";
        cc+="4、 介绍刷屏和一个最简单的刷屏方法。\r\n";
        cc+="5、 介绍了VC的编译模式的设置方法。\r\n\r\n";
        cc+="重点:透明位图的原理和生成方法。\r\n\r\n";
        cc+="编著、程序设计:唐明理 2004.7\r\n";
        cc+="E-mail:  cqtml@163.com\r\n";
        SetDlgItemText(IDC_EDIT1,cc);

        MoveWindow(0,0,640,480);
        CenterWindow();
        GetDlgItem(IDOK)->MoveWindow(640-60,0,55,18,TRUE);

        MemDC =CreateCompatibleDC(0);
        DCBak =CreateCompatibleDC(0);

        js=0;       
        fw=0;       
        m0=js*400+fw*4;       
        m1=(js+1)*400-1;
        p=m0;

        GetCurrentDirectory(256,appdir);
        dir=appdir;
        if(dir.Right(8)=="运行程序")
                        dir="图片/";
        else       
                dir="../运行程序/图片/";

        loadbmp(dir+"地面.BMP");
        SelectObject(DCBak,bit);

        SetBkMode(DCBak,TRANSPARENT);       
        SetTextColor(DCBak,RGB(255,255,255));
        cc="这才对嘛,把我捆起梆起做啥。";
        TextOut(DCBak,150,260,cc,lstrlen(cc));
        cc="对象的显示采用了透明显示方法,对象和底图自然地融合在一起了";
        TextOut(DCBak,50,300,cc,lstrlen(cc));
        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()
{
        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()
{
        return (HCURSOR) m_hIcon;
}

void CMyDlg::OnOK()
{        GetDlgItem(IDC_EDIT1)->ShowWindow(SW_HIDE);
        CClientDC dc(this);       
        GetWindowRect(rect);
        BitBlt(dc.m_hDC,0,0,rect.Width(),rect.Height(),DCBak,0,0,SRCCOPY);
        SetTimer(1,150,NULL);       
}

void CMyDlg::OnCancel()
{        DeleteDC(MemDC);
        DeleteObject(bit);
        DeleteDC(DCBak);
        CDialog::OnCancel();
}
void CMyDlg::OnTimer(UINT nIDEvent)
{        CClientDC dc(this);
        int x=200,y=200;
        BitBlt(dc.m_hDC,x,y,100,100,DCBak,x,y,SRCCOPY);

        if(getpic("人",p)==FALSE)
                        {AfxMessageBox(cc+"没找到!");return;}
        SelectObject(MemDC,bit);
        TransparentBlt2(dc.m_hDC,x,y,w,h,MemDC,0,0,w,h,RGB(255,255,255));
        p++;
        if(p>m1) p=m0;       

        CDialog::OnTimer(nIDEvent);
}

BOOL getpic(CString cc,int p)
{        char name[256];
        SetCurrentDirectory(appdir);
        sprintf(name,"%s%s/c%05d.bmp",dir,cc,p);
        loadbmp(name);
        return TRUE;
}

BOOL loadbmp(CString cc)
{        DeleteObject(bit);
        bit=(HBITMAP)LoadImage
                                (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);
        w = bm.biWidth;
        h = bm.biHeight;
        return TRUE;
}

void TransparentBlt2( HDC hdc0,       
                                        int nX0,int nY0,
                                        int nW0,int nH0,
                                        HDC hdc1,
                                        int nX1,int nY1,
                                        int nW1,int nH1,
                                        UINT Tcol
                                        )
{        HBITMAP hBMP   =CreateCompatibleBitmap(hdc0,nW0, nH0);
        HBITMAP mBMP   =CreateBitmap(nW0,nH0,1,1,NULL);       
        HDC                hDC    =CreateCompatibleDC(hdc0);
        HDC                mDC    =CreateCompatibleDC(hdc0);
        HBITMAP oldBMP =(HBITMAP)SelectObject(hDC, hBMP);
        HBITMAP oldmBMP=(HBITMAP)SelectObject(mDC, mBMP);
        if (nW0==nW1&&nH0==nH1)
                BitBlt(hDC,0,0,nW0,nH0,hdc1,nX1,nY1,SRCCOPY);
        else
                StretchBlt(hDC,0,0,nW0,nH0,hdc1,nX1,nY1,nW1,nH1,SRCCOPY);

        SetBkColor(hDC, Tcol);
        BitBlt(mDC,0,0,nW0,nH0,hDC,0,0,SRCCOPY);
        SetBkColor(hDC, RGB(0,0,0));
        SetTextColor(hDC, RGB(255,255,255));
        BitBlt(hDC,0,0,nW0,nH0,mDC,0,0,SRCAND);
        SetBkColor(hdc0,RGB(255,255,255));
        SetTextColor(hdc0,RGB(0,0,0));

        BitBlt(hdc0,nX0,nY0,nW0,nH0,mDC,0,0,SRCAND);
        BitBlt(hdc0,nX0,nY0,nW0,nH0,hDC,0,0,SRCPAINT);

        SelectObject(hDC, oldBMP);                               
        DeleteDC(hDC);
        SelectObject(mDC, oldmBMP);
        DeleteDC(mDC);
        DeleteObject(hBMP);
        DeleteObject(mBMP);
}

//---------------------------------------------------------------------------------------------------------------
问:
TransparentBlt2函数中有以下语句:
        SetBkColor(hDC, Tcol);
        BitBlt(mDC,0,0,nW0,nH0,hDC,0,0,SRCCOPY);
        SetBkColor(hDC, RGB(0,0,0));
        SetTextColor(hDC, RGB(255,255,255));
        BitBlt(hDC,0,0,nW0,nH0,mDC,0,0,SRCAND);
        SetBkColor(hdc0,RGB(255,255,255));
        SetTextColor(hdc0,RGB(0,0,0));
书上说着是做掩码图用的,但是SetTextColor函数在这里有什么作用?不是设置文字颜色的吗?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-23 13:23

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表