Windows GDI筆記

來源:互聯網
上載者:User
1.Device Context
//取得DC
HDC GetDC(HWND hWnd)
//釋放DC
int ReleaseDC(HWND hWnd,HDC DC名稱);

2.GDI對象:建立->選用->刪除
//建立畫筆
HPEN CreatePen(int 樣式,int 寬度, COLORREF 顏色);
//建立陰影畫刷
HBRUSH CreateHatchBrush(int 樣式,COLORREF 顏色);
//建立單色畫刷
HBRUSH CreateSolidBrush(COLORREF 顏色);

//選用GDI對象
HGDIOBJ SelectObject(HDC hdc, HGDIOBJ GDI對象);
//刪除GDI對象
BOOL DeleteObject(HGDIOBJ GDI對象);

3.
//畫線
//移動畫筆至線條起點
BOOL MoveToEx(HDC hdc,int x,int y,LPPOINT 目前座標);
// 畫線條到指定座標
BOOL LineTo(HDC hdc,int x,int y);

//畫矩形
BOOL Rectangle(HDC hdc,int x1,int y1,int x2,int y2);

//畫多邊形
BOOL Polygon(HDC hdc,CONST POINT 點數組指標,int 多邊形點數);

BOOL PolylineTo(HDC hdc,CONST POINT 點數組指標,int 多邊形點數);
BOOL Polyline(HDC hdc,CONST POINT 點數組指標,int 多邊形點數);

typedef struct tagPOINT{
    LONG x;
    LONG y;
}POINT;

//畫橢圓形
BOOL Ellipse(HDC hdc, int x1,int y1,int x2,int y2);

//畫圓角矩形
BOOL RoundRect(HDC hdc,int x1,int y1,int x2,int y2,int 圓角上橢圓長,int 圓角上橢圓高);

//畫扇形
BOOL Pie(HDC hdc,int 外圍矩形左上點x座標,int 外圍矩形左上點y座標,int 外圍矩形右上點x座標,int 外圍矩形右上點y座標,int x1,int y1,int x2,int y2);

//畫弓形
Chord(hdc,300,210,550,340,50,50,600,300);

4.字串
int x=LOWORD(lParam);
//設定字串顏色
SetTextColor(hdc,#ff0000);
char str[20]="";
sprintf(str,"X座標:%d",x);
//輸出字串
BOOL TextOut(HDC hdc, int x座標,int y座標,LPCTSTR 字串指標,int 字串長度);

5.繪製位元影像
(1)載入位元影像
HANDLE LoadImage(HINSTANCE 來源實體,LPCTSTR 名稱,UINT 位元影像類型, int 載入寬度,int 載入高度,UINT 載入方式);
位元影像類型:IMAGE_BITMAP、IMAGE_CURSOR、IMAGE_ICON
載入方式:從檔案中載入LR_LOADFROMFILE
(2)建立記憶體DC
HDC CreateCompatibleDC(HDC hdc);
DeleteDC(HDC hdc);
(3)選用位元影像對象
HGDIOBJ SelectObject(HDC hdc, HGDIOBJ GDI對象);
(4)貼圖
BOOL BitBlt(HDC destDC,int destX,int destY,int destWidth,int destHeight,HDC srcDc,int srcX,int srcY,DWORD 貼圖方式);
貼圖方式:
SRCCOPY   將來源位元影像貼到目的DC上
SRCAND      將來源位元影像與目的DC做“AND”運算
SRCPAINT    將來源位元影像與目的DC做“OR”運算

6.透明處理
(1)透明效果
    SelectObject(mdc,bg);
    BitBlt(hdc,0,0,600,450,mdc,0,0,SRCCOPY);
    SelectObject(mdc,dra);
    BitBlt(hdc,280,320,85,99,mdc,85,0,SRCAND);
    BitBlt(hdc,280,320,85,99,mdc,0,0,SRCPAINT);
    
(2)半透明效果
半透明色彩=前景圖色彩*不透明度+背景圖色彩*(1-不透明度)
a.取得位元影像結構
int GetObject(HGDIOBJ GDI對象,int 結構大小,LPVOID 結構變數);
結構變數typedef struct tagBITMAP{
        LONG bmType;
        LONG bmWidth;
        LONG bmHeight;
        LONG bmWidthBytes;
        WORD bmPlanes;
        WORD bmBitsPixel;
        LPVOID bmBits;
  }BITMAP;
 
  GetObject(bitmap,sizeof(BITMAP),&bm);
b.建立暫存數組
  unsigned char *px = new unsigned char [bm.bmHeight * bm.bmWidthBytes];
c.取得位元影像位值
  LONG GetBitmapBits(HBITMAP 位元影像,LONG 取得的Byte數,LPVOID 儲存的數組指標);
 
  GetBitmapBits(bitmap,bm.bmHeight*bm.bmWidthBytes.px);
d.合成像素顏色值
 
 e.重設位元影像顏色
  LONG SetBitmapBits(HBITMAP 位元影像,DWORD 顏色數組大小, CONST VOID 數組指標);
 
  (3)透明半透明效果
  //建立位元影像
  HBITMAP CreateCompatibleBitmap(HDC hdc,int width,int height);
 
 7.定時器
 UINT SetTimer(HWND hWnd,UINT 定時器代號, UINT 時間間隔, TIMERPROC 處理器響應函數);
 UINT 定時器代號在同一個視窗中必須是唯一的,且不為0
 
 //刪除定時器
 BOOL KillTimer(int 定時器代號);
 
  8.遊戲迴圈
  DWORD tPre,tNow;
 
  WinMain裡
  while(msg.message!=WM_QUIT)
    {
        if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        else
        {
            tNow=GetTickCount();
            if(tNow-tPre>=40)
                MyPaint(hdc);
        }
    }
    
    InitInstance裡
    hdc = GetDC(hWnd);
    mdc = CreateCompatibleDC(hdc);
    bufdc = CreateCompatibleDC(hdc);
    HBITMAP bmp=CreateCompatibleBitmap(hdc,640,480);
    SelectObject(mdc,bmp);
    dra=(HBITMAP)LoadImage(NULL,"dra2.bmp",IMAGE_BITMAP,760,198,LR_LOADFROMFILE);
    bg=(HBITMAP)LoadImage(NULL,"bg.bmp",IMAGE_BITMAP,640,480,LR_LOADFROMFILE);
    num=0;
    x=640;
    y=360;
    MyPaint(hdc);
 
 int frame=0;
int tCheck=0,fps;
void MyPaint(HDC hdc)
{
 if(num==8)
        num=0;
    SelectObject(bufdc,bg);
    BitBlt(mdc,0,0,640,480,bufdc,0,0,SRCCOPY);

    SelectObject(bufdc,dra);
    BitBlt(mdc,x,y,95,99,bufdc,num*95,99,SRCAND);
    BitBlt(mdc,x,y,95,99,bufdc,num*95,0,SRCPAINT);

    BitBlt(hdc,0,0,640,480,mdc,0,0,SRCCOPY);

    tPre=GetTickCount();
    num++;

    //顯示文字
    frame++;
    if(tNow-tCheck>=1000)
    {
        fps=frame;
        frame=0;
        tCheck=tNow;
    }
    char str[40]="";
    sprintf(str,"每秒鐘顯示%d個畫面 ",fps);
    TextOut(hdc,0,0,str,strlen(str));
}
 
9.動畫顯示問題
排序貼圖
10.背景動畫設計
a)單一背景滾動
b)迴圈背景滾動
c)多背景迴圈動畫

