⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 handles.cpp

📁 Windows 图形编程 书籍
💻 CPP
字号:
//-----------------------------------------------------------------------------------//
//              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   : handles.cpp					                                     //
//  Description: GDI handles property page, Chapter 3                                //
//  Version    : 1.00.000, May 31, 2000                                              //
//-----------------------------------------------------------------------------------//

#define STRICT

#include <windows.h>
#include <tchar.h>
#include <assert.h>
#include <ddraw.h>
#include "resource.h"
#include "creator.h"
#include "handles.h"

const LPCTSTR Numbers[] = 
{
    _T("1"),
    _T("16"),
    _T("256"),
    _T("4096"),
	_T("65536")
};


const LPCTSTR ObjTypes[] =
{
    _T("Invalid Object"),
    _T("OBJ_PEN"),
    _T("OBJ_BRUSH"),
    _T("OBJ_DC"),
    _T("OBJ_METADC"),
    _T("OBJ_PAL"),
    _T("OBJ_FONT"),       
    _T("OBJ_BITMAP"),     
    _T("OBJ_REGION"),     
    _T("OBJ_METAFILE"),   
    _T("OBJ_MEMDC"),      
    _T("OBJ_EXTPEN"),     
    _T("OBJ_ENHMETADC"),  
    _T("OBJ_ENHMETAFILE")
};


LPCTSTR GetObjectTypeName(HGDIOBJ Handle)
{
	return ObjTypes[GetObjectType(Handle)];
}


BOOL KHGDIOBJ::Generate(HWND rslt, bool search)
{
    if (m_nCreator < 0) return FALSE;
    if (m_nCopy    < 0) return FALSE;

    int repeat = 1;
    for (int i=0; i<m_nCopy; i++)
        repeat *= 16;

    HGDIOBJ last = NULL;

    for (i=0; i<repeat; i++)
    {
        TCHAR temp[64];
		HGDIOBJ handle = CreateObject(m_nCreator, m_hDCScreen, i);

        if ( (handle == last) || (handle == (HGDIOBJ) 0xFFFFFFFF) )
            break;

        wsprintf(temp, "%08lx %s %d", handle, Commands[m_nCreator], i);
        SendMessage(rslt, LB_ADDSTRING, 0, (LPARAM) temp);
            
        last = handle;
    }

    if ( last)
	{
		// find all top level dialog box ( propertysheet )
		for (HWND hWnd = NULL; hWnd = FindWindowEx(NULL, hWnd, WC_DIALOG, NULL); )
		{
			// locate it's fisrt child ( propertypage 0 )
			HWND hChild = GetWindow(hWnd, GW_CHILD);

			// send a message to it
			if (hChild)
				SendMessage(hChild, WM_SHAREHANDLE, (WPARAM) last, GetCurrentProcessId());
		}
	}

    return TRUE;
}


HRESULT DirectDrawTest(HWND hWnd)
{
	LPDIRECTDRAW lpdd;

	HRESULT hr = DirectDrawCreate(NULL, & lpdd, NULL);

	DWORD i = GetCurrentThreadId();

	if ( hr == DD_OK )
	{
		LPDIRECTDRAW lpdd2;

		hr = DirectDrawCreate(NULL, & lpdd2, NULL);

		lpdd->SetCooperativeLevel(hWnd, DDSCL_NORMAL);
	
		DDSURFACEDESC ddsd;
		ddsd.dwSize = sizeof(ddsd);
		ddsd.dwFlags = DDSD_CAPS;
		ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
	
		LPDIRECTDRAWSURFACE lpddsprimary;

		hr = lpdd->CreateSurface(&ddsd, &lpddsprimary, NULL);
		if ( hr == DD_OK )
		{
			char mess[MAX_PATH];

			wsprintf(mess, 
				"DirectDraw object at %x, vtable at %x\n"
	            "DirectDraw surface object at %x, vtable at %x",
				lpdd, * (unsigned *) lpdd, 
				lpddsprimary, * (unsigned *) lpddsprimary);
			MessageBox(NULL, mess, "DirectDrawTest", MB_OK);

			lpddsprimary->Release();
		}

		lpdd->Release();
	}

	return hr;
}


BOOL KHGDIOBJ::OnInitDialog(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
	m_hWnd		   = hWnd;
	m_hDCScreen    = GetDC(hWnd);
    WM_SHAREHANDLE = RegisterWindowMessage("WM_SHAREHANDLE");

    for (int i=0; i<nTotalCommands; i++)
		SendDlgItemMessage(hWnd, IDC_COMMAND, CB_ADDSTRING, 0, (LPARAM) Commands[i]);
    SendDlgItemMessage(hWnd, IDC_COMMAND, CB_SETCURSEL, 0, 0);

    for (i=0; i<sizeof(Numbers)/sizeof(Numbers[0]); i++)
		SendDlgItemMessage(hWnd, IDC_NUMBER, CB_ADDSTRING, 0, (LPARAM) Numbers[i]);
    SendDlgItemMessage(hWnd, IDC_NUMBER, CB_SETCURSEL, 0, 0);

	DirectDrawTest(hWnd);

	return TRUE;
}


BOOL KHGDIOBJ::OnCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
    if (LOWORD(wParam) == IDC_CREATE)
    {
        m_nCreator = SendDlgItemMessage(hWnd, IDC_COMMAND, CB_GETCURSEL, 0, 0);
        m_nCopy    = SendDlgItemMessage(hWnd, IDC_NUMBER,  CB_GETCURSEL, 0, 0);

        Generate(GetDlgItem(hWnd, IDC_RESULT), FALSE);

        return TRUE;
    }

	return FALSE;
}


BOOL KHGDIOBJ::DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    if ( uMsg == WM_SHAREHANDLE )
    {
        TCHAR Mess[MAX_PATH];

        wsprintf(Mess, "Object created in process 0x%X, GetObjectType (0x%x) returns %d, %s",
                            lParam, wParam, GetObjectType((HGDIOBJ) wParam),
                            GetObjectTypeName((HGDIOBJ) wParam));

		if ( GetObjectType((HGDIOBJ) wParam)==OBJ_REGION )
			wsprintf(Mess+strlen(Mess), "rgnsize %d", GetRegionData((HRGN) wParam, 0, NULL));

        SetDlgItemText(hWnd, IDC_SHAREHANDLE, Mess);

        return TRUE;
    }

    switch (uMsg)
    {
	    case WM_INITDIALOG:
		    return OnInitDialog(hWnd, wParam, lParam);

	    case WM_COMMAND:
		    return OnCommand(hWnd, wParam, lParam);
    }
    
    return FALSE;
}

⌨️ 快捷键说明

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