📄 dibble.c
字号:
// fall through
// WM_USER_SETSCROLLS: Programmer-defined Message!
// Set the scroll bars. If the display mode is not normal,
// make them invisible. If wParam is TRUE, reset the
// scroll bar position.
case WM_USER_SETSCROLLS:
if (hdib == NULL || wShow != IDM_SHOW_NORMAL)
{
si.cbSize = sizeof (SCROLLINFO) ;
si.fMask = SIF_RANGE ;
si.nMin = 0 ;
si.nMax = 0 ;
SetScrollInfo (hwnd, SB_VERT, &si, TRUE) ;
SetScrollInfo (hwnd, SB_HORZ, &si, TRUE) ;
}
else
{
// First the vertical scroll
si.cbSize = sizeof (SCROLLINFO) ;
si.fMask = SIF_ALL ;
GetScrollInfo (hwnd, SB_VERT, &si) ;
si.nMin = 0 ;
si.nMax = DibHeight (hdib) ;
si.nPage = cyClient ;
if ((BOOL) wParam)
si.nPos = 0 ;
SetScrollInfo (hwnd, SB_VERT, &si, TRUE) ;
GetScrollInfo (hwnd, SB_VERT, &si) ;
iVscroll = si.nPos ;
// Then the horizontal scroll
GetScrollInfo (hwnd, SB_HORZ, &si) ;
si.nMin = 0 ;
si.nMax = DibWidth (hdib) ;
si.nPage = cxClient ;
if ((BOOL) wParam)
si.nPos = 0 ;
SetScrollInfo (hwnd, SB_HORZ, &si, TRUE) ;
GetScrollInfo (hwnd, SB_HORZ, &si) ;
iHscroll = si.nPos ;
}
return 0 ;
// WM_VSCROLL: Vertically scroll the DIB
case WM_VSCROLL:
si.cbSize = sizeof (SCROLLINFO) ;
si.fMask = SIF_ALL ;
GetScrollInfo (hwnd, SB_VERT, &si) ;
iVscroll = si.nPos ;
switch (LOWORD (wParam))
{
case SB_LINEUP: si.nPos -= 1 ; break ;
case SB_LINEDOWN: si.nPos += 1 ; break ;
case SB_PAGEUP: si.nPos -= si.nPage ; break ;
case SB_PAGEDOWN: si.nPos += si.nPage ; break ;
case SB_THUMBTRACK: si.nPos = si.nTrackPos ; break ;
default: break ;
}
si.fMask = SIF_POS ;
SetScrollInfo (hwnd, SB_VERT, &si, TRUE) ;
GetScrollInfo (hwnd, SB_VERT, &si) ;
if (si.nPos != iVscroll)
{
ScrollWindow (hwnd, 0, iVscroll - si.nPos, NULL, NULL) ;
iVscroll = si.nPos ;
UpdateWindow (hwnd) ;
}
return 0 ;
// WM_HSCROLL: Horizontally scroll the DIB
case WM_HSCROLL:
si.cbSize = sizeof (SCROLLINFO) ;
si.fMask = SIF_ALL ;
GetScrollInfo (hwnd, SB_HORZ, &si) ;
iHscroll = si.nPos ;
switch (LOWORD (wParam))
{
case SB_LINELEFT: si.nPos -= 1 ; break ;
case SB_LINERIGHT: si.nPos += 1 ; break ;
case SB_PAGELEFT: si.nPos -= si.nPage ; break ;
case SB_PAGERIGHT: si.nPos += si.nPage ; break ;
case SB_THUMBTRACK: si.nPos = si.nTrackPos ; break ;
default: break ;
}
si.fMask = SIF_POS ;
SetScrollInfo (hwnd, SB_HORZ, &si, TRUE) ;
GetScrollInfo (hwnd, SB_HORZ, &si) ;
if (si.nPos != iHscroll)
{
ScrollWindow (hwnd, iHscroll - si.nPos, 0, NULL, NULL) ;
iHscroll = si.nPos ;
UpdateWindow (hwnd) ;
}
return 0 ;
// WM_INITMENUPOPUP: Enable or Gray menu items
case WM_INITMENUPOPUP:
if (hdib)
iEnable = MF_ENABLED ;
else
iEnable = MF_GRAYED ;
EnableMenuItem (hMenu, IDM_FILE_SAVE, iEnable) ;
EnableMenuItem (hMenu, IDM_FILE_PRINT, iEnable) ;
EnableMenuItem (hMenu, IDM_FILE_PROPERTIES, iEnable) ;
EnableMenuItem (hMenu, IDM_EDIT_CUT, iEnable) ;
EnableMenuItem (hMenu, IDM_EDIT_COPY, iEnable) ;
EnableMenuItem (hMenu, IDM_EDIT_DELETE, iEnable) ;
if (DibIsAddressable (hdib))
iEnable = MF_ENABLED ;
else
iEnable = MF_GRAYED ;
EnableMenuItem (hMenu, IDM_EDIT_ROTATE, iEnable) ;
EnableMenuItem (hMenu, IDM_EDIT_FLIP, iEnable) ;
EnableMenuItem (hMenu, IDM_CONVERT_01, iEnable) ;
EnableMenuItem (hMenu, IDM_CONVERT_04, iEnable) ;
EnableMenuItem (hMenu, IDM_CONVERT_08, iEnable) ;
EnableMenuItem (hMenu, IDM_CONVERT_16, iEnable) ;
EnableMenuItem (hMenu, IDM_CONVERT_24, iEnable) ;
EnableMenuItem (hMenu, IDM_CONVERT_32, iEnable) ;
switch (DibBitCount (hdib))
{
case 1: EnableMenuItem (hMenu, IDM_CONVERT_01, MF_GRAYED) ; break ;
case 4: EnableMenuItem (hMenu, IDM_CONVERT_04, MF_GRAYED) ; break ;
case 8: EnableMenuItem (hMenu, IDM_CONVERT_08, MF_GRAYED) ; break ;
case 16: EnableMenuItem (hMenu, IDM_CONVERT_16, MF_GRAYED) ; break ;
case 24: EnableMenuItem (hMenu, IDM_CONVERT_24, MF_GRAYED) ; break ;
case 32: EnableMenuItem (hMenu, IDM_CONVERT_32, MF_GRAYED) ; break ;
}
if (hdib && DibColorSize (hdib) > 0)
iEnable = MF_ENABLED ;
else
iEnable = MF_GRAYED ;
EnableMenuItem (hMenu, IDM_PAL_DIBTABLE, iEnable) ;
if (DibIsAddressable (hdib) && DibBitCount (hdib) > 8)
iEnable = MF_ENABLED ;
else
iEnable = MF_GRAYED ;
EnableMenuItem (hMenu, IDM_PAL_OPT_POP4, iEnable) ;
EnableMenuItem (hMenu, IDM_PAL_OPT_POP5, iEnable) ;
EnableMenuItem (hMenu, IDM_PAL_OPT_POP6, iEnable) ;
EnableMenuItem (hMenu, IDM_PAL_OPT_MEDCUT, iEnable) ;
EnableMenuItem (hMenu, IDM_EDIT_PASTE,
IsClipboardFormatAvailable (CF_DIB) ? MF_ENABLED : MF_GRAYED) ;
return 0 ;
// WM_COMMAND: Process all menu commands.
case WM_COMMAND:
iConvert = 0 ;
switch (LOWORD (wParam))
{
case IDM_FILE_OPEN:
// Show the File Open dialog box
if (!GetOpenFileName (&ofn))
return 0 ;
// If there's an existing DIB and palette, delete them
SendMessage (hwnd, WM_USER_DELETEDIB, 0, 0) ;
// Load the DIB into memory
SetCursor (LoadCursor (NULL, IDC_WAIT)) ;
ShowCursor (TRUE) ;
hdib = DibFileLoad (szFileName) ;
ShowCursor (FALSE) ;
SetCursor (LoadCursor (NULL, IDC_ARROW)) ;
// Reset the scroll bars
SendMessage (hwnd, WM_USER_SETSCROLLS, TRUE, 0) ;
// Create the palette and DDB
SendMessage (hwnd, WM_USER_CREATEPAL, TRUE, 0) ;
if (!hdib)
{
MessageBox (hwnd, TEXT ("Cannot load DIB file!"),
szAppName, MB_OK | MB_ICONEXCLAMATION) ;
}
InvalidateRect (hwnd, NULL, TRUE) ;
return 0 ;
case IDM_FILE_SAVE:
// Show the File Save dialog box
if (!GetSaveFileName (&ofn))
return 0 ;
// Save the DIB to memory
SetCursor (LoadCursor (NULL, IDC_WAIT)) ;
ShowCursor (TRUE) ;
fSuccess = DibFileSave (hdib, szFileName) ;
ShowCursor (FALSE) ;
SetCursor (LoadCursor (NULL, IDC_ARROW)) ;
if (!fSuccess)
MessageBox (hwnd, TEXT ("Cannot save DIB file!"),
szAppName, MB_OK | MB_ICONEXCLAMATION) ;
return 0 ;
case IDM_FILE_PRINT:
if (!hdib)
return 0 ;
// Get printer DC
printdlg.Flags = PD_RETURNDC | PD_NOPAGENUMS | PD_NOSELECTION ;
if (!PrintDlg (&printdlg))
return 0 ;
if (NULL == (hdcPrn = printdlg.hDC))
{
MessageBox (hwnd, TEXT ("Cannot obtain Printer DC"),
szAppName, MB_ICONEXCLAMATION | MB_OK) ;
return 0 ;
}
// Check if the printer can print bitmaps
if (!(RC_BITBLT & GetDeviceCaps (hdcPrn, RASTERCAPS)))
{
DeleteDC (hdcPrn) ;
MessageBox (hwnd, TEXT ("Printer cannot print bitmaps"),
szAppName, MB_ICONEXCLAMATION | MB_OK) ;
return 0 ;
}
// Get size of printable area of page
cxPage = GetDeviceCaps (hdcPrn, HORZRES) ;
cyPage = GetDeviceCaps (hdcPrn, VERTRES) ;
fSuccess = FALSE ;
// Send the DIB to the printer
SetCursor (LoadCursor (NULL, IDC_WAIT)) ;
ShowCursor (TRUE) ;
if ((StartDoc (hdcPrn, &di) > 0) && (StartPage (hdcPrn) > 0))
{
DisplayDib (hdcPrn, DibBitmapHandle (hdib), 0, 0,
cxPage, cyPage, wShow, FALSE) ;
if (EndPage (hdcPrn) > 0)
{
fSuccess = TRUE ;
EndDoc (hdcPrn) ;
}
}
ShowCursor (FALSE) ;
SetCursor (LoadCursor (NULL, IDC_ARROW)) ;
DeleteDC (hdcPrn) ;
if (!fSuccess)
MessageBox (hwnd, TEXT ("Could not print bitmap"),
szAppName, MB_ICONEXCLAMATION | MB_OK) ;
return 0 ;
case IDM_FILE_PROPERTIES:
if (!hdib)
return 0 ;
wsprintf (szBuffer, TEXT ("Pixel width:\t%i\n")
TEXT ("Pixel height:\t%i\n")
TEXT ("Bits per pixel:\t%i\n")
TEXT ("Number of colors:\t%i\n")
TEXT ("Compression:\t%s\n"),
DibWidth (hdib), DibHeight (hdib),
DibBitCount (hdib), DibNumColors (hdib),
szCompression [min (3, DibCompression (hdib))]) ;
MessageBox (hwnd, szBuffer, szAppName,
MB_ICONEXCLAMATION | MB_OK) ;
return 0 ;
case IDM_APP_EXIT:
SendMessage (hwnd, WM_CLOSE, 0, 0) ;
return 0 ;
case IDM_EDIT_COPY:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -