Шустрый

Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.9.2005
Репутация: нет Всего: 6
|
Видимо предётся весь код выкладывать: Всё довёл до ума и получилось(добавил новый класс) итого 5 файлов: 1) Drawer.cpp (файл с окном - главный файл проекта): | Код | #pragma once
#include "stdafx.h" #include "Drawer.h" #define MAX_LOADSTRING 100
HINSTANCE hInst; TCHAR szTitle[MAX_LOADSTRING]; TCHAR szWindowClass[MAX_LOADSTRING];
ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); CDrawer drawer;
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { MSG msg; LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hInstance, IDC_DRAWER, szWindowClass, MAX_LOADSTRING); MyRegisterClass(hInstance); if (!InitInstance (hInstance, nCmdShow)) return FALSE; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int) msg.wParam; }
ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = (WNDPROC)WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = NULL; wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = (LPCTSTR)IDC_DRAWER; wcex.lpszClassName = szWindowClass; wcex.hIconSm = NULL; return RegisterClassEx(&wcex); }
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { HWND hWnd; hInst = hInstance; hWnd = CreateWindow(szWindowClass, szTitle, WS_POPUP, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!hWnd) return FALSE; ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); drawer.Initialize(hWnd); return TRUE; }
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_DESTROY: drawer.Close(); PostQuitMessage(0); break; case WM_KEYDOWN: drawer.CheckKey(wParam); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }
|
2) stdafx.h (заголовки): | Код | #pragma once
#define WIN32_LEAN_AND_MEAN #include <ddraw.h> #include <windows.h> #include <stdlib.h> #include <malloc.h> #include <memory.h> #include <tchar.h> #include <atlimage.h> #include "classes.h"
|
3) classes.h (классы движка): | Код | #pragma once
#include "stdafx.h" #include "CBF.h"
#ifndef DRAWERCLASSES #define DRAWERCLASSES
class CSurface;
class CDrawer { public: CDrawer(); ~CDrawer(); bool Initialize(HWND hwnd, int ResolX = 1024, int ResolY = 768, int BitDepth = 32); void Close(); void CheckKey(UINT key); bool DoMessage(UINT message, UINT wParam, UINT lParam); bool CreateSurface(DWORD Width, DWORD Height, LPDIRECTDRAWSURFACE FAR *lpSF); bool DrawBuf(CSurface *SF); private: LPDIRECTDRAW lpDD; //DirectDrawInterface LPDIRECTDRAWSURFACE lpDisplay, lpBuf, lpClear; //surfaces: display, buffer, to clear display DDSURFACEDESC ddsd; CImage pClr; HDC hClr; RECT clr; HWND hWnd; };
class CSurface { public: CSurface(CDrawer *drawer, LPCTSTR FileName, bool UseColorKey = true); bool LoadPicture(LPCTSTR FileName); void SetTransparency(bool UseColorKey, DWORD Color = 0); DWORD GetWidth() {return Width;} DWORD GetHeight() {return Height;} void SetSrcRect(long left, long top, long right, long bottom); void SetDestRect(long left, long top, long right, long bottom); RECT* GetSrcRect() {return &rects;} RECT* GetDestRect() {return &rectd;} LPDIRECTDRAWSURFACE GetSuface() {return lpSF;} ~CSurface(); private: HDC hDC; CImage pic; LPDIRECTDRAWSURFACE lpSF; DDCOLORKEY ColorKey; DWORD Width, Height; RECT rectd, rects; };
#endif
#include "CDrawer.cpp" #include "CSurface.cpp"
|
4) CDrawer.cpp (файл реализации класса движка): | Код | #pragma once
#include "stdafx.h"
#ifdef DRAWERCLASSES
CDrawer::CDrawer() { }
CDrawer::~CDrawer() { }
bool CDrawer::Initialize(HWND hwnd, int ResolX, int ResolY, int BitDepth) { HRESULT res; hWnd = hwnd; res = DirectDrawCreate(NULL, &lpDD, NULL); if (res!=DD_OK) return false; res = lpDD->SetCooperativeLevel(hWnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); if (res!=DD_OK) return false; res = lpDD->SetDisplayMode(ResolX, ResolY, BitDepth); if (res!=DD_OK) return false; memset(&ddsd, 0, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS; ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; res = lpDD->CreateSurface(&ddsd, &lpDisplay, NULL); if (res!=DD_OK) return false; ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; ddsd.dwHeight = ResolY; ddsd.dwWidth = ResolX; res = lpDD->CreateSurface(&ddsd, &lpClear, NULL); if (res!=DD_OK) return false; res = lpDD->CreateSurface(&ddsd, &lpBuf, NULL); if (res!=DD_OK) return false; pClr.Create(ResolX, ResolY, BitDepth); lpClear->GetDC(&hClr); pClr.BitBlt(hClr, 0, 0); lpClear->ReleaseDC(hClr); clr.left = clr.top = 0; clr.bottom = ResolY; clr.right = ResolX; lpBuf->BltFast(0, 0, lpClear, &clr, NULL); lpDisplay->BltFast(0, 0, lpBuf, &clr, NULL); return true; }
void CDrawer::Close() { if (lpDD!=NULL) lpDD->Release(); //if (lpDisplay!=NULL) lpDisplay->Release(); //if (lpBuf!=NULL) lpBuf->Release(); //if (lpClear!=NULL) lpClear->Release(); if (pClr!=NULL) pClr.Destroy(); }
bool CDrawer::DoMessage(UINT message, UINT wParam, UINT lParam) { switch (message) { case WM_KEYDOWN: switch(wParam) { case VK_ESCAPE: SendMessage(hWnd, WM_DESTROY, NULL, NULL); break; } break; } return true; }
void CDrawer::CheckKey(UINT key) { if (HIWORD(GetKeyState(key))!=0) DoMessage(WM_KEYDOWN, key, NULL); }
bool CDrawer::CreateSurface(DWORD Width, DWORD Height, LPDIRECTDRAWSURFACE FAR *lpSF) { ddsd.dwSize = sizeof(ddsd); ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; ddsd.dwHeight = Height; ddsd.dwWidth = Width; HRESULT res; res = lpDD->CreateSurface(&ddsd, lpSF, NULL); if (res!=DD_OK) return false; else return true; }
bool CDrawer::DrawBuf(CSurface *SF) { if (SF!=NULL) { HRESULT res = lpBuf->Blt(SF->GetDestRect(), SF->GetSuface(), SF->GetSrcRect(), DDBLT_KEYSRC, NULL); if (res==DD_OK) return true; else return false; } else return false; }
#endif
|
5) CSurface.cpp (файл реализации класса дополнительного): | Код | #pragma once
#include "stdafx.h"
#ifdef DRAWERCLASSES
CSurface::CSurface(CDrawer *drawer, LPCTSTR FileName, bool UseColorKey) { pic.Load(FileName); Width = pic.GetWidth(); Height = pic.GetHeight(); rects.top = rects.left = 0; rects.bottom = Height; rects.right = Width; drawer->CreateSurface(Width, Height, &lpSF); lpSF->GetDC(&hDC); pic.BitBlt(hDC, 0, 0); lpSF->ReleaseDC(hDC); ColorKey.dwColorSpaceLowValue = 0; if (UseColorKey) lpSF->SetColorKey(DDCKEY_SRCBLT, &ColorKey); }
CSurface::~CSurface() { lpSF->Release(); pic.Destroy(); }
bool CSurface::LoadPicture(LPCTSTR FileName) { pic.Destroy(); HRESULT res = pic.Load(FileName); if (res!=S_OK) return false; Width = pic.GetWidth(); Height = pic.GetHeight(); rects.top = rects.left = 0; rects.bottom = Height; rects.right = Width; lpSF->GetDC(&hDC); pic.BitBlt(hDC, 0, 0); lpSF->ReleaseDC(hDC); return true; }
void CSurface::SetTransparency(bool UseColorKey, DWORD Color) { ColorKey.dwColorSpaceLowValue = Color; lpSF->SetColorKey(DDCKEY_SRCBLT, &ColorKey); }
void CSurface::SetSrcRect(long left, long top, long right, long bottom) { rects.left = left; rects.top = top; rects.right = right; rects.bottom = bottom; }
void CSurface::SetDestRect(long left, long top, long right, long bottom) { rectd.left = left; rectd.top = top; rectd.right = right; rectd.bottom = bottom; }
#endif
|
PS. А если использовать /FORCE:MULTIPLE, что от этого будет? Это сообщение отредактировал(а) OXOTHUK - 10.5.2006, 14:46
|