⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 strview.cpp

📁 用win32sdk实现的迷你阅读器
💻 CPP
字号:
#include"StrView.h"



//const int WM_MOUSEWHEEL=522;
//((int)(sizeof devcaps/sizeof devcaps[0]))

extern HWND				hTree;
extern int				numline;
extern LPCTSTR			TmpStr;
extern BOOL			ScrollCheck;
extern HMENU		hRMenu;
int CALLBACK WndProcStr(HWND hWnd, unsigned wMessage,WPARAM wParam, LPARAM lParam)
{	
	static int cxChar,cxCaps,cyChar,cyClient,iVscrollPos,cxClient;
	static int iDeltaPerLine, iAccumDelta ;
	static int iMaxWidth;
	POINT stPos;
	ULONG ulScrollLines ; // for mouse wheel logic
	HDC hdc;
//	int i,y;
	int iVertPos;
	PAINTSTRUCT ps;
//	TCHAR szBuffer[10];
	TEXTMETRIC tm;

	SCROLLINFO si;
	switch (wMessage)
	{
	 case WM_CREATE:
		 hdc=GetDC(hWnd);
		 GetTextMetrics(hdc,&tm);
		 cxChar=tm.tmAveCharWidth;
		 //cxCaps=(tm.tmPitchAndFamily)*cxChar/2;
		 cxCaps=(tm.tmPitchAndFamily&1?3:2)*cxChar/2;
		 cyChar=tm.tmHeight+tm.tmExternalLeading;
		 ReleaseDC(hWnd,hdc);
		 iMaxWidth=40*cxChar+22*cxCaps;
//		 SetScrollRange(hWnd,SB_VERT,0,numline-1,FALSE);
//		 SetScrollPos(hWnd,SB_VERT,iVscrollPos,TRUE);
		 return 0;
/*	case WM_SETTINGCHANGE:
		SystemParametersInfo(SPI_GETWHEELSCROLLLINES,0,&ulScrollLines,0);
		if(ulScrollLines)
			iDeltaPerLine=WHEEL_DELTA/ulScrollLines;
		else
			iDeltaPerLine=0;
		return 0;*/
	case WM_SIZE:
		cyClient=HIWORD(lParam);
		cxClient=LOWORD(lParam);
		SetScrollLength();
	/*	si.cbSize=sizeof(si);
		si.fMask=SIF_RANGE|SIF_PAGE;
		si.nMin=0;
		si.nMax=numline-1;
		si.nPage=cyClient/cyChar;
		SetScrollInfo(hWnd,SB_VERT,&si,TRUE);*/
		return 0;
	case WM_VSCROLL:
		si.cbSize=sizeof(si);
		si.fMask=SIF_ALL;
		GetScrollInfo(hWnd,SB_VERT,&si);
		iVertPos=si.nPos;
		switch(LOWORD(wParam))
		{
		case SB_TOP:
			si.nPos=si.nMin;
			break;
		case SB_BOTTOM:
			si.nPos=si.nMax;
			break;
		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!=iVertPos)
		{
		//	ScrollWindow(hWnd,0,cyChar*(iVertPos-si.nPos),NULL,NULL);
		//	UpdateWindow(hWnd);
		InvalidateRect(hWnd, NULL, TRUE);
		}
		return 0;
	case WM_TIMER:
		SendMessage(hWnd,WM_VSCROLL,SB_LINEDOWN,0);
		break;
//	case WM_LBUTTONDBLCLK:
	//	SetTimer(hWnd,ID_TIMER,1000,NULL);
	//	break;
	case WM_LBUTTONDOWN: 
	//	KillTimer(hWnd,ID_TIMER);
	//	break;		
//		SetForegroundWindow(hWnd);
//		//MessageBox(hWnd,"","",MB_OK);
		if(ScrollCheck=!ScrollCheck)
			SetTimer(hWnd,ID_TIMER,1000,NULL);
		else
			KillTimer(hWnd,ID_TIMER);
		break;	
	case WM_RBUTTONDOWN:		 
         GetCursorPos(&stPos);
         TrackPopupMenu(hRMenu,TPM_LEFTALIGN,stPos.x,stPos.y,NULL,GetParent(hWnd),NULL);
       break; 
//	case WM_RBUTTONDOWN://LBUTTONDBLCLK:
	//	MessageBox(hWnd,"","",MB_OK);
	//	KillTimer(hWnd,ID_TIMER);
	//	break;
	case WM_MOUSEMOVE:
		SetFocus(hWnd);
	//	SetCapture(hWnd);
		return 	DefWindowProc(hWnd, wMessage, wParam, lParam);
	case WM_MOUSEWHEEL:
	//	MessageBox(hWnd,"","",MB_OK);
		SystemParametersInfo(SPI_GETWHEELSCROLLLINES,0,&ulScrollLines,0);
		if(ulScrollLines)
			iDeltaPerLine=WHEEL_DELTA/ulScrollLines;
		else
			iDeltaPerLine=0;
		if (iDeltaPerLine == 0)
			break ;
		//MessageBox(hWnd,"","",MB_OK);
		iAccumDelta += (short) HIWORD (wParam) ; // 120 or -120
		while (iAccumDelta >= iDeltaPerLine)
		{ 
			SendMessage (hWnd, WM_VSCROLL, SB_LINEUP, 0) ;
			iAccumDelta -= iDeltaPerLine ;
		}
		while (iAccumDelta <= -iDeltaPerLine)
		{
			SendMessage (hWnd, WM_VSCROLL, SB_LINEDOWN, 0) ;
			iAccumDelta += iDeltaPerLine ;
		}
		return 0;
    case WM_ERASEBKGND:
		//PrintStr();
		return TRUE;
	case WM_PAINT:
		 hdc = BeginPaint (hWnd, &ps);
		 PrintStr();
		// HDC hStrDC=GetDC(hWnd);
		// SetBkColor( hStrDC, RGB(0,0,0));
		// SetTextColor(hStrDC, RGB(255,255,255));
		// ReleaseDC(hWnd,hStrDC);	
		 EndPaint (hWnd, &ps);
		 return	0;
	case WM_KEYDOWN:
		switch(wParam)
		{
		case VK_HOME:
			SendMessage(hWnd,WM_VSCROLL,SB_TOP,0);
			break;
		case VK_END:
			SendMessage(hWnd,WM_VSCROLL,SB_BOTTOM,0);
			break;
		case VK_PRIOR:
			SendMessage(hWnd,WM_VSCROLL,SB_PAGEUP,0);
			break;
		case VK_NEXT:
			SendMessage(hWnd,WM_VSCROLL,SB_PAGEDOWN,0);
			break;
		case VK_UP:
			SendMessage(hWnd,WM_VSCROLL,SB_LINEUP,0);
			break;
		case VK_DOWN:
			SendMessage(hWnd,WM_VSCROLL,SB_LINEDOWN,0);
			break;
		case VK_LEFT:
			SendMessage(hWnd,WM_HSCROLL,SB_PAGEUP,0);
			break;
		case VK_RIGHT:
			SendMessage(hWnd,WM_HSCROLL,SB_PAGEDOWN,0);
			break;
		}
		return 0;
	case WM_DROPFILES:
		char lpszFile[ 80 ];
		char szBuff[ 1024 ];
		SHFILEINFO sfi;
        HDROP hDropInfo;
        hDropInfo = ( HDROP )wParam;
		WORD cFiles = DragQueryFile( hDropInfo,( UINT )0xFFFFFFFF,( LPTSTR )NULL,( UINT )NULL );
		if(cFiles==1)
		{

			DragQueryFile( hDropInfo,0,lpszFile,sizeof( lpszFile ) );
			if( SHGetFileInfo( lpszFile,0,&sfi,sizeof( SHFILEINFO ),SHGFI_DISPLAYNAME | SHGFI_TYPENAME ) )
			 {
			     memset( szBuff,0,sizeof( szBuff ) );
				 wsprintf( szBuff,"Name: %s Type: %s",sfi.szDisplayName,sfi.szTypeName );
				 AddStr(hTree,lpszFile);				 
		//		 InvalidateRect(hWnd,NULL,FALSE);
		//		 MessageBox(hWnd,lpszFile,"",MB_OK);
			}
		}
        DragFinish( hDropInfo );
        break;
		/*
	 case WM_VSCROLL:
		// if((HWND)lParam!=hStr)
		//	 break;
		 switch(LOWORD(wParam))
		 {
		 case SB_LINEUP:
			 iVscrollPos -= 1;
			 break;    
		 case SB_LINEDOWN:
			 iVscrollPos += 1;
			 break;
		 case SB_PAGEUP:
			 iVscrollPos -= cyClient/cyChar;
			 break;
		 case SB_PAGEDOWN:
			 iVscrollPos += cyClient/cyChar;
			 break;
		 case SB_THUMBPOSITION:
			 iVscrollPos = HIWORD(wParam);
			 break;
		 default:
			 return(DefWindowProc(hWnd, wMessage, wParam, lParam));
		 }
		 iVscrollPos = max(0, min(iVscrollPos, numline-1));
		 if(iVscrollPos != GetScrollPos(hWnd, SB_VERT))
		 {
			 SetScrollPos(hWnd, SB_VERT, iVscrollPos, TRUE);
			 InvalidateRect(hWnd, NULL, TRUE);
		 }
		 SetScrollPos(hWnd, SB_VERT, iVscrollPos, TRUE);
		 return 0;	
*/
	}
	return (DefWindowProc(hWnd, wMessage, wParam, lParam));
}

