关于vc ++中的Bitblt [英] About the Bitblt in the vc++

查看:143
本文介绍了关于vc ++中的Bitblt的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

#include <windows.h>

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

					PSTR szCmdLine, int iCmdShow)

{

	static TCHAR szAppName [] = TEXT ("BitBlt") ;

	HWND                          hwnd ;

	MSG                           msg ;

	WNDCLASS                      wndclass ;


	wndclass.style                               = CS_HREDRAW | CS_VREDRAW ;

	wndclass.lpfnWndProc                         = WndProc ;

	wndclass.cbClsExtra                          = 0 ;

	wndclass.cbWndExtra                          = 0 ;

	wndclass.hInstance                           = hInstance ;

	wndclass.hIcon                              = LoadIcon (NULL, IDI_INFORMATION) ;

	wndclass.hCursor                             = LoadCursor (NULL, IDC_ARROW) ;

	wndclass.hbrBackground              = (HBRUSH) GetStockObject (WHITE_BRUSH) ;

	wndclass.lpszMenuName                = NULL ;

	wndclass.lpszClassName               = szAppName ;



	if (!RegisterClass (&wndclass))

	{

		MessageBox (NULL, TEXT ("This program requires Windows NT!"),

			szAppName, MB_ICONERROR) ;

		return 0 ;

	}



	hwnd = CreateWindow (szAppName, TEXT ("BitBlt Demo"),

		WS_OVERLAPPEDWINDOW,

		CW_USEDEFAULT, CW_USEDEFAULT,

		CW_USEDEFAULT, CW_USEDEFAULT,

		NULL, NULL, hInstance, NULL) ;


	ShowWindow (hwnd, iCmdShow) ;

	UpdateWindow (hwnd) ;

	while (GetMessage (&msg, NULL, 0, 0))

	{

		TranslateMessage (&msg) ;

		DispatchMessage (&msg) ;

	}

	return msg.wParam ;

}


LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam,LPARAM lParam)

{

	static int            cxClient, cyClient, cxSource, cySource ;

	HDC                   hdcClient, hdcWindow ;

	int                   x, y ;

	PAINTSTRUCT           ps ;

	RECT r;

	HDC hdcMem;


	switch (message)

	{

	case WM_CREATE:

		cxSource = GetSystemMetrics (SM_CXSIZEFRAME) +

			GetSystemMetrics (SM_CXSIZE) ;

		cySource = GetSystemMetrics (SM_CYSIZEFRAME) +

			GetSystemMetrics (SM_CYCAPTION) ;

		return 0 ;

	case   WM_SIZE:

		cxClient = LOWORD (lParam) ;

		cyClient = HIWORD (lParam) ;

		return 0 ;


	case   WM_PAINT:




		hdcClient = BeginPaint (hwnd, &ps) ;

		/*hdcClient = GetDC(hwnd);*/

		r=ps.rcPaint;
		hdcMem = CreateCompatibleDC(hdcClient);

		hdcWindow = GetWindowDC (hwnd) ;



		for (y = 0 ; y < cyClient ; y += cySource)

			for (x = 0 ; x < cxClient ; x += cxSource)
				BitBlt (hdcMem, x, y, cxSource, cySource,

					hdcWindow, 0, 0, SRCCOPY) ;
			// where the problem exists

			BitBlt(hdcClient,
				r.left,
				r.top,
				r.right-r.left,
				r.bottom-r.top,
				hdcMem,
				r.left,
				r.top,
				SRCCOPY);

			//////////////////////////////////////////////////////////////////////////
			ReleaseDC (hwnd, hdcWindow) ;

			EndPaint (hwnd, &ps) ;

			return 0 ;


	case   WM_DESTROY:

		PostQuitMessage (0) ;

		return 0 ;

	}

	return DefWindowProc (hwnd, message, wParam, lParam) ;

}


我尝试在WM_PAINT中的for下方添加一个代码,即


I try to add a code below the for in the WM_PAINT ,that is

BitBlt(hdcClient,
    r.left,
    r.top,
    r.right-r.left,
    r.bottom-r.top,
    hdcMem,
    r.left,
    r.top,
    SRCCOPY);


,但是这会导致屏幕显示失败.我想知道错误在哪里.希望对我有所帮助.谢谢.


,however this leads to the fail of display on the screen .I wonder where is the error.Hope to help me.Thank you .

推荐答案

问题是仅绘画hdcMem.您需要将所有内容都放到hdcWindow中.
The problem is that your painting only the hdcMem. You need to blast all bit out to your hdcWindow.


这篇关于关于vc ++中的Bitblt的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