📄 dibble.c
字号:
/*----------------------------------------
DIBBLE.C -- Bitmap and Palette Program
(c) Charles Petzold, 1998
----------------------------------------*/
#include <windows.h>
#include "dibhelp.h"
#include "dibpal.h"
#include "dibconv.h"
#include "resource.h"
#define WM_USER_SETSCROLLS (WM_USER + 1)
#define WM_USER_DELETEDIB (WM_USER + 2)
#define WM_USER_DELETEPAL (WM_USER + 3)
#define WM_USER_CREATEPAL (WM_USER + 4)
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
TCHAR szAppName[] = TEXT ("Dibble") ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
HACCEL hAccel ;
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_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = szAppName ;
wndclass.lpszClassName = szAppName ;
if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
hwnd = CreateWindow (szAppName, szAppName,
WS_OVERLAPPEDWINDOW | WM_VSCROLL | WM_HSCROLL,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL) ;
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
hAccel = LoadAccelerators (hInstance, szAppName) ;
while (GetMessage (&msg, NULL, 0, 0))
{
if (!TranslateAccelerator (hwnd, hAccel, &msg))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
}
return msg.wParam ;
}
/*-------------------------------------------------------------
DisplayDib: Displays or prints DIB actual size or stretched
depending on menu selection
-------------------------------------------------------------*/
int DisplayDib (HDC hdc, HBITMAP hBitmap, int x, int y,
int cxClient, int cyClient,
WORD wShow, BOOL fHalftonePalette)
{
BITMAP bitmap ;
HDC hdcMem ;
int cxBitmap, cyBitmap, iReturn ;
GetObject (hBitmap, sizeof (BITMAP), &bitmap) ;
cxBitmap = bitmap.bmWidth ;
cyBitmap = bitmap.bmHeight ;
SaveDC (hdc) ;
if (fHalftonePalette)
SetStretchBltMode (hdc, HALFTONE) ;
else
SetStretchBltMode (hdc, COLORONCOLOR) ;
hdcMem = CreateCompatibleDC (hdc) ;
SelectObject (hdcMem, hBitmap) ;
switch (wShow)
{
case IDM_SHOW_NORMAL:
if (fHalftonePalette)
iReturn = StretchBlt (hdc, 0, 0,
min (cxClient, cxBitmap - x),
min (cyClient, cyBitmap - y),
hdcMem, x, y,
min (cxClient, cxBitmap - x),
min (cyClient, cyBitmap - y),
SRCCOPY);
else
iReturn = BitBlt (hdc, 0, 0,
min (cxClient, cxBitmap - x),
min (cyClient, cyBitmap - y),
hdcMem, x, y, SRCCOPY) ;
break ;
case IDM_SHOW_CENTER:
if (fHalftonePalette)
iReturn = StretchBlt (hdc, (cxClient - cxBitmap) / 2,
(cyClient - cyBitmap) / 2,
cxBitmap, cyBitmap,
hdcMem, 0, 0, cxBitmap, cyBitmap, SRCCOPY);
else
iReturn = BitBlt (hdc, (cxClient - cxBitmap) / 2,
(cyClient - cyBitmap) / 2,
cxBitmap, cyBitmap,
hdcMem, 0, 0, SRCCOPY) ;
break ;
case IDM_SHOW_STRETCH:
iReturn = StretchBlt (hdc, 0, 0, cxClient, cyClient,
hdcMem, 0, 0, cxBitmap, cyBitmap, SRCCOPY) ;
break ;
case IDM_SHOW_ISOSTRETCH:
SetMapMode (hdc, MM_ISOTROPIC) ;
SetWindowExtEx (hdc, cxBitmap, cyBitmap, NULL) ;
SetViewportExtEx (hdc, cxClient, cyClient, NULL) ;
SetWindowOrgEx (hdc, cxBitmap / 2, cyBitmap / 2, NULL) ;
SetViewportOrgEx (hdc, cxClient / 2, cyClient / 2, NULL) ;
iReturn = StretchBlt (hdc, 0, 0, cxBitmap, cyBitmap,
hdcMem, 0, 0, cxBitmap, cyBitmap, SRCCOPY) ;
break ;
}
DeleteDC (hdcMem) ;
RestoreDC (hdc, -1) ;
return iReturn ;
}
/*--------------------------------------------------------------------
DibFlipHorizontal: Calls non-optimized DibSetPixel and DibGetPixel
--------------------------------------------------------------------*/
HDIB DibFlipHorizontal (HDIB hdibSrc)
{
HDIB hdibDst ;
int cx, cy, x, y ;
if (!DibIsAddressable (hdibSrc))
return NULL ;
if (NULL == (hdibDst = DibCopy (hdibSrc, FALSE)))
return NULL ;
cx = DibWidth (hdibSrc) ;
cy = DibHeight (hdibSrc) ;
for (x = 0 ; x < cx ; x++)
for (y = 0 ; y < cy ; y++)
{
DibSetPixel (hdibDst, x, cy - 1 - y, DibGetPixel (hdibSrc, x, y)) ;
}
return hdibDst ;
}
/*---------------------------------------------------------------
DibRotateRight: Calls optimized DibSetPixelx and DibGetPixelx
---------------------------------------------------------------*/
HDIB DibRotateRight (HDIB hdibSrc)
{
HDIB hdibDst ;
int cx, cy, x, y ;
if (!DibIsAddressable (hdibSrc))
return NULL ;
if (NULL == (hdibDst = DibCopy (hdibSrc, TRUE)))
return NULL ;
cx = DibWidth (hdibSrc) ;
cy = DibHeight (hdibSrc) ;
switch (DibBitCount (hdibSrc))
{
case 1:
for (x = 0 ; x < cx ; x++)
for (y = 0 ; y < cy ; y++)
DibSetPixel1 (hdibDst, cy - y - 1, x,
DibGetPixel1 (hdibSrc, x, y)) ;
break ;
case 4:
for (x = 0 ; x < cx ; x++)
for (y = 0 ; y < cy ; y++)
DibSetPixel4 (hdibDst, cy - y - 1, x,
DibGetPixel4 (hdibSrc, x, y)) ;
break ;
case 8:
for (x = 0 ; x < cx ; x++)
for (y = 0 ; y < cy ; y++)
DibSetPixel8 (hdibDst, cy - y - 1, x,
DibGetPixel8 (hdibSrc, x, y)) ;
break ;
case 16:
for (x = 0 ; x < cx ; x++)
for (y = 0 ; y < cy ; y++)
DibSetPixel16 (hdibDst, cy - y - 1, x,
DibGetPixel16 (hdibSrc, x, y)) ;
break ;
case 24:
for (x = 0 ; x < cx ; x++)
for (y = 0 ; y < cy ; y++)
DibSetPixel24 (hdibDst, cy - y - 1, x,
DibGetPixel24 (hdibSrc, x, y)) ;
break ;
case 32:
for (x = 0 ; x < cx ; x++)
for (y = 0 ; y < cy ; y++)
DibSetPixel32 (hdibDst, cy - y - 1, x,
DibGetPixel32 (hdibSrc, x, y)) ;
break ;
}
return hdibDst ;
}
/*----------------------------------------------------------
PaletteMenu: Uncheck and check menu item on palette menu
----------------------------------------------------------*/
void PaletteMenu (HMENU hMenu, WORD wItemNew)
{
static WORD wItem = IDM_PAL_NONE ;
CheckMenuItem (hMenu, wItem, MF_UNCHECKED) ;
wItem = wItemNew ;
CheckMenuItem (hMenu, wItem, MF_CHECKED) ;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static BOOL fHalftonePalette ;
static DOCINFO di = { sizeof (DOCINFO), TEXT ("Dibble: Printing") } ;
static HBITMAP hBitmap ;
static HDIB hdib ;
static HMENU hMenu ;
static HPALETTE hPalette ;
static int cxClient, cyClient, iVscroll, iHscroll ;
static OPENFILENAME ofn ;
static PRINTDLG printdlg = { sizeof (PRINTDLG) } ;
static TCHAR szFileName [MAX_PATH], szTitleName [MAX_PATH] ;
static TCHAR szFilter[] = TEXT ("Bitmap Files (*.BMP)\0*.bmp\0")
TEXT ("All Files (*.*)\0*.*\0\0") ;
static TCHAR * szCompression[] = {
TEXT ("BI_RGB"), TEXT ("BI_RLE8"), TEXT ("BI_RLE4"),
TEXT ("BI_BITFIELDS"), TEXT ("Unknown") } ;
static WORD wShow = IDM_SHOW_NORMAL ;
BOOL fSuccess ;
BYTE * pGlobal ;
HDC hdc, hdcPrn ;
HGLOBAL hGlobal ;
HDIB hdibNew ;
int iEnable, cxPage, cyPage, iConvert ;
PAINTSTRUCT ps ;
SCROLLINFO si ;
TCHAR szBuffer [256] ;
switch (message)
{
case WM_CREATE:
// Save the menu handle in a static variable
hMenu = GetMenu (hwnd) ;
// Initialize the OPENFILENAME structure for the File Open
// and File Save dialog boxes.
ofn.lStructSize = sizeof (OPENFILENAME) ;
ofn.hwndOwner = hwnd ;
ofn.hInstance = NULL ;
ofn.lpstrFilter = szFilter ;
ofn.lpstrCustomFilter = NULL ;
ofn.nMaxCustFilter = 0 ;
ofn.nFilterIndex = 0 ;
ofn.lpstrFile = szFileName ;
ofn.nMaxFile = MAX_PATH ;
ofn.lpstrFileTitle = szTitleName ;
ofn.nMaxFileTitle = MAX_PATH ;
ofn.lpstrInitialDir = NULL ;
ofn.lpstrTitle = NULL ;
ofn.Flags = OFN_OVERWRITEPROMPT ;
ofn.nFileOffset = 0 ;
ofn.nFileExtension = 0 ;
ofn.lpstrDefExt = TEXT ("bmp") ;
ofn.lCustData = 0 ;
ofn.lpfnHook = NULL ;
ofn.lpTemplateName = NULL ;
return 0 ;
case WM_DISPLAYCHANGE:
SendMessage (hwnd, WM_USER_DELETEPAL, 0, 0) ;
SendMessage (hwnd, WM_USER_CREATEPAL, TRUE, 0) ;
return 0 ;
case WM_SIZE:
// Save the client area width and height in static variables.
cxClient = LOWORD (lParam) ;
cyClient = HIWORD (lParam) ;
wParam = FALSE ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -