#include <windows.h>
//全域變數
HINSTANCE hInst;////HINSTANCE 是Windows里的一中資料型別,是用于標示(記錄)一個程式的實體。
BITMAP bm1,bm2;
HDC hdc,bufdc;
HDC mdc;
unsigned char *px1,*px2;
const int xstart = 300;
const int ystart = 200;
int x,y;
int i;
int rgb_b;
int PxBytes=bm1.bmBitsPixel/8;
int xend=xstart+85;
int yend=ystart+99;
HBITMAP dra,bg;
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
//-------------------------------------正式內容-----------------------------------------//
////每個基于 Win32 的應用程式的函式必須具有 WinMain 函式
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
//創建 WNDCLASSEX 型別的視窗類結構。 此結構包含關于視窗的資訊
//例如應用程式圖示、視窗背景色、標題欄中顯示的名稱、視窗程序函式的名稱等。
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX); //視窗大小
wcex.style =CS_HREDRAW | CS_VREDRAW; //視窗風格
wcex.lpfnWndProc = WndProc; //視窗訊息處理函式的指標
wcex.cbClsExtra = 0; //分配給視窗類結構之后的額外位元組數
wcex.cbWndExtra = 0; //分配給視窗實體之后的額外位元組數
wcex.hInstance = hInstance; //視窗所對應的應用程式的句柄
wcex.hIcon = LoadIcon(hInstance, IDI_HAND); //視窗圖示
wcex.hCursor = LoadCursor(NULL, IDC_ARROW); //視窗滑鼠
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); //視窗背景
wcex.lpszMenuName = NULL; //視窗的選單資源名稱
wcex.lpszClassName = "GameFrame"; //視窗類的名稱
wcex.hIconSm = LoadIcon(NULL,MAKEINTRESOURCE(IDI_APPLICATION)); //應用程式小圖示
//對已創建的視窗類進行注冊。 使用 RegisterClassEx 函式,并將視窗類結構作為引數傳遞。
if (!RegisterClassEx(&wcex))return 0;
hInst = hInstance;
HWND hWnd = CreateWindow( "GameFrame", "游戲框架", WS_OVERLAPPEDWINDOW^WS_THICKFRAME^WS_MAXIMIZEBOX, CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, NULL, NULL, hInstance, NULL );
if (!hWnd) return false;
//位圖代碼
/*HBITMAP hBmp=(HBITMAP)LoadImage(NULL,"bg.bmp",IMAGE_BITMAP,640, 480, LR_LOADFROMFILE);
hDC = GetDC(hWnd);
image_mDC= CreateCompatibleDC(hDC);
SelectObject(image_mDC,hBmp);
BitBlt(hDC, 0, 0, 640, 480, image_mDC, 0, 0, SRCCOPY);
*/
HBITMAP bmp;
bg=(HBITMAP)LoadImage(NULL,"bg.bmp", IMAGE_BITMAP,640,480,LR_LOADFROMFILE);
bmp=(HBITMAP)LoadImage(NULL,"dra.bmp", IMAGE_BITMAP,170,99,LR_LOADFROMFILE);
GetObject(bg,sizeof(BITMAP),&bm1);
if(bm1.bmBitsPixel!=32&&bm1.bmBitsPixel!=24){
MessageBox(NULL,"此程式只能在32位24位色下運行","警告",0);
return FALSE;
}
hdc = GetDC(hWnd);
mdc = CreateCompatibleDC(hdc); //全域HDC型別變數
bufdc = CreateCompatibleDC(hdc);
dra = CreateCompatibleBitmap(hdc,85,99);
SelectObject(mdc,dra);
SelectObject(bufdc,bg);
BitBlt(mdc,0,0,85,99,bufdc,xstart,ystart,SRCCOPY);
SelectObject(bufdc,bmp); //bmp為載入的恐龍位圖句柄
BitBlt(mdc,0,0,85,99,bufdc,85,0,SRCAND);
BitBlt(mdc,0,0,85,99,bufdc,0,0,SRCPAINT);
//unsigned char *px1,*px2;
px1 = new unsigned char[bm1.bmHeight *bm1.bmWidthBytes];
GetBitmapBits(bg,bm1.bmHeight * bm1.bmWidthBytes,px1);
GetObject(dra,sizeof(BITMAP),&bm2);
px2 = new unsigned char [bm2.bmHeight *bm2.bmWidthBytes];
GetBitmapBits(dra,bm2.bmHeight * bm2.bmWidthBytes,px2);
//半透明處理
for(y=ystart;y<yend;y++) {
for(x=xstart;x<xend;x++) {
rgb_b = y * bm1.bmWidthBytes + x * PxBytes ;
px1[rgb_b] = px1[rgb_b] *5/10;
px1[rgb_b+1] = px1[rgb_b+1] * 5/10;
px1[rgb_b+2] = px1[rgb_b+2] * 5/10; } }
for(y=0;y<(bm2.bmHeight); y++) {
for(x=0;x<bm2.bmWidth; x++){
rgb_b = y * bm2.bmWidthBytes + x * PxBytes ;
i=(ystart+y)*bm1.bmWidthBytes+ (xstart+x)*PxBytes;
px2[rgb_b] = px2[rgb_b]*5/10+ px1[i];
px2[rgb_b+1] = px2[rgb_b+1]*5/10+ px1[i+1];
px2[rgb_b+2] = px2[rgb_b+2]*5/10+ px1[i+2]; }
}
SetBitmapBits(dra,bm2.bmHeight*bm2.bmWidthBytes,px2);
SelectObject(mdc,bg);
BitBlt(hdc,0,0,640,480,mdc,0,0,SRCCOPY);
//-------------------------------------------------------
// 如果視窗更新的區域不為空,UpdateWindow函式就發送一個WM_PAINT訊息來更新指定視窗的客戶區。
// 函式繞過應用程式的訊息佇列,直接發送WM_PAINT訊息給指定視窗的視窗程序
// 如果更新區域為空,則不發送訊息。
// 添加用于偵聽作業系統所發送訊息的訊息回圈。
// 當應用程式收到一條訊息時,此回圈將該訊息調度到 WndProc 函式以進行處理。
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
MSG msg;
ReleaseDC(hWnd,hdc);
DeleteDC(bufdc);
DeleteObject(bmp);
delete[]px1;
delete[]px2;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg); //翻譯訊息
DispatchMessage(&msg); //派遣訊息
}
return (int) msg.wParam;
}
// 函式: WndProc(HWND, UINT, WPARAM, LPARAM)
// // 目標: 處理主表單產生的資訊
// // WM_PAINT訊息代表繪制主表單
// // WM_DESTROY訊息代表投遞一個退出訊息并回傳
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
PAINTSTRUCT ps;
HDC hdc;
switch (msg) {
case WM_CREATE:
//執行初始化代碼
return(0);
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
SelectObject(mdc,bg);
BitBlt(hdc,0,0,640,480,mdc,0,0,SRCCOPY);
SelectObject(mdc,dra);
BitBlt(hdc,xstart,ystart,85,99,mdc,0,0,SRCCOPY);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
DeleteDC(mdc);
DeleteObject(bg);
DeleteObject(dra);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, msg, wParam, lParam);
break;
}
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/85985.html
標籤:C++ 語言
上一篇:OPenGL讀取obj檔案
