/*************************************************************************** * * * MODULE : Imagedlg.c * * * * PURPOSE : Dialog functions for ImagEdit's dialogs. * * * * HISTORY : 3/03/89 by LR * * * ***************************************************************************/ #include "imagedit.h" #include "dialogs.h" #include "iehelp.h" #include STATICFN BOOL NEAR NewImageOK(HWND hwnd, INT iType); STATICFN VOID NEAR SelectImageInit(HWND hwnd); STATICFN BOOL NEAR SelectImageOK(HWND hwnd); /************************************************************************ * DlgBox * * This function basically does a DialogBox. * * Arguments: * INT idDlg = Ordinal name of the dialog. * WNDPROC lpfnDlg = Dialog procedure to use (this function will * call Make/FreeProcInstance). * * Returns: * What DialogBox returned. * * History: * ************************************************************************/ INT DlgBox( INT idDlg, WNDPROC lpfnDlg) { WNDPROC lpfnDlgInst; INT nResult; INT idPrevDlg; EnteringDialog(idDlg, &idPrevDlg, TRUE); lpfnDlgInst = (WNDPROC)MakeProcInstance((FARPROC)lpfnDlg, ghInst); nResult = DialogBox(ghInst, MAKEINTRESOURCE(idDlg), ghwndMain, lpfnDlgInst); FreeProcInstance(lpfnDlgInst); EnteringDialog(idPrevDlg, NULL, FALSE); return nResult; } /************************************************************************ * EnteringDialog * * This function enables or disables things based on whether we are * going to show one of the editor's dialogs. It must be called * before and after showing a dialog box. * * Arguments: * INT idDlg - Ordinal name of the dialog. * PINT pidPrevDlg - Points to where to save the id of the previous * (current) dialog. If fEntering is FALSE, this * is not used and should be NULL. * BOOL fEntering - TRUE if about ready to show the dialog. FALSE if * the dialog was just dismissed. For the FALSE case, * the idDlg should be zero, or the id of the previous * dialog. * * History: * ************************************************************************/ VOID EnteringDialog( INT idDlg, PINT pidPrevDlg, BOOL fEntering) { /* * If we are entering a new dialog, save the previous dialog * in the place specified. */ if (fEntering) *pidPrevDlg = gidCurrentDlg; gidCurrentDlg = idDlg; if (ghwndToolbox) EnableWindow(ghwndToolbox, !fEntering); if (ghwndColor) EnableWindow(ghwndColor, !fEntering); if (ghwndView) EnableWindow(ghwndView, !fEntering); } /************************************************************************ * ImageNewDialog * * * * History: * ************************************************************************/ VOID ImageNewDialog( INT iType) { switch (iType) { case FT_ICON: DlgBox(DID_NEWICONIMAGE, (WNDPROC)NewIconImageDlgProc); break; case FT_CURSOR: DlgBox(DID_NEWCURSORIMAGE, (WNDPROC)NewCursorImageDlgProc); break; } } /************************************************************************ * ImageSelectDialog * * * * History: * ************************************************************************/ VOID ImageSelectDialog(VOID) { switch (giType) { case FT_ICON: DlgBox(DID_SELECTICONIMAGE, (WNDPROC)SelectImageDlgProc); break; case FT_CURSOR: DlgBox(DID_SELECTCURSORIMAGE, (WNDPROC)SelectImageDlgProc); break; } } /************************************************************************ * ResourceTypeDlgProc * * Gets from the user the type of resource image that they want * to edit (bitmap, icon or cursor). * * History: * ************************************************************************/ DIALOGPROC ResourceTypeDlgProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { INT idChecked; switch (msg) { case WM_INITDIALOG: switch (giType) { case FT_BITMAP: idChecked = DID_RESOURCETYPEBITMAP; break; case FT_ICON: idChecked = DID_RESOURCETYPEICON; break; case FT_CURSOR: idChecked = DID_RESOURCETYPECURSOR; break; } CheckDlgButton(hwnd, idChecked, 1); CenterWindow(hwnd); break; case WM_COMMAND: switch (GET_WM_COMMAND_ID(wParam, lParam)) { case IDOK: if (IsDlgButtonChecked(hwnd, DID_RESOURCETYPEBITMAP)) iNewFileType = FT_BITMAP; else if (IsDlgButtonChecked(hwnd, DID_RESOURCETYPEICON)) iNewFileType = FT_ICON; else iNewFileType = FT_CURSOR; EndDialog(hwnd, IDOK); break; case IDCANCEL: EndDialog(hwnd, IDCANCEL); break; case IDHELP: WinHelp(ghwndMain, gszHelpFile, HELP_CONTEXT, HELPID_RESOURCETYPE); break; } break; default: return FALSE; } return TRUE; } /************************************************************************ * NewIconImageDlgProc * * * * Arguments: * * History: * ************************************************************************/ DIALOGPROC NewIconImageDlgProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { HWND hwndList; INT iSel; PDEVICE pDevice; switch (msg) { case WM_INITDIALOG: hwndList = GetDlgItem(hwnd, DID_NEWIMAGELIST); SendMessage(hwndList, LB_RESETCONTENT, 0, 0); for (pDevice = gpIconDeviceHead; pDevice; pDevice = pDevice->pDeviceNext) { if (!DeviceLinkUsed(pDevice)) { iSel = (INT)SendMessage(hwndList, LB_INSERTSTRING, (WPARAM)-1, (LONG)(LPSTR)pDevice->szDesc); SendMessage(hwndList, LB_SETITEMDATA, iSel, (DWORD)(LPSTR)pDevice); } } /* * Select the first item. */ SendMessage(hwndList, LB_SETCURSEL, 0, 0L); CenterWindow(hwnd); break; case WM_COMMAND: switch (GET_WM_COMMAND_ID(wParam, lParam)) { case DID_NEWIMAGELIST: if (GET_WM_COMMAND_CMD(wParam, lParam) == LBN_DBLCLK) { if (NewImageOK(hwnd, FT_ICON)) EndDialog(hwnd, IDOK); } break; case IDOK: if (NewImageOK(hwnd, FT_ICON)) EndDialog(hwnd, IDOK); break; case IDCANCEL: EndDialog(hwnd, IDCANCEL); break; case IDHELP: WinHelp(ghwndMain, gszHelpFile, HELP_CONTEXT, HELPID_NEWICONIMAGE); break; } break; default: return FALSE; } return TRUE; } /************************************************************************ * NewImageOK * * Processes the selection of a new image from the New Icon (Cursor) * Image dialog procedures. * * History: * ************************************************************************/ STATICFN BOOL NEAR NewImageOK( HWND hwnd, INT iType) { HWND hwndLB; INT iSelect; PDEVICE pDevice; hwndLB = GetDlgItem(hwnd, DID_NEWIMAGELIST); if ((iSelect = (INT)SendMessage(hwndLB, LB_GETCURSEL, 0, 0)) != LB_ERR) { /* * Save away the current image. */ ImageSave(); pDevice = (PDEVICE)SendMessage(hwndLB, LB_GETITEMDATA, iSelect, 0); if (ImageNew(pDevice)) return TRUE; } return FALSE; } /************************************************************************ * NewCursorImageDlgProc * * * * Arguments: * * History: * ************************************************************************/ DIALOGPROC NewCursorImageDlgProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { HWND hwndList; INT iSel; PDEVICE pDevice; switch (msg) { case WM_INITDIALOG: hwndList = GetDlgItem(hwnd, DID_NEWIMAGELIST); SendMessage(hwndList, LB_RESETCONTENT, 0, 0); for (pDevice = gpCursorDeviceHead; pDevice; pDevice = pDevice->pDeviceNext) { if (!DeviceLinkUsed(pDevice)) { iSel = (INT)SendMessage(hwndList, LB_INSERTSTRING, (WPARAM)-1, (LONG)(LPSTR)pDevice->szDesc); SendMessage(hwndList, LB_SETITEMDATA, iSel, (DWORD)(LPSTR)pDevice); } } /* * Select the first item. */ SendMessage(hwndList, LB_SETCURSEL, 0, 0L); CenterWindow(hwnd); break; case WM_COMMAND: switch (GET_WM_COMMAND_ID(wParam, lParam)) { case DID_NEWIMAGELIST: if (GET_WM_COMMAND_CMD(wParam, lParam) == LBN_DBLCLK) { if (NewImageOK(hwnd, FT_CURSOR)) EndDialog(hwnd, IDOK); } break; case IDOK: if (NewImageOK(hwnd, FT_CURSOR)) EndDialog(hwnd, IDOK); break; case IDCANCEL: EndDialog(hwnd, IDCANCEL); break; case IDHELP: WinHelp(ghwndMain, gszHelpFile, HELP_CONTEXT, HELPID_NEWCURSORIMAGE); break; } break; default: return FALSE; } return TRUE; } /************************************************************************ * SelectImageDlgProc * * This is the Select Image dialog procedure. This proc is used for both * icon and cursor images. * * History: * ************************************************************************/ DIALOGPROC SelectImageDlgProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: SelectImageInit(hwnd); return TRUE; case WM_COMMAND: switch (GET_WM_COMMAND_ID(wParam, lParam)) { case DID_SELECTIMAGELIST: if (GET_WM_COMMAND_CMD(wParam, lParam) == LBN_DBLCLK) { if (SelectImageOK(hwnd)) EndDialog(hwnd, IDOK); } break; case IDOK: if (SelectImageOK(hwnd)) EndDialog(hwnd, IDOK); break; case IDCANCEL: EndDialog(hwnd, IDCANCEL); break; case IDHELP: WinHelp(ghwndMain, gszHelpFile, HELP_CONTEXT, (giType == FT_ICON) ? HELPID_SELECTICONIMAGE : HELPID_SELECTCURSORIMAGE); break; } return TRUE; default: return FALSE; } } /************************************************************************ * SelectImageInit * * Processes the WM_INITDIALOG message for the Open Image dialog * procedure. * * This function fills the listbox with the names of all the current * images for the current icon/cursor file. * * History: * ************************************************************************/ STATICFN VOID NEAR SelectImageInit( HWND hwnd) { HWND hwndLB; INT i; PIMAGEINFO pImage; hwndLB = GetDlgItem(hwnd, DID_SELECTIMAGELIST); for (pImage = gpImageHead; pImage; pImage = pImage->pImageNext) { i = (INT)SendMessage(hwndLB, LB_INSERTSTRING, (WPARAM)-1, pImage->pDevice ? (DWORD)(LPSTR)pImage->pDevice->szDesc : (DWORD)(LPSTR)ids(IDS_UNKNOWNIMAGEFORMAT)); SendMessage(hwndLB, LB_SETITEMDATA, i, (DWORD)(LPSTR)pImage); } /* * Select the first item. */ SendMessage(hwndLB, LB_SETCURSEL, 0, 0L); CenterWindow(hwnd); } /************************************************************************ * SelectImageOK * * Processes the selection of a new image from the Open Image * dialog procedure. * * History: * ************************************************************************/ STATICFN BOOL NEAR SelectImageOK( HWND hwnd) { HWND hwndLB; INT iSelect; PIMAGEINFO pImage; hwndLB = GetDlgItem(hwnd, DID_SELECTIMAGELIST); if ((iSelect = (INT)SendMessage(hwndLB, LB_GETCURSEL, 0, 0)) == LB_ERR) return FALSE; /* * Get a pointer to the selected image (stored in the listbox * items data field). */ pImage = (PIMAGEINFO)SendMessage(hwndLB, LB_GETITEMDATA, iSelect, 0L); return ImageOpen(pImage); } /************************************************************************ * BitmapSizeDlgProc * * Dialog that asks for the width, height and number of colors for * a new bitmap file. * * The last values that the user successfully entered are remembered, * and these values will be the defaults the next time that the * dialog is invoked. * * History: * ************************************************************************/ DIALOGPROC BitmapSizeDlgProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { static INT cxLast = DEFAULTBITMAPWIDTH; static INT cyLast = DEFAULTBITMAPHEIGHT; static INT nColorsLast = DEFAULTBITMAPCOLORS; INT cx; INT cy; BOOL fTranslated; INT nColors; switch (msg) { case WM_INITDIALOG: SetDlgItemInt(hwnd, DID_BITMAPSIZEWIDTH, cxLast, TRUE); SetDlgItemInt(hwnd, DID_BITMAPSIZEHEIGHT, cyLast, TRUE); if (nColorsLast == 16) CheckRadioButton(hwnd, DID_BITMAPSIZE2, DID_BITMAPSIZE16, DID_BITMAPSIZE16); else CheckRadioButton(hwnd, DID_BITMAPSIZE2, DID_BITMAPSIZE16, DID_BITMAPSIZE2); CenterWindow(hwnd); break; case WM_COMMAND: switch (GET_WM_COMMAND_ID(wParam, lParam)) { case IDOK: cx = GetDlgItemInt(hwnd, DID_BITMAPSIZEWIDTH, &fTranslated, FALSE); if (!fTranslated) { SetFocus(GetDlgItem(hwnd, DID_BITMAPSIZEWIDTH)); Message(MSG_ENTERANUMBER); break; } cy = GetDlgItemInt(hwnd, DID_BITMAPSIZEHEIGHT, &fTranslated, FALSE); if (!fTranslated) { SetFocus(GetDlgItem(hwnd, DID_BITMAPSIZEHEIGHT)); Message(MSG_ENTERANUMBER); break; } if (IsDlgButtonChecked(hwnd, DID_BITMAPSIZE2)) nColors = 2; else nColors = 16; if (ImageNewBitmap(cx, cy, nColors)) { cxLast = cx; cyLast = cy; nColorsLast = nColors; EndDialog(hwnd, IDOK); } break; case IDCANCEL: EndDialog(hwnd, IDCANCEL); break; case IDHELP: WinHelp(ghwndMain, gszHelpFile, HELP_CONTEXT, HELPID_BITMAPSIZE); break; } break; default: return FALSE; } return TRUE; }