HWND InitStrView( HINSTANCE hInst, HWND hWndParent)
{
	RECT		stClRect;
	UINT		cx,cy;
	//HIMAGELIST	hFace;
	HWND		hStr;	

	CHAR	szStrName[]  = "MyReaderView";
    WNDCLASS	wndclass;
	wndclass.style			= CS_HREDRAW | CS_VREDRAW;
	wndclass.lpfnWndProc	= (WNDPROC) WndProcStr;
	wndclass.cbClsExtra	= 0;
	wndclass.cbWndExtra	= 0;
	wndclass.hInstance		= hInst;
	wndclass.hIcon			= NULL;
	wndclass.hCursor		= LoadCursor (NULL, IDC_ARROW);
	wndclass.hbrBackground = (HBRUSH)GetStockObject (WHITE_BRUSH) ;//(HBRUSH)(COLOR_BTNFACE+1);
	wndclass.lpszMenuName	= NULL;
	wndclass.lpszClassName = szStrName;

	if (!RegisterClass (&wndclass))		return NULL;

	GetClientRect( hWndParent, &stClRect);
	cx = stClRect.right - stClRect.left;
	cy = stClRect.bottom -stClRect.top;
// WS_EX_LEFT|WS_EX_LTRREADING|WS_EX_RIGHTSCROLLBAR|WS_EX_TOOLWINDOW|WS_EX_STATICEDGE

//	RegisterWndClass(NULL,TEXT("MyReaderView"));

	hStr = CreateWindowEx( WS_EX_ACCEPTFILES|WS_EX_LEFT|WS_EX_LTRREADING|WS_EX_RIGHTSCROLLBAR|WS_EX_TOOLWINDOW|WS_EX_STATICEDGE,
		szStrName, //"STATIC",//
		NULL,    
		WS_CHILD | WS_VISIBLE|WS_OVERLAPPED|WS_VSCROLL, 
		cx/3, 
		0, 
		2*cx/3,
		cy, 
		hWndParent,
		(HMENU)IDD_STR, 
		hInst,
		NULL);	
/*	RECT rc;
	GetClientRect(hStr,&rc);
	HDC hStrDC=GetDC(hStr);
	SetTextColor(hStrDC, RGB(255,255,255));
	SetBkColor( hStrDC, RGB(0,0,0));
	//hStrDC.FillSolidRect(rc,RGB(255,255,255));
	TextOut(hStrDC,0,0,TEXT("ok"),2);
	ReleaseDC(hStr,hStrDC);*/
//	MessageBox(hWndParent,"","",MB_OK);
	return (hStr);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -