📄 bitmaps.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 : bitmaps.cpp //
// Description: Basic bitmap demo program, Chapter 10 //
// Version : 1.00.000, May 31, 2000 //
//-----------------------------------------------------------------------------------//
#define STRICT
#define _WIN32_WINNT 0x0500
#define NOCRYPT
#define OEMRESOURCE
#include <windows.h>
#include <assert.h>
#include <tchar.h>
#include <math.h>
#include "..\..\include\wingraph.h"
#include "..\..\include\CheckMark.h"
#include "..\..\include\BitmapMenu.h"
#include "..\..\include\EditView.h"
#include "..\..\include\Background.h"
#include "Resource.h"
BOOL SaveWindow(HWND hWnd, bool bClient, int nFrame, COLORREF crFrame);
class KDIBView : public KScrollCanvas
{
typedef enum { GAP = 16 };
virtual void OnDraw(HDC hDC, const RECT * rcPaint);
virtual LRESULT WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
void GetWndClassEx(WNDCLASSEX & wc);
HMENU m_hViewMenu;
int m_nViewOpt;
public:
HINSTANCE m_hInst;
KDIB m_DIB;
KDIBView(void)
{
m_hViewMenu = NULL;
m_nViewOpt = IDM_VIEW_STRETCHDIBITS;
}
bool Initialize(const TCHAR * pFileName, HINSTANCE hInstance, KStatusWindow * pStatus)
{
if ( m_DIB.LoadFile(pFileName) )
{
SetSize(m_DIB.GetWidth() + GAP*2,
m_DIB.GetHeight() + GAP*2, 5, 5);
m_hInst = hInstance;
m_pStatus = pStatus;
RegisterClass(_T("DIBView"), hInstance);
return true;
}
else
return false;
}
bool GetTitle(const TCHAR * pFileName, TCHAR * pTitle)
{
if ( pFileName )
{
wsprintf(pTitle, "%s, %d x %d pixel, %d bits", pFileName,
m_DIB.GetWidth(), m_DIB.GetHeight(), m_DIB.GetDepth());
return true;
}
else
return false;
}
};
void KDIBView::GetWndClassEx(WNDCLASSEX & wc)
{
memset(& wc, 0, sizeof(wc));
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = NULL;
wc.hIcon = LoadIcon(m_hInst, MAKEINTRESOURCE(IDI_IMAGE));
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH) (COLOR_GRAYTEXT + 1);
wc.lpszMenuName = NULL;
wc.lpszClassName = NULL;
wc.hIconSm = NULL;
}
LRESULT KDIBView::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch( uMsg )
{
case WM_CREATE:
m_hWnd = hWnd;
m_hViewMenu = LoadMenu(m_hInst, MAKEINTRESOURCE(IDR_DIBVIEW));
return 0;
case WM_PAINT:
return KScrollCanvas::WndProc(hWnd, uMsg, wParam, lParam);
case WM_SIZE:
case WM_HSCROLL:
case WM_VSCROLL:
{
LRESULT lr = KScrollCanvas::WndProc(hWnd, uMsg, wParam, lParam);
int nMin, nMax, nPos;
GetScrollRange(m_hWnd, SB_VERT, &nMin, &nMax);
nPos = GetScrollPos(m_hWnd, SB_VERT);
TCHAR mess[32];
wsprintf(mess, "%d %d %d", nMin, nPos, nMax);
m_pStatus->SetText(0, mess);
return lr;
}
case WM_COMMAND:
switch ( LOWORD(wParam) )
{
case IDM_VIEW_STRETCHDIBITS:
case IDM_VIEW_STRETCHDIBITS4:
case IDM_VIEW_SETDIBITSTODEVICE:
case IDM_VIEW_FITWINDOW:
if ( LOWORD(wParam)!= m_nViewOpt )
{
m_nViewOpt = LOWORD(wParam);
switch ( LOWORD(wParam) )
{
case IDM_VIEW_STRETCHDIBITS:
case IDM_VIEW_SETDIBITSTODEVICE:
SetSize(m_DIB.GetWidth() + GAP*2, m_DIB.GetHeight() + GAP*2, 5, 5, true);
break;
case IDM_VIEW_STRETCHDIBITS4:
SetSize(m_DIB.GetWidth()*2 + GAP*3, m_DIB.GetHeight()*2 + GAP*3, 5, 5, true);
}
InvalidateRect(hWnd, NULL, TRUE);
}
return 0;
case IDM_FILE_SAVEDIB1BPP: SaveWindowToDIB(hWnd, 1, BI_RGB); return 0;
case IDM_FILE_SAVEDIB4BPP: SaveWindowToDIB(hWnd, 4, BI_RGB); return 0;
case IDM_FILE_SAVEDIB4RLE: SaveWindowToDIB(hWnd, 4, BI_RLE4); return 0;
case IDM_FILE_SAVEDIB8BPP: SaveWindowToDIB(hWnd, 8, BI_RGB); return 0;
case IDM_FILE_SAVEDIB8RLE: SaveWindowToDIB(hWnd, 8, BI_RLE8); return 0;
case IDM_FILE_SAVEDIB16BPP: SaveWindowToDIB(hWnd, 16, BI_RGB); return 0;
case IDM_FILE_SAVEDIB16BITFIELDS: SaveWindowToDIB(hWnd, 16, BI_BITFIELDS); return 0;
case IDM_FILE_SAVEDIB24BPP: SaveWindowToDIB(hWnd, 24, BI_RGB); return 0;
case IDM_FILE_SAVEDIB32BPP: SaveWindowToDIB(hWnd, 32, BI_RGB); return 0;
case IDM_FILE_SAVEDIB32BITFIELDS: SaveWindowToDIB(hWnd, 32, BI_BITFIELDS); return 0;
case IDM_FILE_SAVEDIBSECTION: SaveWindow(hWnd, true, 25, RGB(209, 177, 80)); return 0;
case IDM_VIEW_DIBHEXDUMP:
SendMessage(GetParent(GetParent(hWnd)), WM_USER+1, (WPARAM) & m_DIB, 0);
}
return 0;
default:
return CommonMDIChildProc(hWnd, uMsg, wParam, lParam, m_hViewMenu, 3);
}
}
void KDIBView::OnDraw(HDC hDC, const RECT * rcPaint)
{
// HDC hMemDC = CreateCompatibleDC(hDC);
// HBITMAP hBitmap = CreateBitmap(m_DIB.GetWidth(), m_DIB.GetHeight(), 1, 1, NULL);
// HGDIOBJ hOld = SelectObject(hMemDC, hBitmap);
//
// SetBkColor(hMemDC, RGB(0xFF, 0xFF, 0xFF));
// SetTextColor(hMemDC, RGB(0xFF, 0xFF, 0xFF));
// SetStretchBltMode(hMemDC, STRETCH_DELETESCANS);
// m_DIB.StretchDIBits(hMemDC, 0, 0, SRCCOPY);
// BitBlt(hDC, GAP, GAP, m_DIB.GetWidth(), m_DIB.GetHeight(),
// hMemDC, 0, 0, SRCCOPY);
// SelectObject(hMemDC, hOld);
// DeleteObject(hBitmap);
// DeleteObject(hMemDC);
SaveDC(hDC);
// CAffine affine;
// affine.Rotate(5);
// affine.Translate(20, 20);
// SetGraphicsMode(hDC, GM_ADVANCED);
// SetWorldTransform(hDC, & affine.m_xm);
int w = m_DIB.GetWidth();
int h = m_DIB.GetHeight();
switch ( m_nViewOpt )
{
case IDM_VIEW_FITWINDOW:
{
RECT rect;
GetClientRect(m_hWnd, & rect);
m_DIB.DrawDIB(hDC, 0, 0, rect.right, rect.bottom, 0, 0, w, h, SRCCOPY);
}
break;
case IDM_VIEW_STRETCHDIBITS:
m_DIB.DrawDIB(hDC, GAP, GAP, w, h, 0, 0, w, h, SRCCOPY);
break;
case IDM_VIEW_STRETCHDIBITS4:
m_DIB.DrawDIB(hDC, GAP, GAP, w, h, 0, 0, w, h, SRCCOPY);
m_DIB.DrawDIB(hDC, GAP*2+w, GAP, w, h, w, 0, -w, h, SRCCOPY);
m_DIB.DrawDIB(hDC, GAP, GAP*2+h, w, h, 0, h, w, -h, SRCCOPY);
m_DIB.DrawDIB(hDC, GAP*2+w, GAP*2+h, w, h, w, h, -w, -h, SRCCOPY);
break;
case IDM_VIEW_SETDIBITSTODEVICE:
if ( ! m_DIB.IsCompressed() )
{
int bps = m_DIB.GetBPS();
BYTE * buffer = new BYTE[bps];
for (int i=0; i<m_DIB.GetHeight(); i++)
{
memcpy(buffer, m_DIB.GetBits() + bps*i, bps);
for (int j=0; j<bps; j++)
buffer[j] = ~ buffer[j];
m_DIB.SetDIB(hDC, GAP, GAP, i, 1, buffer);
}
delete [] buffer;
}
break;
}
RestoreDC(hDC, -1);
}
//////////////////////
const int TextureID[] =
{
IDB_BRICK01,
IDB_BRICK02,
IDB_WOOD01,
IDB_WOOD02,
IDB_ROCK01,
IDB_MARBLE01,
IDB_PAPER01
};
class KDDBView : public KScrollCanvas
{
typedef enum { GAP = 16 };
virtual void OnDraw(HDC hDC, const RECT * rcPaint);
virtual LRESULT WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
void GetWndClassEx(WNDCLASSEX & wc);
HMENU m_hViewMenu;
int m_nViewOpt;
void TouchMenu(HMENU hMenu);
KCheckMark m_uibmp;
KBitmapMenu m_texture;
public:
KDDBView(void)
{
m_hViewMenu = NULL;
m_nViewOpt = IDM_VIEW_CREATEBITMAP;
}
bool Initialize(HINSTANCE hInstance, KStatusWindow * pStatus)
{
// SetSize(m_DIB.GetWidth() + GAP*2, m_DIB.GetHeight() + GAP*2, 5, 5);
m_hInst = hInstance;
m_pStatus = pStatus;
RegisterClass(_T("DDBView"), hInstance);
return true;
}
void Test_CreateBitmap(HDC hDC, const RECT * rcPaint);
void Test_LargestDDB(HDC hDC, const RECT * rcPaint);
void Test_LoadBitmap(HDC hDC, const RECT * rcPaint);
void Test_Blt(HDC hDC, const RECT * rcPaint);
void Test_Blt_Color(HDC hDC, const RECT * rcPaint);
void Test_Blt_GenMask(HDC hDC, const RECT * rcPaint);
};
void KDDBView::TouchMenu(HMENU hMainMenu)
{
HMENU hMenu = GetSubMenu(hMainMenu, 3);
m_uibmp.LoadToolbar(m_hInst, IDB_LICON, true);
for (int i=0; i<20; i++)
m_uibmp.SetCheckMarks(hMenu, i, MF_BYPOSITION, i, -1);
m_texture.AddToMenu(GetSubMenu(hMainMenu, 4), 7, m_hInst, TextureID, 10);
}
void KDDBView::GetWndClassEx(WNDCLASSEX & wc)
{
memset(& wc, 0, sizeof(wc));
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = NULL;
wc.hIcon = LoadIcon(m_hInst, MAKEINTRESOURCE(IDI_IMAGE));
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = NULL;
wc.hIconSm = NULL;
}
LRESULT KDDBView::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch( uMsg )
{
case WM_CREATE:
m_hWnd = hWnd;
m_hViewMenu = LoadMenu(m_hInst, MAKEINTRESOURCE(IDR_DDBVIEW));
TouchMenu(m_hViewMenu);
return 0;
case WM_PAINT:
return KScrollCanvas::WndProc(hWnd, uMsg, wParam, lParam);
case WM_SIZE:
case WM_HSCROLL:
case WM_VSCROLL:
{
LRESULT lr = KScrollCanvas::WndProc(hWnd, uMsg, wParam, lParam);
int nMin, nMax, nPos;
GetScrollRange(m_hWnd, SB_VERT, &nMin, &nMax);
nPos = GetScrollPos(m_hWnd, SB_VERT);
TCHAR mess[32];
wsprintf(mess, "%d %d %d", nMin, nPos, nMax);
m_pStatus->SetText(0, mess);
return lr;
}
case WM_COMMAND:
switch ( LOWORD(wParam) )
{
case IDM_VIEW_CREATEBITMAP:
case IDM_VIEW_LARGESTDDB:
case IDM_VIEW_LOADBITMAP:
case IDM_VIEW_LOADBITMAPHEX:
case IDM_VIEW_CREATEDIBITMAP:
case IDM_VIEW_CREATEDIBITMAPHEX:
case IDM_VIEW_BLT_NORMAL:
case IDM_VIEW_BLT_CENTER:
case IDM_VIEW_BLT_STRETCH:
case IDM_VIEW_BLT_TILE:
case IDM_VIEW_BLT_STRETCHPROP:
case IDM_VIEW_BITBLT_COLOR:
case IDM_VIEW_GENMASK:
if ( LOWORD(wParam)!= m_nViewOpt )
{
m_nViewOpt = LOWORD(wParam);
InvalidateRect(hWnd, NULL, TRUE);
}
return 0;
default:
switch ( m_texture.OnCommand(LOWORD(wParam)) )
{
case 1: return 0;
case 2: InvalidateRect(hWnd, NULL, TRUE); return 0;
}
break;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -