/* Windows 3.0 Bitmap Loader Version 1.00 Started: February 28, 1992 Finished: Developer : Jim Huang */ #include #include #include #include #include #include "bmploadr.h" /* Windows Function - Prototyping */ long FAR PASCAL WndProc (HWND, WORD, WORD, LONG); BOOL FAR PASCAL AboutDlgProc (HWND, WORD, WORD, LONG); BOOL FAR PASCAL FileDlgProc (HWND, WORD, WORD, LONG); BOOL FAR PASCAL SetupDlgProc (HWND, WORD, WORD, LONG); BOOL extern FAR PASCAL SetDeskWallPaper (LPSTR); void SetNextBMP (LPSTR); HANDLE hInst; /* Handle to Windows instances */ char szAppName[] = "BMP", /* Application Name */ szFileName[96], szCurDir[96], Random[4], AutoLoad[4]; int PASCAL WinMain (HANDLE hInstance, HANDLE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) { HWND hwnd; /* Handle to the main Window */ MSG msg; /* MSG structure to store your messages */ WNDCLASS wndclass; /* Windows class structure */ HANDLE hAccel; /* Handle to the accelerator keys */ hInst = hInstance; /* Handle for Windows instances */ /* Create the application window */ if (!hPrevInstance) { wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_BYTEALIGNWINDOW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInst; wndclass.hIcon = LoadIcon (hInstance, szAppName); wndclass.hCursor = LoadCursor (NULL, IDC_ARROW); wndclass.hbrBackground = GetStockObject (WHITE_BRUSH); wndclass.lpszMenuName = szAppName; wndclass.lpszClassName = szAppName; RegisterClass (&wndclass); } /* Create the application windows */ hwnd = CreateWindow (szAppName, "Bitmap Loader", WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_CLIPCHILDREN | WS_OVERLAPPED, 0, 0, 190, 40, NULL, NULL, hInstance, NULL); ShowWindow (hwnd, nCmdShow); UpdateWindow (hwnd); /* Load the accelerator table */ hAccel = LoadAccelerators (hInstance, szAppName); /* Message Handling Loop */ while (GetMessage (&msg, NULL, 0, 0)) { if (!TranslateAccelerator (hwnd, hAccel, &msg)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } } return msg.wParam; } long FAR PASCAL WndProc (HWND hwnd, WORD message, WORD wParam, LONG lParam) { static HANDLE hInstance; /* handle for each instances */ static HCURSOR hCursor; /* handle for the cursor */ static HICON hIcon; /* handle for the icon */ /* Variables determining the position of the scroll bar */ FARPROC lpfn; /* Far Pointer for each dialog box */ HDC hdc; /* handle for the display device */ HMENU hmenu; /* handle for the menu */ PAINTSTRUCT ps; /* holds PAINT information */ char szBuffer[80]; short i; switch (message) { case WM_CREATE: /* The WM_CREATE message is sent once to a window when the */ /* window is created. The window procedure for the new window */ /* receives this message after the window is created, but */ /* before the window becomes visible. */ /* */ /* Parameters: */ /* */ /* lParam - Points to a CREATESTRUCT structure with */ /* the following form: */ /* */ /* typedef struct */ /* { */ /* LPSTR lpCreateParams; */ /* HANDLE hInst; */ /* HANDLE hMenu; */ /* HWND hwndParent; */ /* int cy; */ /* int cx; */ /* int y; */ /* int x; */ /* LONG style; */ /* LPSTR lpszName; */ /* LPSTR lpszClass; */ /* DWORD dwExStyle; */ /* } CREATESTRUCT; */ hIcon = LoadIcon (hInstance, szAppName); hInstance = ((LPCREATESTRUCT) lParam)->hInstance; GetProfileString (szAppName, "BMPSource", NULL, szCurDir, sizeof (szCurDir)); GetProfileString (szAppName, "Wallpaper", NULL, szFileName, sizeof (szFileName)); GetProfileString (szAppName, "AutoLoad", NULL, AutoLoad, sizeof (AutoLoad)); GetProfileString (szAppName, "Random", NULL, Random, sizeof (Random)); if (lstrlen (szFileName)) { lstrcpy (szBuffer, szCurDir); lstrcat (szBuffer, "\\"); lstrcat (szBuffer, szFileName); if (SetDeskWallPaper (szBuffer)) { SetWindowText (hwnd, szFileName); InvalidateRect (GetDesktopWindow(), NULL, TRUE); } } if (!lstrcmpi (Random, "On")) SetNextBMP (szCurDir); if (!lstrlen (szCurDir)) SendMessage (hwnd, WM_COMMAND, IDM_SETUP, 0L); return 0; case WM_COMMAND: /* The Windows messages for action bar and pulldown menu items */ /* are processed here. */ /* The WM_COMMAND message contains the message ID in its first */ /* parameter (wParam). This routine is programmed to SWITCH on */ /* the #define values for the menu items in the application's */ /* header (*.H) file. The ID values have the format, IDM_itemname. */ /* The service routines for the various menu items follow */ /* the CASE statements up to the generated BREAK statements. */ /* Get the menu handle */ hmenu = GetMenu (hwnd); switch (wParam) { case IDM_ABOUT: lpfn = MakeProcInstance (AboutDlgProc, hInstance); DialogBox (hInstance, "AboutDlg", hwnd, lpfn); FreeProcInstance (lpfn); return 0; case IDM_OPEN: lpfn = MakeProcInstance (FileDlgProc, hInstance); DialogBox (hInstance, "FileDlg", hwnd, lpfn); FreeProcInstance (lpfn); SetWindowText (hwnd, szFileName); return 0; case IDM_SETUP: lpfn = MakeProcInstance (SetupDlgProc, hInstance); DialogBox (hInstance, "SetupDlg", hwnd, lpfn); FreeProcInstance (lpfn); return 0; case IDM_EXIT: SendMessage (hwnd, WM_CLOSE, 0, 0L); return 0; } break; case WM_PAINT: /* Obtain a handle to the device context */ /* BeginPaint will sends WM_ERASEBKGND if appropriate */ hdc = BeginPaint (hwnd, &ps); EndPaint (hwnd, &ps); return 0; /* Tell Window to close the application window. Destroy the window */ case WM_CLOSE: DestroyWindow (hwnd); return 0; /* Destroys the window */ case WM_DESTROY: PostQuitMessage (0); return 0; } return DefWindowProc (hwnd, message, wParam, lParam); } /* ***************************************************************************** */ void SetNextBMP (LPSTR dir) { char szBuffer[80]; short i = 0, nextbmp, j; struct _find_t findt; lstrcpy (szBuffer, dir); lstrcat (szBuffer, "\\"); lstrcat (szBuffer, "*.BMP"); srand ((unsigned)time(NULL)); nextbmp = rand(); if (!_dos_findfirst (szBuffer, _A_NORMAL, &findt)) { i++; while (!_dos_findnext (&findt)) i++; _dos_findfirst (szBuffer, _A_NORMAL, &findt); if (i == 0) WriteProfileString (szAppName, "Wallpaper", findt.name); else { for (j = 0; j < nextbmp % i; j++) _dos_findnext (&findt); WriteProfileString (szAppName, "Wallpaper", findt.name); } } } LPSTR lstrchr (LPSTR str, char ch) { while (*str) { if (ch == *str) return str; str = AnsiNext (str); } return NULL; } LPSTR lstrrchr (LPSTR str, char ch) { LPSTR strl = str + lstrlen (str); do { if (ch == *strl) return strl; strl = AnsiPrev (str, strl); } while (strl > str); return NULL; } /* ***************************************************************************** */ BOOL FAR PASCAL AboutDlgProc (HWND hDlg, WORD message, WORD wParam, LONG lParam) { switch (message) { case WM_INITDIALOG: SetDlgItemText (hDlg, IDD_VER, "Version 1.00a"); SetDlgItemText (hDlg, IDD_NAME, "Written by: Jim Huang"); SetDlgItemText (hDlg, IDD_DATE, "Copyright ©1992"); return TRUE; case WM_COMMAND: switch (wParam) { case IDOK: EndDialog (hDlg, 0); return TRUE; } break; } return FALSE; } BOOL FAR PASCAL FileDlgProc (HWND hDlg, WORD message, WORD wParam, LONG lParam) { static char cLastChar, szFName[96] = "*.BMP", szFileSpec[16]; char szBuffer[96]; short nEditLen, count; WORD wFileAttr; switch (message) { case WM_INITDIALOG: lstrcpy (szBuffer, szCurDir); SendDlgItemMessage (hDlg, IDD_FNAME, EM_LIMITTEXT, 80, 0L) ; DlgDirList (hDlg, szBuffer, IDD_DLIST, IDD_FPATH, 0x0010 | 0x4000 | 0x8000); DlgDirList (hDlg, "*.BMP", IDD_FLIST, IDD_FPATH, 0); SetDlgItemText (hDlg, IDD_FNAME, szFName); return TRUE; case WM_COMMAND: switch (wParam) { case IDD_FLIST: switch (HIWORD (lParam)) { case LBN_SELCHANGE: if (DlgDirSelect (hDlg, szFileName, IDD_FLIST)) lstrcat (szFileName, szFileSpec); SetDlgItemText (hDlg, IDD_FNAME, szFileName); return TRUE; case LBN_DBLCLK: if (DlgDirSelect (hDlg, szFileName, IDD_FLIST)) { lstrcat (szFileName, szFileSpec); DlgDirList (hDlg, "*.BMP", IDD_FLIST, IDD_FPATH, 0); SetDlgItemText (hDlg, IDD_FNAME, szFileSpec); } else { SetDlgItemText (hDlg, IDD_FNAME, szFileName); SendMessage (hDlg, WM_COMMAND, IDOK, 0L); } return TRUE ; } break; case IDD_DLIST: switch (HIWORD (lParam)) { case LBN_DBLCLK: if (DlgDirSelect (hDlg, szFileName, IDD_DLIST)) { lstrcat (szFileName, szFileSpec); DlgDirList (hDlg, szFileName, IDD_DLIST, IDD_FPATH, 0x0010 | 0x4000 | 0x8000); DlgDirList (hDlg, "*.BMP", IDD_FLIST, IDD_FPATH, 0); } return TRUE ; } break; case IDD_FNAME: if (HIWORD (lParam) == EN_CHANGE) EnableWindow (GetDlgItem (hDlg, IDOK), (BOOL) SendMessage (LOWORD (lParam), WM_GETTEXTLENGTH, 0, 0L)); return TRUE; case IDOK: GetDlgItemText (hDlg, IDD_FNAME, szFileName, 80); nEditLen = lstrlen (szFileName); cLastChar = *AnsiPrev (szFileName, szFileName + nEditLen); if (cLastChar == '\\' || cLastChar == ':') lstrcat (szFileName, szFileSpec); if (lstrchr (szFileName, '*') || lstrchr (szFileName, '?')) { if (DlgDirList (hDlg, szFileName, IDD_FLIST, IDD_FPATH, wFileAttr)) { lstrcpy (szFileSpec, szFileName); SetDlgItemText (hDlg, IDD_FNAME, szFileSpec); } else MessageBeep (0); return TRUE; } lstrcat (lstrcat (szFileName, "\\"), szFileSpec); if (DlgDirList (hDlg, szFileName, IDD_FLIST, IDD_FPATH, wFileAttr)) { lstrcpy (szFileSpec, szFileName); SetDlgItemText (hDlg, IDD_FNAME, szFileSpec); return TRUE; } szFileName[nEditLen] = '\0'; if (SetDeskWallPaper (szFileName)) { WriteProfileString (szAppName, "Wallpaper", szFileName); WriteProfileString ("windows", "Wallpaper", "(None)"); InvalidateRect (GetDesktopWindow(), NULL, TRUE); } case IDCANCEL : EndDialog (hDlg, FALSE); return TRUE; } } return FALSE; } BOOL FAR PASCAL SetupDlgProc (HWND hDlg, WORD message, WORD wParam, LONG lParam) { switch (message) { case WM_INITDIALOG: if (lstrlen (szCurDir)) SetDlgItemText (hDlg, IDD_DIRECTORY, szCurDir); if (!lstrcmpi (AutoLoad, "On")) CheckDlgButton (hDlg, IDD_CHECK1, 1); if (!lstrcmpi (Random, "On")) CheckDlgButton (hDlg, IDD_CHECK2, 1); return TRUE; case WM_COMMAND: switch (wParam) { case IDOK: GetDlgItemText (hDlg, IDD_DIRECTORY, szCurDir, sizeof (szCurDir)); if (!lstrlen (szCurDir)) { MessageBox (hDlg, "Please Specify the BitMap Directory", NULL, MB_OK | MB_ICONSTOP); return FALSE; } WriteProfileString (szAppName, "BMPSource", szCurDir); if (IsDlgButtonChecked (hDlg, IDD_CHECK1)) WriteProfileString (szAppName, "AutoLoad", "On"); else WriteProfileString (szAppName, "AutoLoad", "Off"); if (IsDlgButtonChecked (hDlg, IDD_CHECK2)) WriteProfileString (szAppName, "Random", "On"); else WriteProfileString (szAppName, "Random", "Off"); case IDCANCEL: EndDialog (hDlg, 0); return TRUE; } break; } return FALSE; }