11.
1)
//設定擷取視窗外的滑鼠訊息
HWND SetCapture(HWND hWnd);

//釋放擷取視窗外的滑鼠訊息
BOOL ReleaseCapture(VOID);
2)
//設定滑鼠游標位置,注意:(x,y)對應的是螢幕座標而不是視窗座標
BOOL SetCursorPos(int x,int y);

//視窗座標轉換為螢幕座標
BOOL ClientToScreen(HWND hWnd, LPPOINT 視窗點座標);

//螢幕座標轉換為視窗座標
BOOL ScreenToClient(HWND hWnd, LPPOINT 螢幕點座標);

POINT pt;
pt.x=0;
pt.y=0;
ClientToScreen(hWnd,&pt);
SetCursorPos(pt.x,pt.y);
3)顯示或隱藏滑鼠
int ShowCursor(BOOL true或false);
4)
//限制滑鼠游標移動地區
BOOL ClipCursor(CONST RECT 移動地區矩形);

//釋放保留
BOOL ClipCursor(NULL);

typedef struct RECT{
                    LONG left;
                    LONG top;
                    LONG right;
                    LONG bottom;
               }RECT;
               
 //取得視窗外部地區矩形
 BOOL GetWindowRect(HWND hWnd,LPRECT 矩形結構);
 
 //取得視窗內部矩形地區
 BOOL GetClientRect(HWND hWnd,LPRECT 矩形結構);
 
 例如:要限制滑鼠游標移動地區
 RECT rect;
 POINT lt,rb;
GetClientRect(hWnd,&rect);
lt.x=rect.left;
lt.y=rect.top;
rb.x=rect.right;
rb.y=rect.bottom;
ClientToScreen(hWnd,&lt);
ClientToScreen(hWnd,&rb);
rect.left=lt.x;
rect.top=lt.y;
rect.right=rb.x;
rect.bottom=rb.y;
ClipCursor(&rect);

12.AI
類神經網路
基因演算法
模糊邏輯

1)怪物追逐
if(怪物HP>200)
{
    p=rand()%3;
    if(p!=1)   //有2/3的機率能正確的朝向玩家
    {
        if(怪物X>玩家X)
            怪物X--;
        else
            怪物X++;
            
        if(怪物Y>玩家Y)
            怪物Y--;
        else
            怪物Y++;
     }
}
else
    怪物HP+=5;//怪物不動,休息補血
2)躲避移動
if(怪物X>玩家X)
    怪物++;
else
    怪物X--;
 
if(怪物Y>玩家Y)
    怪物Y++;
else
    怪物Y--;
3)模式移動:追逐、躲避、隨機、固定移動等

4)怪物行為
a.普通攻擊
b.施放攻擊魔法
c.使盡全力攻擊
d.補血
e.逃跑

if(生命值>20)
{
    if(rand()%10!=1)  //普通攻擊機率為9/10
        普通攻擊;
    else
        施放魔法攻擊;
 }
 else
 {
     switch(rand()%5)
     {
        case0:
                普通攻擊;
                break;
        case 1:
                施放魔法攻擊;
                break;
        case 2:
                使盡全力攻擊;
                break;
        case 3:
                補血;
                break;
        case 4:
                逃跑;
                if(rand()%3==1)    //逃跑成功幾率為1/3
                        逃跑成功;
                else
                        逃跑失敗;
                break;
    }
}
 
 }

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.