logwindow.cpp

来自「Windows 图形编程 书籍」· C++ 代码 · 共 145 行

CPP
145
字号
//-----------------------------------------------------------------------------------//
//              Windows Graphics Programming: Win32 GDI and DirectDraw               //
//                             ISBN  0-13-086985-6                                   //
//                                                                                   //
//  Written            by  Yuan, Feng                             www.fengyuan.com   //
//  Copyright (c) 2000 by  Hewlett-Packard Company                www.hp.com         //
//  Published          by  Prentice Hall PTR, Prentice-Hall, Inc. www.phptr.com      //
//                                                                                   //
//  FileName   : logwindow.cpp						                                 //
//  Description: Generic Text-based Logging Window                                   //
//  Version    : 1.00.000, May 31, 2000                                              //
//-----------------------------------------------------------------------------------//

#define STRICT
#define WIN32_LEAN_AND_MEAN

#include <windows.h>
#include <assert.h>
#include <tchar.h>
#include <stdio.h>
#include <stdarg.h>

#include "win.h"
#include "logwindow.h"


void KLogWindow::Create(HINSTANCE hInst, const TCHAR * pTitle, HICON hIcon)
{
	m_hInst = hInst;
	m_hIcon = hIcon;

	CreateEx(0, _T("LOGWINDOW"), pTitle, WS_VISIBLE | WS_OVERLAPPEDWINDOW, 
		0, 0, 240, 600, NULL, NULL, hInst);
}


LRESULT KLogWindow::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch( uMsg )
	{
		case WM_CREATE:
			{
				m_hWnd	   = hWnd;

				RECT rect;
				GetClientRect(m_hWnd, & rect);

				m_hEditWnd = CreateWindow(_T("EDIT"), NULL,  
					WS_VISIBLE | WS_CHILD | ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL, 
					0, 0, rect.right, rect.bottom, m_hWnd, NULL, m_hInst, NULL);

				SendMessage(m_hEditWnd, WM_SETFONT, (LPARAM) GetStockObject(SYSTEM_FIXED_FONT), 0);
				SendMessage(m_hEditWnd, EM_LIMITTEXT, 2 * 1024 * 1024, 0);
			}

			return 0;

		case WM_SIZE:
			MoveWindow(m_hEditWnd, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);	
			return 0;

		case WM_NCDESTROY:
			delete this; // deallocate itself
			return 0;

		default:
			return DefWindowProc(hWnd, uMsg, wParam, lParam);
	}
}


void KLogWindow::Log(const char * format, ...)
{
    char buffer[1024];

    va_list ap;

	va_start(ap, format);
	vsprintf(buffer, format, ap);
	SendMessage(m_hEditWnd, EM_SETSEL, 0xFFFFFF, 0xFFFFFF);
	SendMessage(m_hEditWnd, EM_REPLACESEL, 0, (LPARAM) buffer);

	va_end(ap);
}


void KLogWindow::DumpRegion(const char * mess, HRGN hRgn, bool detail, int p1)
{
	if ( mess )
		Log(mess, p1);

	if ( hRgn==NULL )
		Log(" NULL");
	else
	{
		RECT rect;

		memset(& rect, 0, sizeof(rect));
	
		switch ( GetRgnBox(hRgn, & rect) )
		{
			case NULLREGION: 
				Log(" NULLREGION "); break;

			case SIMPLEREGION:
				Log(" SIMPLEREGION "); break;

			case COMPLEXREGION:
				Log(" COMPLEXREGION "); break;

			default:
				Log(" Error "); break;
		}

		Log(" RgnBox=[%d, %d, %d, %d) ", rect.left, rect.top, rect.right, rect.bottom);

		int size = GetRegionData(hRgn, 0, NULL);
		int rectcount = 0;

		if ( size )
		{
			RGNDATA * pRegion = (RGNDATA *) new char[size];
			GetRegionData(hRgn, size, pRegion);

			const RECT * pRect = (const RECT *) & pRegion->Buffer;
			rectcount = pRegion->rdh.nCount;

			Log("%d rectangles", rectcount);

			if ( detail )
			{
				Log("\r\n");
				for (unsigned i=0; i<pRegion->rdh.nCount; i++)
					Log("rect %d [%d, %d, %d, %d)\r\n", i, pRect[i].left, pRect[i].top, pRect[i].right, pRect[i].bottom);
			}

			delete [] (char *) pRegion;
		}
		else
			Log("0 rectangle");
	}

	Log("\r\n");
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?