📄 dibble.c
字号:
case IDM_EDIT_CUT:
if (!(hGlobal = DibCopyToPackedDib (hdib, TRUE)))
return 0 ;
OpenClipboard (hwnd) ;
EmptyClipboard () ;
SetClipboardData (CF_DIB, hGlobal) ;
CloseClipboard () ;
if (LOWORD (wParam) == IDM_EDIT_COPY)
return 0 ;
// fall through for IDM_EDIT_CUT
case IDM_EDIT_DELETE:
SendMessage (hwnd, WM_USER_DELETEDIB, 0, 0) ;
InvalidateRect (hwnd, NULL, TRUE) ;
return 0 ;
case IDM_EDIT_PASTE:
OpenClipboard (hwnd) ;
hGlobal = GetClipboardData (CF_DIB) ;
pGlobal = GlobalLock (hGlobal) ;
// If there's an existing DIB and palette, delete them.
// Then convert the packed DIB to an HDIB.
if (pGlobal)
{
SendMessage (hwnd, WM_USER_DELETEDIB, 0, 0) ;
hdib = DibCopyFromPackedDib ((BITMAPINFO *) pGlobal) ;
SendMessage (hwnd, WM_USER_CREATEPAL, TRUE, 0) ;
}
GlobalUnlock (hGlobal) ;
CloseClipboard () ;
// Reset the scroll bars
SendMessage (hwnd, WM_USER_SETSCROLLS, TRUE, 0) ;
InvalidateRect (hwnd, NULL, TRUE) ;
return 0 ;
case IDM_EDIT_ROTATE:
if (hdibNew = DibRotateRight (hdib))
{
DibDelete (hdib) ;
DeleteObject (hBitmap) ;
hdib = hdibNew ;
hBitmap = DibCopyToDdb (hdib, hwnd, hPalette) ;
SendMessage (hwnd, WM_USER_SETSCROLLS, TRUE, 0) ;
InvalidateRect (hwnd, NULL, TRUE) ;
}
else
{
MessageBox (hwnd, TEXT ("Not enough memory"),
szAppName, MB_OK | MB_ICONEXCLAMATION) ;
}
return 0 ;
case IDM_EDIT_FLIP:
if (hdibNew = DibFlipHorizontal (hdib))
{
DibDelete (hdib) ;
DeleteObject (hBitmap) ;
hdib = hdibNew ;
hBitmap = DibCopyToDdb (hdib, hwnd, hPalette) ;
InvalidateRect (hwnd, NULL, TRUE) ;
}
else
{
MessageBox (hwnd, TEXT ("Not enough memory"),
szAppName, MB_OK | MB_ICONEXCLAMATION) ;
}
return 0 ;
case IDM_SHOW_NORMAL:
case IDM_SHOW_CENTER:
case IDM_SHOW_STRETCH:
case IDM_SHOW_ISOSTRETCH:
CheckMenuItem (hMenu, wShow, MF_UNCHECKED) ;
wShow = LOWORD (wParam) ;
CheckMenuItem (hMenu, wShow, MF_CHECKED) ;
SendMessage (hwnd, WM_USER_SETSCROLLS, FALSE, 0) ;
InvalidateRect (hwnd, NULL, TRUE) ;
return 0 ;
case IDM_CONVERT_32: iConvert += 8 ;
case IDM_CONVERT_24: iConvert += 8 ;
case IDM_CONVERT_16: iConvert += 8 ;
case IDM_CONVERT_08: iConvert += 4 ;
case IDM_CONVERT_04: iConvert += 3 ;
case IDM_CONVERT_01: iConvert += 1 ;
SetCursor (LoadCursor (NULL, IDC_WAIT)) ;
ShowCursor (TRUE) ;
hdibNew = DibConvert (hdib, iConvert) ;
ShowCursor (FALSE) ;
SetCursor (LoadCursor (NULL, IDC_ARROW)) ;
if (hdibNew)
{
SendMessage (hwnd, WM_USER_DELETEDIB, 0, 0) ;
hdib = hdibNew ;
SendMessage (hwnd, WM_USER_CREATEPAL, TRUE, 0) ;
InvalidateRect (hwnd, NULL, TRUE) ;
}
else
{
MessageBox (hwnd, TEXT ("Not enough memory"),
szAppName, MB_OK | MB_ICONEXCLAMATION) ;
}
return 0 ;
case IDM_APP_ABOUT:
MessageBox (hwnd, TEXT ("Dibble (c) Charles Petzold, 1998"),
szAppName, MB_OK | MB_ICONEXCLAMATION) ;
return 0 ;
}
// All the other WM_COMMAND messages are from the palette
// items. Any existing palette is deleted, and the cursor
// is set to the hourglass.
SendMessage (hwnd, WM_USER_DELETEPAL, 0, 0) ;
SetCursor (LoadCursor (NULL, IDC_WAIT)) ;
ShowCursor (TRUE) ;
// Notice that all messages for palette items are ended
// with break rather than return. This is to allow
// additional processing later on.
switch (LOWORD (wParam))
{
case IDM_PAL_DIBTABLE:
hPalette = DibPalDibTable (hdib) ;
break ;
case IDM_PAL_HALFTONE:
hdc = GetDC (hwnd) ;
if (hPalette = CreateHalftonePalette (hdc))
fHalftonePalette = TRUE ;
ReleaseDC (hwnd, hdc) ;
break ;
case IDM_PAL_ALLPURPOSE:
hPalette = DibPalAllPurpose () ;
break ;
case IDM_PAL_GRAY2: hPalette = DibPalUniformGrays ( 2) ; break ;
case IDM_PAL_GRAY3: hPalette = DibPalUniformGrays ( 3) ; break ;
case IDM_PAL_GRAY4: hPalette = DibPalUniformGrays ( 4) ; break ;
case IDM_PAL_GRAY8: hPalette = DibPalUniformGrays ( 8) ; break ;
case IDM_PAL_GRAY16: hPalette = DibPalUniformGrays ( 16) ; break ;
case IDM_PAL_GRAY32: hPalette = DibPalUniformGrays ( 32) ; break ;
case IDM_PAL_GRAY64: hPalette = DibPalUniformGrays ( 64) ; break ;
case IDM_PAL_GRAY128: hPalette = DibPalUniformGrays (128) ; break ;
case IDM_PAL_GRAY256: hPalette = DibPalUniformGrays (256) ; break ;
case IDM_PAL_RGB222: hPalette = DibPalUniformColors (2,2,2); break;
case IDM_PAL_RGB333: hPalette = DibPalUniformColors (3,3,3); break;
case IDM_PAL_RGB444: hPalette = DibPalUniformColors (4,4,4); break;
case IDM_PAL_RGB555: hPalette = DibPalUniformColors (5,5,5); break;
case IDM_PAL_RGB666: hPalette = DibPalUniformColors (6,6,6); break;
case IDM_PAL_RGB775: hPalette = DibPalUniformColors (7,7,5); break;
case IDM_PAL_RGB757: hPalette = DibPalUniformColors (7,5,7); break;
case IDM_PAL_RGB577: hPalette = DibPalUniformColors (5,7,7); break;
case IDM_PAL_RGB884: hPalette = DibPalUniformColors (8,8,4); break;
case IDM_PAL_RGB848: hPalette = DibPalUniformColors (8,4,8); break;
case IDM_PAL_RGB488: hPalette = DibPalUniformColors (4,8,8); break;
case IDM_PAL_OPT_POP4:
hPalette = DibPalPopularity (hdib, 4) ;
break ;
case IDM_PAL_OPT_POP5:
hPalette = DibPalPopularity (hdib, 5) ;
break ;
case IDM_PAL_OPT_POP6:
hPalette = DibPalPopularity (hdib, 6) ;
break ;
case IDM_PAL_OPT_MEDCUT:
hPalette = DibPalMedianCut (hdib, 6) ;
break ;
}
// After processing Palette items from the menu, the cursor
// is restored to an arrow, the menu item is checked, and
// the window is invalidated.
hBitmap = DibCopyToDdb (hdib, hwnd, hPalette) ;
ShowCursor (FALSE) ;
SetCursor (LoadCursor (NULL, IDC_ARROW)) ;
if (hPalette)
PaletteMenu (hMenu, (LOWORD (wParam))) ;
InvalidateRect (hwnd, NULL, TRUE) ;
return 0 ;
// This programmer-defined message deletes an existing DIB
// in preparation for getting a new one. Invoked during
// File Open command, Edit Paste command, and others.
case WM_USER_DELETEDIB:
if (hdib)
{
DibDelete (hdib) ;
hdib = NULL ;
}
SendMessage (hwnd, WM_USER_DELETEPAL, 0, 0) ;
return 0 ;
// This programmer-defined message deletes an existing palette
// in preparation for defining a new one.
case WM_USER_DELETEPAL:
if (hPalette)
{
DeleteObject (hPalette) ;
hPalette = NULL ;
fHalftonePalette = FALSE ;
PaletteMenu (hMenu, IDM_PAL_NONE) ;
}
if (hBitmap)
DeleteObject (hBitmap) ;
return 0 ;
// Programmers-defined message to create a new palette based on
// a new DIB. If wParam == TRUE, create a DDB as well.
case WM_USER_CREATEPAL:
if (hdib)
{
hdc = GetDC (hwnd) ;
if (!(RC_PALETTE & GetDeviceCaps (hdc, RASTERCAPS)))
{
PaletteMenu (hMenu, IDM_PAL_NONE) ;
}
else if (hPalette = DibPalDibTable (hdib))
{
PaletteMenu (hMenu, IDM_PAL_DIBTABLE) ;
}
else if (hPalette = CreateHalftonePalette (hdc))
{
fHalftonePalette = TRUE ;
PaletteMenu (hMenu, IDM_PAL_HALFTONE) ;
}
ReleaseDC (hwnd, hdc) ;
if ((BOOL) wParam)
hBitmap = DibCopyToDdb (hdib, hwnd, hPalette) ;
}
return 0 ;
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;
if (hPalette)
{
SelectPalette (hdc, hPalette, FALSE) ;
RealizePalette (hdc) ;
}
if (hBitmap)
{
DisplayDib (hdc,
fHalftonePalette ? DibBitmapHandle (hdib) : hBitmap,
iHscroll, iVscroll,
cxClient, cyClient,
wShow, fHalftonePalette) ;
}
EndPaint (hwnd, &ps) ;
return 0 ;
case WM_QUERYNEWPALETTE:
if (!hPalette)
return FALSE ;
hdc = GetDC (hwnd) ;
SelectPalette (hdc, hPalette, FALSE) ;
RealizePalette (hdc) ;
InvalidateRect (hwnd, NULL, TRUE) ;
ReleaseDC (hwnd, hdc) ;
return TRUE ;
case WM_PALETTECHANGED:
if (!hPalette || (HWND) wParam == hwnd)
break ;
hdc = GetDC (hwnd) ;
SelectPalette (hdc, hPalette, FALSE) ;
RealizePalette (hdc) ;
UpdateColors (hdc) ;
ReleaseDC (hwnd, hdc) ;
break ;
case WM_DESTROY:
if (hdib)
DibDelete (hdib) ;
if (hBitmap)
DeleteObject (hBitmap) ;
if (hPalette)
DeleteObject (hPalette) ;
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -