//-------------------------------------- // たばさラインクリップ // tabasa_lineclip.cpp ver. 1.60 // // _lineclip.txtに // クリップボードのテキストを保存 // OPENメニューまたは¥キーで読込みファイル変更 // 右クリックまたは.キー(shiftなし>)で履歴進む // 左クリックまたは,キー(shiftなし<)で履歴戻る // >キーで履歴100進む // <キーで履歴100戻る // またはスクロールバーいじる // キーボード(半角一文字)で、呼び出し。 // Ctrl+Aで、表示履歴(20個) // 下半分編集画面(変更は,ただちにクリップボードに反映、くどいかも) // ファイル操作は、未完成 // // // borlandcではだめ? // 2000/12/08(金)-2000/12/11(月) // 2000 Copyright charlie, // All rights reserved // happypoint@geocities.co.jp // http://www.geocities.co.jp/SiliconValley-Bay/6716/ // // /*----------------------------------------- CLIPVIEW.C -- Simple Clipboard Viewer (c) Charles Petzold, 1998 -----------------------------------------*/ #include #include "resource.h" #include #include #include #include LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; LRESULT CALLBACK ScrollProc (HWND, UINT, WPARAM, LPARAM) ; WNDPROC OldScroll; #ifdef UNICODE #define clipformat CF_UNICODETEXT #else #define clipformat CF_TEXT #endif #define MODORU 1 #define SUSUMU 2 #define SAIGO 3 #define idBUTTON 0 #define idEDIT 1 #define idSCROLL 2 long INDEXMAX=5000; long INDEXMIN=20; HGLOBAL hGlobal ; const int buffmax=2048; const int namemax=80; long indexmax=0; long clipfilemax=0; char backfname[buffmax]="_lineclip_bak.txt"; char initial[buffmax]="tabasa_lineclip.ini"; char specialfname[buffmax]="_linespecial.txt"; char defaultname[buffmax]="_lineclip.txt"; char outfname[buffmax]="_lineclip.txt"; char infname[buffmax]="_lineclip.txt"; char mark[]="\n"; char LDOWN=','; char RDOWN='.'; char LDOWNS='<'; char RDOWNS='>'; char FILECH='\\'; TCHAR szMenuName[] = TEXT ("tabasa_clip") ; TCHAR szAppName[] = TEXT ("tabasa_lineclip") ; TCHAR szTitleName[] = TEXT ("たばさ") ; const int titlemax=namemax-strlen(szTitleName)-3; char buff[buffmax]="tabasa_lineclip"; char pathname[buffmax]; char titlename[buffmax]; HWND hwndNextViewer ; OPENFILENAME ofn; #ifdef UNICODE #define CF_TCHAR CF_UNICODETEXT TCHAR szDefaultText[] = TEXT ("Default Text - Unicode Version") ; TCHAR szCaption[] = TEXT ("Clipboard Text Transfers - Unicode Version") ; #else #define CF_TCHAR CF_TEXT TCHAR szDefaultText[] = TEXT ("Default Text - ANSI Version") ; TCHAR szCaption[] = TEXT ("Clipboard Text Transfers - ANSI Version") ; #endif void PopFileInitialize (HWND hwnd) { static TCHAR szFilter[] = TEXT ("Text Files (*.TXT)\0*.txt\0") \ TEXT ("ASCII Files (*.ASC)\0*.asc\0") \ TEXT ("All Files (*.*)\0*.*\0\0") ; ofn.lStructSize = sizeof (OPENFILENAME) ; ofn.hwndOwner = hwnd ; ofn.hInstance = NULL ; ofn.lpstrFilter = szFilter ; ofn.lpstrCustomFilter = NULL ; ofn.nMaxCustFilter = 0 ; ofn.nFilterIndex = 0 ; ofn.lpstrFile = NULL ; // Set in Open and Close functions ofn.nMaxFile = MAX_PATH ; ofn.lpstrFileTitle = NULL ; // Set in Open and Close functions ofn.nMaxFileTitle = MAX_PATH ; ofn.lpstrInitialDir = NULL ; ofn.lpstrTitle = NULL ; ofn.Flags = 0 ; // Set in Open and Close functions ofn.nFileOffset = 0 ; ofn.nFileExtension = 0 ; ofn.lpstrDefExt = TEXT ("txt") ; ofn.lCustData = 0L ; ofn.lpfnHook = NULL ; ofn.lpTemplateName = NULL ; } BOOL PopFileOpenDlg (HWND hwnd, PTSTR pstrFileName, PTSTR pstrTitleName) { ofn.hwndOwner = hwnd ; ofn.lpstrFile = pstrFileName ; ofn.lpstrFileTitle = pstrTitleName ; ofn.Flags = OFN_HIDEREADONLY | OFN_CREATEPROMPT ; return GetOpenFileName (&ofn) ; } int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { HACCEL hAccel ; HWND hwnd ; MSG msg ; WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ;//| CS_DBLCLKS wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (hInstance, MAKEINTRESOURCE(IDI_ICON1)) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName = szMenuName ; wndclass.lpszClassName = szAppName ; if (!RegisterClass (&wndclass)) { MessageBox (NULL, TEXT ("This program requires Windows NT!"), szAppName, MB_ICONERROR) ; return 0 ; } hwnd = CreateWindow (szAppName, szAppName, WS_CLIPSIBLINGS|WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL) ; ShowWindow (hwnd, SW_MINIMIZE) ; UpdateWindow (hwnd) ; hAccel = LoadAccelerators (hInstance, szMenuName) ; while (GetMessage (&msg, NULL, 0, 0)) { if (!TranslateAccelerator (hwnd, hAccel, &msg)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } } return msg.wParam ; } clipfile_open(ofstream &out,ifstream &in) { out.open(outfname,ios::in|ios::ate); in.open(infname); } clipfile_close(ofstream &out,ifstream &in) { out.close(); in.close(); } int readdata(ifstream &in,long &index) { char dummy; in.get(buff,buffmax,mark[0]); if(in.eof())return -1; for(int i=0;i0;i--)indexs[i]=indexs[i-1]; indexs[0]=index; } getindex(long &index,long *indexs,int historymax) { index=indexs[0]; for(int i=0;i>max1; if(init.eof())return; init>>max2; clipfilemax=max1; INDEXMAX=max2; } writeinit(ofstream &init) { init<hInstance, NULL) ; hwndEdit = CreateWindow (TEXT ("edit"), NULL, WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | WS_BORDER | ES_LEFT | ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL, 0, 0, 0, 0, hwnd, (HMENU) idEDIT, hInstance,NULL) ; hwndScroll = CreateWindow (TEXT ("scrollbar"), NULL, WS_CHILD | WS_VISIBLE | WS_TABSTOP | SBS_HORZ, 0, 0, 0, 0, hwnd, (HMENU) idSCROLL, hInstance, NULL) ; SetScrollRange (hwndScroll, SB_CTL, 1, indexmax, FALSE) ; SetScrollPos (hwndScroll, SB_CTL, indexmax, FALSE) ; OldScroll = (WNDPROC) SetWindowLong (hwndScroll, GWL_WNDPROC, (LONG) ScrollProc) ; hwndNextViewer = SetClipboardViewer (hwnd) ; SendMessage (hwnd, WM_LBUTTONDOWN, wParam, lParam) ; return 0 ; case WM_SIZE : ; cxClient = LOWORD (lParam) ; cyClient = HIWORD (lParam) ; MoveWindow (hwndButton, cxClient-10 * btncxChar, 0, 10 * btncxChar, 7 * btncyChar / 4, TRUE) ; MoveWindow (hwndEdit, 0, cyClient/5, cxClient, cyClient-cyClient/5, TRUE) ; MoveWindow (hwndScroll, 0, cyClient/5 - scrollbarsize - 2 * cyChar, cxClient - 4 * cyChar, scrollbarsize+ 2 * cyChar, TRUE) ; //SetFocus (hwnd) ; return 0 ; case WM_SETFOCUS : SetFocus (hwndScroll) ; return 0 ; case WM_HSCROLL : // SetScrollRange (hwndScroll, SB_CTL, 0, indexmax, FALSE) ; GetWindowLong ((HWND) lParam, GWL_ID) ; switch (LOWORD (wParam)) { case SB_PAGEDOWN : color += 15 ; // fall through case SB_LINEDOWN : color = min (indexmax, color + 1) ; break ; case SB_PAGEUP : color -= 15 ; // fall through case SB_LINEUP : color = max (1, color - 1) ; break ; case SB_TOP : color = 1 ; break ; case SB_BOTTOM : color = indexmax ; break ; case SB_THUMBPOSITION : SendMessage (hwnd, WM_KEYUP, wParam, lParam) ; case SB_THUMBTRACK : color = HIWORD (wParam) ; break ; case SB_ENDSCROLL: SendMessage (hwnd, WM_KEYUP, wParam, lParam) ; break ; default : break ; } //SetScrollPos (hwndScroll, SB_CTL, color, TRUE) ; index = color+1; SendMessage (hwnd, WM_LBUTTONDOWN, LDOWN, lParam) ; // InvalidateRect (hwnd, NULL, TRUE) ; return 0 ; case WM_INITMENUPOPUP: EnableMenuItem ((HMENU) wParam, IDM_EDIT_PASTE, IsClipboardFormatAvailable (clipformat) ? MF_ENABLED : MF_GRAYED) ; bEnable = pText ? MF_ENABLED : MF_GRAYED ; EnableMenuItem ((HMENU) wParam, IDM_EDIT_CUT, bEnable) ; EnableMenuItem ((HMENU) wParam, IDM_EDIT_COPY, bEnable) ; EnableMenuItem ((HMENU) wParam, IDM_EDIT_CLEAR, bEnable) ; break ; case WM_COMMAND: switch (LOWORD (wParam)) { case idEDIT: switch (HIWORD (wParam)) { case EN_UPDATE: GetWindowTextLength(hwndEdit); GetWindowText(hwndEdit,buff,buffmax); setclip(pText,pGlobal,hwndEdit); // SendMessage (hwnd, WM_LBUTTONDOWN, wParam, lParam) ; break; } return 0 ; case idBUTTON: outspecial(); SetFocus (hwndScroll) ; return 0 ; case IDM_EDIT_PASTE: clipfile_close(out,in); PopFileInitialize (hwnd); if(PopFileOpenDlg (hwnd,pathname,titlename)) strcpy(infname,pathname); clipfile_open(out,in); index=1; indexmax=0; SendMessage (hwnd, WM_LBUTTONDOWN, wParam, lParam) ; return 0 ; case IDM_EDIT_CUT: case IDM_EDIT_COPY: return 0 ; // fall through for IDM_EDIT_CUT case IDM_EDIT_CLEAR: return 0 ; case IDM_EDIT_RESET: SendMessage (hwnd, WM_DESTROY, wParam, lParam) ; return 0 ; case ID_PLUSTOP: getindex(index,indexs,historymax); getindex(index,indexs,historymax); index++; SendMessage (hwnd, WM_LBUTTONDOWN, wParam, lParam) ; return 0 ; case ID_PLUSTAIL: return 0 ; case IDM_COLOR: return 0 ; case IDM_HELP: system("notepad readme.txt"); return 0 ; case IDM_FOLDER: system("explorer ."); return 0 ; case IDM_RESET: clipfile_close(out,in); strcpy(infname,defaultname); strcpy(outfname,defaultname); clipfile_open(out,in); index=1; indexmax=0; SendMessage (hwnd, WM_LBUTTONDOWN, wParam, lParam) ; return 0 ; } break ; case WM_CHANGECBCHAIN: if ((HWND) wParam == hwndNextViewer) hwndNextViewer = (HWND) lParam ; else if (hwndNextViewer) SendMessage (hwndNextViewer, message, wParam, lParam) ; return 0 ; case WM_DRAWCLIPBOARD: GetClientRect (hwnd, &rect) ; OpenClipboard (hwnd) ; hGlobal = GetClipboardData (clipformat) ; if (hGlobal != NULL) { pGlobal = (PTSTR) GlobalLock (hGlobal) ; if (strlen(pGlobal) != 0) { strncpy(buff,pGlobal,buffmax-1); //buff[buffmax-1]='\0'; if(GetClipboardOwner()!=hwnd) { out<INDEXMAX+INDEXMIN) { index=0; onindexmax(out,in,index); indexmax -= INDEXMAX; } index=indexmax; } if(GetClipboardOwner()!=hwndEdit) { SetWindowText(hwndEdit,buff); } } GlobalUnlock (hGlobal) ; } CloseClipboard () ; if (hwndNextViewer) SendMessage (hwndNextViewer, message, wParam, lParam) ; settitle(hwnd,titlename,buff,titlemax);//タイトルバーに表示、これがないと、最小化のとき、タイトルが変更されない? InvalidateRect (hwnd, NULL, TRUE) ; return 0 ; case WM_KEYUP: case WM_LBUTTONUP: case WM_RBUTTONUP: SetFocus (hwndScroll) ; setclip(pText,pGlobal,hwnd); return 0 ; case WM_CHAR: if(wParam==FILECH)// { SendMessage (hwnd, WM_COMMAND, IDM_EDIT_PASTE, lParam) ; return 0 ; } if(wParam==LDOWN || wParam==LDOWNS)// < { SendMessage (hwnd, WM_LBUTTONDOWN, wParam, lParam) ; return 0 ; } if(wParam==RDOWN || wParam==RDOWNS)// > { SendMessage (hwnd, WM_RBUTTONDOWN, wParam, lParam) ; return 0 ; } if (in.eof()) { index=0; clipfile_close(out,in); clipfile_open(out,in); } do { readdata(in,index); } while(wParam!=buff[0] && !in.eof()); if (in.eof()) { clipfile_close(out,in); clipfile_open(out,in); index=0; } InvalidateRect (hwnd, NULL, TRUE) ; return 0 ; case WM_PAINT: SetScrollRange (hwndScroll, SB_CTL, 1, indexmax, TRUE) ; SetScrollPos (hwndScroll, SB_CTL, index, TRUE) ; hdc = BeginPaint (hwnd, &ps) ; /* DeleteObject((HGDIOBJ)SetClassLong(hwnd,GCL_HBRBACKGROUND, (LONG)CreateSolidBrush( 0x009900))); SetBkColor(hdc,0x009900); */ GetClientRect (hwnd, &rect) ; sprintf(textbuff,"[in:%s]-index:%u-[len:%d]\n%s",infname,index,strlen(buff),buff); DrawText (hdc, textbuff, -1, &rect, DT_EXPANDTABS) ; settitle(hwnd,titlename,buff,titlemax);//タイトルバーに表示 for(i=historymax;i>0;i--)indexs[i]=indexs[i-1]; indexs[0]=index; EndPaint (hwnd, &ps) ; return 0 ; case WM_LBUTTONDOWN: sflag=MODORU; indexto=index-1; if(wParam==LDOWNS)indexto=index-100 ; //100戻る if(indexto<0)indexto=1; clipfile_close(out,in); clipfile_open(out,in); index=0; searchclip(sflag,out,in,index,indexto, pText,pGlobal,hwnd); InvalidateRect (hwnd, NULL, TRUE) ; return 0 ; case WM_RBUTTONDOWN: sflag=SUSUMU; indexto=1 ; if(wParam==RDOWNS)indexto=100 ; //100進む searchclip(sflag,out,in,index,indexto, pText,pGlobal,hwnd); if(in.eof()) { clipfile_close(out,in); clipfile_open(out,in); index=0; searchclip(sflag,out,in,index,indexto, pText,pGlobal,hwnd); } InvalidateRect (hwnd, NULL, TRUE) ; return 0 ; case WM_LBUTTONDBLCLK: InvalidateRect (hwndEdit, NULL, TRUE) ; SetFocus (hwndEdit) ; return 0 ; case WM_RBUTTONDBLCLK: SendMessage (hwnd, WM_RBUTTONDOWN, RDOWNS, lParam) ; return 0 ; case WM_DESTROY: ChangeClipboardChain (hwnd, hwndNextViewer) ; PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; } LRESULT CALLBACK ScrollProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { int id = GetWindowLong (hwnd, GWL_ID) ; HWND wparent=(HWND)GetWindowLong(hwnd,GWL_HWNDPARENT); switch (message) { case WM_KEYDOWN : if (wParam == VK_TAB) SetFocus (GetDlgItem (GetParent (hwnd), (id + (GetKeyState (VK_SHIFT) < 0 ? 2 : 1)) % 3)) ; break ; case WM_CHAR: case WM_KEYUP: SendMessage (wparent, message, wParam, lParam) ; break ; } return CallWindowProc ((FARPROC) OldScroll, hwnd, message, wParam, lParam) ; }