• DirectDraw创建Windows窗口


    KWindow.h  KWindow.cpp

    KDDrawWindow.cpp

      1 #define STRICT
      2 #define WIN32_LEAN_AND_MEAN
      3 
      4 #include <windows.h>
      5 #include <assert.h>
      6 #include <tchar.h>
      7 #include <ddraw.h>
      8 
      9 #include "KWindow.h"
     10 #pragma comment(lib,"ddraw")
     11 
     12 const TCHAR szMessage[] = _T("Hello World!");
     13 const TCHAR szFace[] = _T("Times New Roman");
     14 const TCHAR szHint[] = _T("press ESC to quit.");
     15 const TCHAR szProgram[] = _T("HelloWorld4");
     16 
     17 class KDDrawWindow : public KWindow
     18 {
     19     LPDIRECTDRAW    lpdd;
     20     LPDIRECTDRAWSURFACE        lpddsprimary;
     21 
     22     void OnKeyDown(WPARAM wParam, LPARAM lParam)
     23     {
     24         if(wParam == VK_ESCAPE)
     25         {
     26             PostMessage(m_hWnd, WM_CLOSE, 0, 0);
     27         }
     28     }
     29 
     30     void Blend(int left, int right, int top, int bottom);
     31 
     32     void OnDraw(HDC hdc)
     33     {
     34         TextOut(hdc, 0, 0, szHint, lstrlen(szHint));
     35         CenterText(hdc, GetSystemMetrics(SM_CXSCREEN) / 2, 
     36                     GetSystemMetrics(SM_CYSCREEN) / 2, 
     37                     szFace, szMessage, 48);
     38         Blend(80, 560, 160, 250);
     39     }
     40 
     41 public:
     42     KDDrawWindow()
     43     {
     44         lpdd = NULL;
     45         lpddsprimary = NULL;
     46     }
     47 
     48     ~KDDrawWindow()
     49     {
     50         if(lpddsprimary)
     51         {
     52             lpddsprimary->Release();
     53             lpddsprimary = NULL;
     54         }
     55 
     56         if(lpdd)
     57         {
     58             lpdd->Release();
     59             lpdd = NULL;
     60         }
     61     }
     62 
     63     bool CreateSurface();
     64 };
     65 
     66 bool KDDrawWindow::CreateSurface()
     67 {
     68     HRESULT hr;
     69     hr = DirectDrawCreate(NULL, &lpdd, NULL);
     70     if(hr != DD_OK)
     71         return false;
     72 
     73     hr = lpdd->SetCooperativeLevel(m_hWnd, DDSCL_FULLSCREEN | DDSCL_EXCLUSIVE);
     74     if(hr != DD_OK)
     75         return false;
     76 
     77     hr = lpdd->SetDisplayMode(640, 480, 32);
     78     if(hr != DD_OK)
     79         return false;
     80 
     81     DDSURFACEDESC ddsd;
     82     memset(&ddsd, 0, sizeof(ddsd));
     83     ddsd.dwSize = sizeof(ddsd);
     84     ddsd.dwFlags = DDSD_CAPS;
     85     ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
     86 
     87     return lpdd->CreateSurface(&ddsd, &lpddsprimary, NULL) == DD_OK;
     88 }
     89 
     90 void inline Blend(unsigned char* dest, unsigned char* src)
     91 {
     92     if(!dest || !src)
     93         return;
     94 
     95     dest[0] = (dest[0] + src[0]) / 2;
     96     dest[1] = (dest[1] + src[1]) / 2;
     97     dest[2] = (dest[2] + src[2]) / 2;
     98 }
     99 
    100 void KDDrawWindow::Blend(int left, int right, int top, int bottom)
    101 {
    102     DDSURFACEDESC ddsd;
    103     memset(&ddsd, 0, sizeof(ddsd));
    104     ddsd.dwSize = sizeof(ddsd);
    105 
    106     HRESULT hr = lpddsprimary->Lock(NULL, &ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT, NULL);
    107     assert(hr == DD_OK);
    108 
    109     unsigned char* screen = (unsigned char*)ddsd.lpSurface;
    110 
    111     for(int y = top; y < bottom; ++y)
    112     {
    113         unsigned char* pixel = screen + y * ddsd.lPitch + left * 4;
    114         for(int x = left; x < right; ++x, pixel += 4)
    115         {
    116             if(pixel[0] != 255 || pixel[1] != 255 || pixel[2] != 255)
    117             {
    118                 ::Blend(pixel - 4, pixel);    //left
    119                 ::Blend(pixel + 4, pixel);    //right
    120                 ::Blend(pixel - ddsd.lPitch, pixel); //up
    121                 ::Blend(pixel + ddsd.lPitch, pixel); //down
    122             }
    123         }
    124     }
    125 
    126     lpddsprimary->Unlock(ddsd.lpSurface);
    127 }
    128 
    129 int WINAPI WinMain( _In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd )
    130 {
    131     KDDrawWindow win;
    132     win.CreateEx(0, szProgram, szProgram, WS_POPUP, GetSystemMetrics(SM_CXSCREEN) / 4, GetSystemMetrics(SM_CXSCREEN) / 4,
    133         GetSystemMetrics(SM_CXSCREEN) / 2, GetSystemMetrics(SM_CYSCREEN) / 2,
    134         NULL, NULL, hInstance);
    135 
    136     win.CreateSurface();
    137     win.ShowWindow(nShowCmd);
    138     win.UpdateWindow();
    139     
    140     return win.MessageLoop();
    141 }
  • 相关阅读:
    第04组(64)需求分析报告
    实验 7:OpenDaylight 实验——Python 中的 REST API 调用
    结对编程作业
    第01组 Alpha冲刺(5/6)
    第01组 Alpha冲刺(4/6)
    第01组 Alpha冲刺 (3/6)
    第01组 Alpha冲刺(2/6)
    第01组 Alpha冲刺(1/6)
    第01组(17)需求分析报告
    第01组(17)团队展示
  • 原文地址:https://www.cnblogs.com/felove2013/p/4863659.html
Copyright © 2020-2023  润新知