📄 wndproc.c
字号:
fEnable = (UINT)SendMessage(hWndEdit, WM_GETTEXTLENGTH, 0, 0); EnableMenuItem(hmenuTrackPopup, IDM_EDIT_SELECT_ALL, (fEnable ? MF_ENABLED : MF_DISABLED|MF_GRAYED)|MF_BYCOMMAND); EnableMenuItem(hmenuTrackPopup, IDM_CLEAR_STATUS, (fEnable ? MF_ENABLED : MF_DISABLED|MF_GRAYED)|MF_BYCOMMAND); /* Draw and track the "floating" popup */#ifdef WIN32 TrackPopupMenuEx(hmenuTrackPopup, TPM_LEFTALIGN | TPM_TOPALIGN | /* default values */ TPM_LEFTBUTTON | TPM_HORIZONTAL | /* equivalent to 0 */ TPM_RIGHTBUTTON, /* Right selection */ pt.x, pt.y, hWndEdit, NULL);#else TrackPopupMenu(hmenuTrackPopup, TPM_LEFTALIGN | /* default values */ TPM_LEFTBUTTON | TPM_RIGHTBUTTON, /* Right selection */ pt.x, pt.y, 0, hWnd, NULL);#endif } return 0; } /* * * This section is solely to cause the bubble help to be drawn with * different colors than the background window. This is not necessary * for 16 bit windows, as this is done for you. * */#ifdef WIN32 case WM_CTLCOLORSTATIC: { POINT point; SetBkColor((HDC)wParam, GetSysColor(COLOR_INFOBK)); SetBkMode((HDC)wParam, OPAQUE); SetTextColor((HDC)wParam, GetSysColor(COLOR_INFOTEXT)); point.x = point.y = 0; ClientToScreen(hWnd, &point); SetBrushOrgEx((HDC)wParam, point.x, point.y, NULL); hBrush = CreateSolidBrush(GetSysColor(COLOR_INFOBK)); return ((DWORD)hBrush); }#endif case WM_COMMAND: /* Was F1 just pressed in a menu, or are we in help mode */ /* (Shift-F1)? */ if (uf.fHelp) { GetHelpContext(wParam); if ((!dwHelpContextId) && (uf.fHelp)) { MessageBox( hWnd, "Context Help not available for this item", "Help Example", MB_OK); } else if (uf.fHelp) WinHelp(hWnd,szHelpFileName,HELP_CONTEXT,dwHelpContextId); uf.fHelp = FALSE; } else /* not in help mode */ {#ifndef WIN32 RECT rClient;#endif switch (LOWORD(wParam)) { case IDM_GREP_ARCHIVE: { extern char baseDir[PATH_MAX]; extern char SearchPattern[PATH_MAX]; char *p, drive[2], szTmp[PATH_MAX]; OPENFILENAME ofn;#ifndef WIN32 FARPROC lpfnGrepArchive;#endif// dwCommDlgHelpId = HELPID_MAKEDIR_HELP; /* if someone hits help */ if ( uf.fCanDragDrop ) DragAcceptFiles( hWnd, FALSE );#ifndef WIN32 _fmemset(&ofn, '\0', sizeof(OPENFILENAME)); /* initialize struct */#else memset(&ofn, '\0', sizeof(OPENFILENAME)); /* initialize struct */#endif WinAssert(hWnd); szTmp[0] = '\0'; ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hWnd; ofn.hInstance = hInst; ofn.lpstrFilter = "All Files (*.*)\0*.*\0\0"; ofn.nFilterIndex = 1; ofn.lpstrFile = szTmp; ofn.nMaxFile = PATH_MAX; ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = PATH_MAX; /* ignored ! */ ofn.lpstrTitle = (LPSTR)"Find Files in Archive"; ofn.lpstrInitialDir = NULL; ofn.Flags = OFN_SHOWHELP | OFN_ENABLEHOOK | OFN_CREATEPROMPT | OFN_HIDEREADONLY | OFN_ENABLETEMPLATE | OFN_NOCHANGEDIR;#ifndef WIN32 lpfnGrepArchive = MakeProcInstance((FARPROC)GrepArchiveProc, hInst);# ifndef MSC (UINT CALLBACK *)ofn.lpfnHook = (UINT CALLBACK *)lpfnGrepArchive;# else ofn.lpfnHook = lpfnGrepArchive;# endif#else ofn.lpfnHook = (LPOFNHOOKPROC)GrepArchiveProc;#endif ofn.lpTemplateName = "GREPARCHIVES"; /* see grep.dlg */ GetOpenFileName(&ofn); if ((lstrlen(SearchPattern) != 0) && (lstrlen(baseDir) != 0)) { drive[0] = baseDir[0]; drive[1] = '\0'; p = &baseDir[2]; /* Off we go - the control handle is set to null as a flag */ FindFile(drive, p, NULL); } } if (uf.fCanDragDrop) DragAcceptFiles(hWnd, TRUE); break;#ifndef WIN32 /* Deal with the Edit box menu items */ case IDM_EDIT_UNDO: SendMessage(hWndEdit, EM_UNDO, 0, 0); break; case IDM_EDIT_CUT: SendMessage(hWndEdit, WM_CUT, 0, 0); break; case IDM_EDIT_COPY: SendMessage(hWndEdit, WM_COPY, 0, 0); break; case IDM_EDIT_PASTE: SendMessage(hWndEdit, WM_PASTE, 0, 0); break; case IDM_EDIT_DELETE: SendMessage(hWndEdit, WM_CLEAR, 0, 0); SetWindowText(hWndStatic, "WiZ Edit/Status Window"); break; case IDM_EDIT_SELECT_ALL: SendMessage(hWndEdit, EM_SETSEL, (WPARAM)0, (LPARAM)MAKELPARAM(0,-1)); break;#endif case IDM_ZIP_TARGET: case IDM_ZIP_PREFERENCES: case IDM_UNZIP_PREFERENCES: if ( uf.fCanDragDrop ) DragAcceptFiles( hWnd, FALSE ); ZipWndProc(hWnd, wMessage, wParam, lParam); WriteZipOptionsProfile(); if ( uf.fCanDragDrop ) DragAcceptFiles( hWnd, TRUE ); break; case IDM_OPEN: /* If unzipping separately and previous file exists, * go to directory where archive lives. */ if ( uf.fCanDragDrop ) DragAcceptFiles( hWnd, FALSE ); /* If not unzipping to same directory as archive and * file already open, go to where file lives. * If extracting to different directory, return to * that directory after selecting archive to open. */ if (lpumb->szUnzipFromDirName[0]) { lstrcpy(lpumb->szDirName, lpumb->szUnzipFromDirName); } if (lpumb->szFileName[0]) { /* strip off filename to make directory name */ GetArchiveDir(lpumb->szDirName); } else { if (!lpumb->szUnzipFromDirName[0]) lpumb->szDirName[0] = '\0'; /* assume no dir */ } lpumb->szBuffer[0] = '\0';#ifndef WIN32 _fmemset(&lpumb->ofn, '\0', sizeof(OPENFILENAME)); /* initialize struct */#else memset(&lpumb->ofn, '\0', sizeof(OPENFILENAME)); /* initialize struct */#endif lpumb->ofn.lStructSize = sizeof(OPENFILENAME); lpumb->ofn.hwndOwner = hWnd; lpumb->ofn.lpstrFilter = "Zip Files (*.zip)\0*.zip\0Self-extracting Files (*.exe)\0*.exe\0All Files (*.*)\0*.*\0\0"; lpumb->ofn.nFilterIndex = 1; lpumb->ofn.lpstrFile = lpumb->szFileName; lpumb->szFileName[0] = '\0'; /* no initial filename */ lpumb->ofn.nMaxFile = PATH_MAX; lpumb->ofn.lpstrFileTitle = lpumb->szBuffer; /* ignored */ lpumb->ofn.lpstrInitialDir = (LPSTR)(!lpumb->szDirName[0] ? NULL : lpumb->szDirName); lpumb->ofn.nMaxFileTitle = PATH_MAX; lpumb->ofn.Flags = OFN_SHOWHELP | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY|OFN_NOVALIDATE; dwCommDlgHelpId = HELPID_OPEN; /* specify correct help for open dlg */ if (GetOpenFileName(&lpumb->ofn)) /* if successful file open */ { /* Yes, you should be able to get the fully qualified path name in lpumb->szFileName when you return from GetOpenFileName(), however, at least Borland 4.52 (others?) does not return a fully qualified path, but simply the file name. This kludge gets around that. */ getcwd(lpumb->szDirName, PATH_MAX); /* If we get a fully qualified file name, then the second character should be a colon. */ if (lpumb->szFileName[1] != ':') { lstrcpy(lpumb->szBuffer, lpumb->szDirName); if (lpumb->szBuffer[lstrlen(lpumb->szBuffer)-1] != '\\') lstrcat(lpumb->szBuffer, "\\"); lstrcat(lpumb->szBuffer, lpumb->szFileName); lstrcpy(lpumb->szFileName, lpumb->szBuffer); } /* Save the last "unzip from" directory */ if (lpumb->szDirName[1] == ':') drive = lpumb->szDirName[0]; else drive = '\0'; if (uf.fSaveUnZipFromDir && (toupper(drive) != 'A') && (toupper(drive) != 'B')) { lstrcpy(lpumb->szUnzipFromDirName, lpumb->szDirName); if (lpumb->szUnzipFromDirName[strlen(lpumb->szUnzipFromDirName)-1] == ':') lstrcat(lpumb->szUnzipFromDirName, "\\"); WritePrivateProfileString(szAppName, szDefaultUnzipFromDir, lpumb->szUnzipFromDirName, szWiZIniFile); } else WritePrivateProfileString(szAppName, szDefaultUnzipFromDir, "", szWiZIniFile); if (uf.fUnzipToZipDir || /* unzipping to same directory as archive */ szUnzipToDirName[0] == '\0') /* or no default */ { /* strip off filename to make directory name */ lstrcpy(szUnzipToDirName, lpumb->szDirName); } } UpdateListBox(); /* fill in list box */#ifndef WIN32 SendMessage(hWndList, LB_SETSEL, 1, 0L);#else ListViewSetSel(0, TRUE);#endif UpdateButtons(); /* update state of buttons */ SetCaption(hWnd);#ifndef WIN32 /* Update archive totals area */ WinAssert(hWndList); GetClientRect( hWndList, &rClient ); OffsetRect( &rClient, 0, dyChar ); rClient.top = rClient.bottom; rClient.bottom = rClient.top + (6*dyChar); InvalidateRect( hWnd, &rClient, TRUE);#endif if ( uf.fCanDragDrop ) DragAcceptFiles( hWnd, TRUE ); break; case IDM_CHDIR: if ( uf.fCanDragDrop ) DragAcceptFiles( hWnd, FALSE );#ifndef WIN32 _fmemset(&lpumb->ofn, '\0', sizeof(OPENFILENAME)); /* initialize struct */#else memset(&lpumb->ofn, '\0', sizeof(OPENFILENAME)); /* initialize struct */#endif lpumb->ofn.lStructSize = sizeof(OPENFILENAME); lpumb->ofn.hwndOwner = hWnd; lpumb->ofn.hInstance = hInst; lpumb->ofn.lpstrFilter = "All Files (*.*)\0*.*\0\0"; lpumb->ofn.nFilterIndex = 1; lstrcpy(lpumb->szUnzipToDirNameTmp, szUnzipToDirName); /* initialize */ { /* Braces are here to allow the declaration of uDirNameLen */#ifndef WIN32 size_t uDirNameLen = _fstrlen(lpumb->szUnzipToDirNameTmp);#else size_t uDirNameLen = strlen(lpumb->szUnzipToDirNameTmp);#endif /* If '\\' not at end of directory name, add it now. */ if (uDirNameLen > 0 && lpumb->szUnzipToDirNameTmp[uDirNameLen-1] != '\\') lstrcat(lpumb->szUnzipToDirNameTmp, "\\"); } lstrcat(lpumb->szUnzipToDirNameTmp, "johnny\376\376.\375\374\373"); /* fake name */ lpumb->ofn.lpstrFile = lpumb->szUnzipToDirNameTmp; /* result goes here! */ lpumb->ofn.nMaxFile = PATH_MAX; lpumb->ofn.lpstrFileTitle = NULL; lpumb->ofn.nMaxFileTitle = PATH_MAX; /* ignored ! */ lpumb->ofn.lpstrInitialDir = szUnzipToDirName; lpumb->ofn.lpstrTitle = (LPSTR)"Unzip To"; lpumb->ofn.Flags = OFN_SHOWHELP | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY|OFN_NOCHANGEDIR; lpumb->ofn.Flags = OFN_SHOWHELP | OFN_PATHMUSTEXIST | OFN_ENABLEHOOK | OFN_HIDEREADONLY|OFN_ENABLETEMPLATE|OFN_NOCHANGEDIR;#ifndef WIN32 lpfnSelectDir = MakeProcInstance((FARPROC)SelectDirProc, hInst);#ifndef MSC (UINT CALLBACK *)lpumb->ofn.lpfnHook = (UINT CALLBACK *)lpfnSelectDir;#else lpumb->ofn.lpfnHook = lpfnSelectDir;#endif#else lpumb->ofn.lpfnHook = (LPOFNHOOKPROC)SelectDirProc;#endif lpumb->ofn.lpTemplateName = "SELDIR"; /* see seldir.dlg */ dwCommDlgHelpId = HELPID_CHDIR; /* in case user hits "help" button */ if (GetSaveFileName(&lpumb->ofn)) /* successfully got dir name ? */ {#ifndef WIN32 ptr = _fstrrchr(lpumb->ofn.lpstrFile, '\\');#else ptr = strrchr(lpumb->ofn.lpstrFile, '\\');#endif if (ptr != NULL) lpumb->ofn.lpstrFile[(int)(ptr - lpumb->ofn.lpstrFile)] = '\0'; lstrcpy(szUnzipToDirName, lpumb->ofn.lpstrFile); /* save result */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -