Шаг 42 - Обычный режим

Мы все как-то, полноэкранный режим использовали, но есть возможность подобными методами работать и в обычном режиме. Вот на картинке ниже, что мы получим.

42_1.gif (7511 b)

Мы получим доступ ко всему экрану и выведем на экране по нажатию на кнопку наш вертолет. Я сделал совсем просто, а вам никто не мешает убрать фон. Итак, в чем отличия этого режима. Экран используется не только Вами, но и всеми другими программами. Значит, в любой момент Ваш рисунок могут затереть. При установке уровня доступа к экрану нужно указывать DDSCL_NORMAL.

Visual Basic
Visual C++

Visual Basic

Итак, создаем проект на основе формы. На форму элемент Picture и делаем его невидимым. Кроме того помещаем кнопку. По нажатию на нее будет выводиться рисунок. Производим инициализацию при загрузке формы.

Private Sub Form_Load()
On Error GoTo Ends:
Picture1.Picture = LoadResPicture(101, vbResBitmap)

Set objDirectX = New DirectX7
Set objDirectDraw = objDirectX.DirectDrawCreate("")
objDirectDraw.SetCooperativeLevel Form1.hWnd, DDSCL_NORMAL
stSurfDesc.lFlags = DDSD_CAPS
stSurfDesc.ddsCaps.lCaps = DDSCAPS_PRIMARYSURFACE
Set PrimarySurf = objDirectDraw.CreateSurface(stSurfDesc)
Dim stSurfDescOff As DDSURFACEDESC2
stSurfDescOff.lFlags = DDSD_CAPS Or DDSD_HEIGHT Or DDSD_WIDTH
stSurfDescOff.ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN
stSurfDescOff.lHeight = 92
stSurfDescOff.lWidth = 128
Set OffSrc = objDirectDraw.CreateSurface(stSurfDescOff)
a = OffSrc.GetDC
hCompt = CreateCompatibleDC(a)
SelectObject hCompt, Picture1.Picture
BitBlt a, 0, 0, 128, 92, hCompt, 0, 0, SRCCOPY
OffSrc.ReleaseDC (a)
Exit Sub
Ends:
    End
End Sub

Выводим рисунок по нажатию на кнопку.

Private Sub Command1_Click()
Dim r As RECT
	r.Top = 0
	r.Left = 0
	r.Right = 128
	r.Bottom = 92
	PrimarySurf.Blt r, OffSrc, r, DDBLT_WAIT
End Sub

Запускаем, нажимаем смотрим.

Visual C++

Создаем приложение на базе диалогового окна и помещаем на диалог кнопку. Проводим инициализацию при запуске формы.

BOOL CVCDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Add "About..." menu item to system menu.
	rezult = DirectDrawCreate(NULL, &lpDD, NULL );
	VERIFY(rezult == DD_OK );
	rezult = lpDD>SetCooperativeLevel(AfxGetMainWnd()>GetSafeHwnd(),DDSCL_NORMAL);
	VERIFY(rezult == DD_OK );
	memset(&strsurf,0,sizeof(DDSURFACEDESC));
	strsurf.dwSize = sizeof(DDSURFACEDESC);
	strsurf.dwFlags = DDSD_CAPS; 
	strsurf.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE ; 
	rezult=lpDD->CreateSurface(&strsurf,&PrimarySurf,NULL);
	VERIFY(rezult == DD_OK );
	memset(&offscr,0,sizeof(DDSURFACEDESC));
	offscr.dwSize = sizeof(DDSURFACEDESC);
	offscr.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
	offscr.ddsCaps.dwCaps  = DDSCAPS_OFFSCREENPLAIN;
	offscr.dwHeight = 92;
	offscr.dwWidth = 128;
	rezult=lpDD->CreateSurface(&offscr,&offscr1,NULL);
	VERIFY(rezult == DD_OK ); 
	hBMP=LoadImage(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP1),
		IMAGE_BITMAP, 0, 0,  LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
	VERIFY(hBMP != NULL);
	rezult = offscr1->GetDC(&hdc);
	VERIFY(rezult==DD_OK);
	HDC hCompt = CreateCompatibleDC(hdc);
	SelectObject(hCompt,hBMP);
	BitBlt(hdc, 0  ,0 ,128  , 92  , hCompt, 0, 0, SRCCOPY);
	offscr1->ReleaseDC(hdc);  

	// IDM_ABOUTBOX must be in the system command range.
	....
}

Выводим рисунок по нажатию на кнопку:

void CVCDlg::OnButton1() 
{
	CRect r;
	r.top = 0;
	r.left = 0;
	r.right = 128;
	r.bottom = 92;
	DDBLTFX ddb;
	memset(&ddb,0, sizeof(DDBLTFX));
	ddb.dwSize = sizeof(DDBLTFX);
	ddb.dwDDFX = DDBLTFX_MIRRORLEFTRIGHT;
	PrimarySurf->Blt(r,offscr1,r, DDBLT_WAIT,&ddb);
}

Запускаем, нажимаем, смотрим.


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 14.05.2002