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

📄 winspec.cpp

📁 Linux/windows 环境下跨平台开发程序
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		case SB_PAGEDOWN:
			if(g->Id == GO_SPREADDATA) {
				g->Command(CMD_PAGEDOWN, 0L, w);
				return;
				}
			pos = (si.nPos + (int)si.nPage*2) < si.nMax ? (si.nPos + si.nPage) : (si.nMax - si.nPage+1);
			break;
		case SB_THUMBTRACK:		case SB_THUMBPOSITION:
			pos = si.nTrackPos;
			break;
		default:
			return;
			}
		g->Command(cmd, (void*)(& pos), w);
		}
}

long OpenFileFromHistory(OutputWin *w, GraphObj *g, int id)
{
	char *name = 0L;

	switch (id) {
	case 0:			name = defs.File1;			break;
	case 1:			name = defs.File2;			break;
	case 2:			name = defs.File3;			break;
	case 3:			name = defs.File4;			break;
	case 4:			name = defs.File5;			break;
	case 5:			name = defs.File6;			break;
		}
	if(name && FileExist(name)) {
		g->Command(CMD_DROPFILE, name, w);
		defs.FileHistory(name);
		w->FileHistory();
		}
	return 0;
}

static GraphObj *copy_obj;

long FAR PASCAL WndProc(HWND hwnd, UINT message, UINT wParam, LONG lParam)
{
	static WinCopyWMF *CopyWMF = NULL;
	static BitMapWin *CopyBMP = NULL;
	static bool CtrlDown = false;
	PAINTSTRUCT ps;
	OutputWin *w;
	GraphObj *g;
	MouseEvent mev;
	HDC dc;
	int cc;

	g = (GraphObj *) GetWindowLong(hwnd, 0);
	w = (OutputWin *) GetWindowLong(hwnd, GWL_USERDATA);
	if(g && w) switch(message) {
	case WM_SETFOCUS:
		if(g->Id == GO_GRAPH) CurrGraph = (Graph*)g;
		else CurrGraph = 0L;
		break;
	case WM_LBUTTONDOWN:	case WM_LBUTTONDBLCLK:
		HideTextCursor();
	case WM_MOUSEMOVE:		case WM_RBUTTONUP:		case WM_LBUTTONUP:
		mev.x = LOWORD(lParam);
		mev.y = HIWORD(lParam);
		mev.StateFlags = 0;
		if(wParam & MK_LBUTTON) mev.StateFlags |= 1;
		if(wParam & MK_MBUTTON) mev.StateFlags |= 2;
		if(wParam & MK_RBUTTON) mev.StateFlags |= 4;
		if(wParam & MK_SHIFT) mev.StateFlags |= 8;
		if(wParam & MK_CONTROL) mev.StateFlags |= 16;
		if(message == WM_LBUTTONUP) mev.Action = MOUSE_LBUP;
		else if(message == WM_RBUTTONUP) mev.Action = MOUSE_RBUP;
		else if(message == WM_LBUTTONDBLCLK) mev.Action = MOUSE_LBDOUBLECLICK;
		else if(message == WM_LBUTTONDOWN) mev.Action = MOUSE_LBDOWN;
		else if(message == WM_MOUSEMOVE)mev.Action = MOUSE_MOVE;
		g->Command(CMD_MOUSE_EVENT, (void *)&mev, w);
		break;
	case WM_KEYDOWN:
		if(g && w && (GetKeyState(VK_LCONTROL) || GetKeyState(VK_RCONTROL))){
			cc = (wParam & 0xff);
			if(cc == 0xbb || cc == 0x6b ) g->Command(CMD_ZOOM, &"+", w);
			else if(cc == 0xbd || cc == 0x6d ) g->Command(CMD_ZOOM, &"-", w);
			else break;
			return 0;
			}
		break;
	case WM_CHAR:
		cc = (wParam & 0xff);
		g->Command(CMD_ADDCHAR, (void *)(& cc), w);
		return 0;
	case WM_VSCROLL:		case WM_HSCROLL:
		ScrollEvent(message == WM_VSCROLL, hwnd, wParam & 0xffff, g, w);
		return 0;
		}  

	switch(message) {
	case WM_CREATE:
		//assume that the first window created is the main window
		if(!MainWnd) MainWnd = hwnd;
		break;
	case WM_SIZE:
		if(g && w) g->Command(CMD_SETSCROLL, 0L, w);
		break;
	case WM_INITMENUPOPUP:		case WM_NCMOUSEMOVE:
		SetCursor(LoadCursor(NULL, IDC_ARROW));
		break;
	case WM_SETCURSOR:
		if(w) w->MouseCursor(MC_LAST, true);
		return TRUE;
	case WM_SETFOCUS:
		if(g && w) if(!g->Command(message == WM_SETFOCUS ?
			CMD_SETFOCUS : CMD_KILLFOCUS, NULL, w))
			SetCursor(LoadCursor(NULL, IDC_ARROW));
		return 0;
	case WM_DESTROYCLIPBOARD:
		return 0;
	case WM_RENDERALLFORMATS:
		// we do not support leaving data on the clipboard after exit
		OpenClipboard(hwnd);
		EmptyClipboard();
		CloseClipboard();
		return 0;
	case WM_RENDERFORMAT:
		if(g && w) switch(wParam){
			case CF_METAFILEPICT:
				CopyWMF = new WinCopyWMF(copy_obj);
				if(CopyWMF && CopyWMF->StartPage()) {
					copy_obj->DoPlot(CopyWMF);
					CopyWMF->EndPage();
					delete CopyWMF;					CopyWMF = NULL;
					}
				if(copy_obj->Id == GO_GRAPH || copy_obj->Id == GO_PAGE) copy_obj->DoPlot(0L);
				break;
			case CF_BITMAP:
				if((CopyBMP = new BitMapWin(copy_obj)) && CopyBMP->StartPage()) {
					copy_obj->DoPlot(CopyBMP);			CopyBMP->EndPage();
					SetClipboardData(CF_BITMAP, CopyBMP->scr);
					CopyBMP->scr = 0L;					CopyBMP->go = 0L;
					delete CopyBMP;						CopyBMP = NULL;
					}
				if(copy_obj->Id == GO_GRAPH || copy_obj->Id == GO_PAGE) copy_obj->DoPlot(0L);
				break;
			case CF_SYLK:		case CF_TEXT:
				if(g->Id == GO_SPREADDATA) CopyData(g, wParam);
				break;
			default:
				if(wParam == cf_rlpgraph) CopyGraph(copy_obj, wParam);
				if(wParam == cf_rlpxml) CopyData(g, wParam);
				break;
			}
		if(w->Erase(defs.Color(COL_BG))) g->DoPlot(w);
		return 0;
	case WM_COMMAND:
		wParam &= 0xffff;
		if(g && w) switch(wParam) {
		case CM_EXIT:
			if(g->Command(CMD_CAN_CLOSE, 0L, 0L)) {
				SetWindowLong(hwnd, 0, 0L);
				SetWindowLong(hwnd, GWL_USERDATA, 0L);
				w->go = 0L;
				DestroyWindow(hwnd);
				}
			return 0;
		case CM_PASTE:
			w->MouseCursor(MC_WAIT, true);
			if(g->Id == GO_SPREADDATA || g->Id == GO_PAGE ||
				g->Id == GO_GRAPH)TestClipboard(g);
			w->MouseCursor(MC_ARROW, true);
			return 0;
		case CM_COPY:			case CM_CUT:
			EmptyClip();
			OpenClipboard(hwnd);
			if(g->Id == GO_SPREADDATA && g->Command(wParam == CM_CUT ? CMD_CUT : CMD_QUERY_COPY, 0L, w)) {
				SetClipboardData(CF_TEXT, NULL);
				SetClipboardData(CF_SYLK, NULL);
				SetClipboardData(cf_rlpxml, NULL);
				}
			CloseClipboard();
			return 0;
		case CM_UPDATE:
			g->Command(CMD_UPDATE, 0L, w);
			return 0;
		case CM_COPYGRAPH:
			EmptyClip();
			OpenClipboard(GetFocus());
			SetClipboardData(CF_METAFILEPICT, NULL);
			SetClipboardData(CF_BITMAP, NULL);
			SetClipboardData(cf_rlpgraph, NULL);
			if(g->Id == GO_PAGE && CurrGraph) CopyGraph(CurrGraph, cf_rlpobj);
			copy_obj = g;
			CloseClipboard();
			return 0;
		case CM_OPEN:
			g->Command(CMD_OPEN, (void *)NULL, w);
			return 0;
		case CM_FILE1:	case CM_FILE2:	case CM_FILE3:
		case CM_FILE4:	case CM_FILE5:	case CM_FILE6:
			return OpenFileFromHistory(w, g, wParam - CM_FILE1);
		case CM_FILLRANGE:
			g->Command(CMD_FILLRANGE, (void *)NULL, w);
			return 0;
		case CM_ABOUT:
			RLPlotInfo();
			return 0;
		case CM_ZOOM25:
			g->Command(CMD_ZOOM, &"25", w);
			return 0;
		case CM_ZOOM50:
			g->Command(CMD_ZOOM, &"50", w);
			return 0;
		case CM_ZOOM100:
			g->Command(CMD_ZOOM, &"100", w);
			return 0;
		case CM_ZOOM200:
			g->Command(CMD_ZOOM, &"200", w);
			return 0;
		case CM_ZOOM400:
			g->Command(CMD_ZOOM, &"400", w);
			return 0;
		case CM_ZOOMIN:
			g->Command(CMD_ZOOM, &"+", w);
			return 0;
		case CM_ZOOMOUT:
			g->Command(CMD_ZOOM, &"-", w);
			return 0;
		case CM_ZOOMFIT:
			g->Command(CMD_ZOOM, &"fit", w);
			return 0;
		case CM_ADDPLOT:
			g->Command(CMD_ADDPLOT, 0L, w);
			return 0;
		case CM_LEGEND:
			g->Command(CMD_LEGEND, 0L, w);
			return 0;
		case CM_LAYERS:
			g->Command(CMD_LAYERS, 0L, w);
			return 0;
		case CM_NEWGRAPH:
			g->Command(CMD_NEWGRAPH, 0L, w);
			return 0;
		case CM_NEWPAGE:
			g->Command(CMD_NEWPAGE, 0L, w);
			return 0;
		case CM_DELGRAPH:
			g->Command(CMD_DELGRAPH, 0L, w);
			return 0;
		case CM_SAVEDATAAS:
			g->Command(CMD_SAVEDATAAS, 0L, w);
			return 0;
		case CM_REDRAW:
			if(w->Erase(defs.Color(COL_BG))) g->DoPlot(w);
			return 0;
		case CM_DELOBJ:
			if(CurrGO && CurrGO->parent && CurrGO->parent->
				Command(CMD_DELOBJ, (void*)CurrGO, w)) {
				CurrGO = 0L;
				if(w->Erase(defs.Color(COL_BG))) g->DoPlot(w);
				}
			else if(!CurrGO) InfoBox("No object selected!");
			return 0;
		case CM_SAVEGRAPHAS:
			SaveGraphAs(g);
			return 0;
		case CM_EXPORT:
			OpenExportName(g, "hello.svg");
			g->DoPlot(w);
			return 0;
		case CM_PRINT:
			if(g->Id == GO_SPREADDATA){
				g->Command(CMD_PRINT, 0L, Printer);
				return 0;
				}
			if(Printer && Printer->StartPage()) {
				SetCursor(LoadCursor(0L, IDC_WAIT));
				g->DoPlot(Printer);
				Printer->EndPage();
				w->Erase(defs.Color(COL_BG));
				g->DoPlot(w);
				SetCursor(LoadCursor(0L, IDC_ARROW));
				}
			return 0;
		case CM_ADDROWCOL:
			g->Command(CMD_ADDROWCOL, (void *)NULL, w);
			return 0;
		case CM_DEFAULTS:
			g->Command(CMD_CONFIG, 0L, w);
			return 0;
		case CM_ADDAXIS:
			g->Command(CMD_ADDAXIS, 0L, w);
			return 0;
		case CM_T_STANDARD:
			cc = TM_STANDARD;
			g->Command(CMD_TOOLMODE, (void*)(& cc), w);
			return 0;
		case CM_T_DRAW:
			cc = TM_DRAW;
			g->Command(CMD_TOOLMODE, (void*)(& cc), w);
			return 0;
		case CM_T_POLYLINE:
			cc = TM_POLYLINE;
			g->Command(CMD_TOOLMODE, (void*)(& cc), w);
			return 0;
		case CM_T_POLYGON:
			cc = TM_POLYGON;
			g->Command(CMD_TOOLMODE, (void*)(& cc), w);
			return 0;
		case CM_T_RECTANGLE:
			cc = TM_RECTANGLE;
			g->Command(CMD_TOOLMODE, (void*)(& cc), w);
			return 0;
		case CM_T_ROUNDREC:
			cc = TM_ROUNDREC;
			g->Command(CMD_TOOLMODE, (void*)(& cc), w);
			return 0;
		case CM_T_ELLIPSE:
			cc = TM_ELLIPSE;
			g->Command(CMD_TOOLMODE, (void*)(& cc), w);
			return 0;
		case CM_T_ARROW:
			cc = TM_ARROW;
			g->Command(CMD_TOOLMODE, (void*)(& cc), w);
			return 0;
		case CM_T_TEXT:
			cc = TM_TEXT;
			g->Command(CMD_TOOLMODE, (void*)(& cc), w);
			return 0;
		case CM_DELKEY:		case CM_LEFTARRKEY:		case CM_RIGHTARRKEY:
		case CM_UPARRKEY:   case CM_DOWNARRKEY:		case CM_POS_FIRST:
		case CM_POS_LAST:	case CM_SHLEFT:			case CM_SHRIGHT:
		case CM_SHUP:		case CM_SHDOWN:			case CM_TAB:
		case CM_SHTAB:		case CM_SHPGUP:			case CM_SHPGDOWN:
			switch(wParam) {
			case CM_DELKEY:			cc = CMD_DELETE;		break;
			case CM_LEFTARRKEY:		cc = CMD_CURRLEFT;		break;
			case CM_RIGHTARRKEY:	cc = CMD_CURRIGHT;		break;
			case CM_UPARRKEY:		cc = CMD_CURRUP;		break;
			case CM_DOWNARRKEY:		cc = CMD_CURRDOWN;		break;
			case CM_POS_FIRST:		cc = CMD_POS_FIRST;		break;
			case CM_POS_LAST:		cc = CMD_POS_LAST;		break;
			case CM_SHLEFT:			cc = CMD_SHIFTLEFT;		break;
			case CM_SHRIGHT:		cc = CMD_SHIFTRIGHT;	break;
			case CM_SHUP:			cc = CMD_SHIFTUP;		break;
			case CM_SHDOWN:			cc = CMD_SHIFTDOWN;		break;
			case CM_TAB:			cc = CMD_TAB;			break;
			case CM_SHTAB:			cc = CMD_SHTAB;			break;
			case CM_SHPGUP:			cc = CMD_SHPGUP;		break;
			case CM_SHPGDOWN:		cc = CMD_SHPGDOWN;		break;
				}
			g->Command(cc, (void *)NULL, w);
			return 0;
		case CM_PGUP:		case CM_PGDOWN:
			g->Command(wParam == CM_PGUP ? CMD_PAGEUP : CMD_PAGEDOWN, 0L, w);
			return 0;
		case CM_UNDO:
			g->Command(CMD_UNDO, 0L, w);
			return 0;
		case CM_INSROW:
			g->Command(CMD_INSROW, 0L, w);
			return 0;
		case CM_INSCOL:
			g->Command(CMD_INSCOL, 0L, w);
			return 0;
		case CM_DELROW:
			g->Command(CMD_DELROW, 0L, w);
			return 0;
		case CM_DELCOL:
			g->Command(CMD_DELCOL, 0L, w);
			return 0;
		default:
			sprintf(TmpTxt, "Command 0x%x (%d)\nreceived", wParam & 0xffff,
				wParam & 0xffff);
			MessageBox(hwnd, TmpTxt, "Info", MB_OK | MB_ICONINFORMATION);
		}
		return 0;
	case WM_CLOSE:
		if(g && g->Command(CMD_CAN_CLOSE, 0L, 0L)) {
			SetWindowLong(hwnd, 0, 0L);
			SetWindowLong(hwnd, GWL_USERDATA, 0L);
			w->go = 0L;
			DestroyWindow(hwnd);
			}
		else if(!g) DestroyWindow(hwnd);
		return 0;
	case WM_DESTROY:
		if(hwnd == MainWnd)PostQuitMessage(0);
		break;
	case WM_PAINT:
		dc = BeginPaint(hwnd, &ps);
		if(w && dc) w->UpdateRect(dc, ps.rcPaint);
		EndPaint(hwnd, &ps);
		break;
	}
	return DefWindowProc(hwnd, message, wParam, lParam);
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Dialog window: Windows specific
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
const char dlgname[] = "RLDLGWIN";

long FAR PASCAL DlgWndProc(HWND hwnd, UINT message, UINT wParam, LONG lParam)
{
	OutputWin *w;
	tag_DlgObj *d;
	PAINTSTRUCT ps;
	HDC dc;
	MouseEvent mev;
	int i, cc;

	d = (tag_DlgObj *) GetWindowLong(hwnd, 0);
	w = (OutputWin *) GetWindowLong(hwnd, GWL_USERDATA);
	switch(message) {
	case WM_CREATE:
		break;
	case WM_KILLFOCUS:
		HideTextCursorObj(w);
		if(d) d->Command(CMD_ENDDIALOG, NULL, w);
		return 0;
	case WM_TIMER:
		if(d) d->Command(CMD_ENDDIALOG, d, w);
		return 0;
	case WM_DESTROY:	case WM_CLOSE:
		if(d) {
			d->Command(CMD_UNLOCK, 0L, w);
			d->Command(CMD_ENDDIALOG, 0L, w);
			SetWindowLong(hwnd, 0, NULL);
			}
		if(w) {
			SetWindowLong(hwnd, GWL_USERDATA, NULL);
			delete w;
			}
		break;
	case WM_CHAR:
		if(0x09 == (cc = wParam & 0xff)) break;		//ignore Tab
		if(cc == 0x03) return d->Command(CMD_COPY, 0L, w);	//^c copy
		if(cc == 0x16) return d->Command(CMD_PASTE, 0L, w);	//^v paste
		if(d && w) d->Command(CMD_ADDCHAR, (void *)(& cc), w);
		break;
	case WM_LBUTTONDOWN:	case WM_LBUTTONDBLCLK:
		HideTextCursor();
	case WM_RBUTTONUP:		case WM_LBUTTONUP:		case WM_MOUSEMOVE:
		mev.x = LOWORD(lParam);		mev.y = HIWORD(lParam);		mev.StateFlags = 0;
		if(wParam & MK_LBUTTON) mev.StateFlags |= 1;
		if(wParam & MK_MBUTTON) mev.StateFlags |= 2;
		if(wParam & MK_RBUTTON) mev.StateFlags |= 4;
		if(wParam & MK_SHIFT) mev.StateFlags |= 8;
		if(wParam & MK_CONTROL) mev.StateFlags |= 16;
		if(message == WM_MOUSEMOVE) mev.Action = MOUSE_MOVE;
		else if(message == WM_LBUTTONDOWN) mev.Action = MOUSE_LBDOWN;
		else if(message == WM_LBUTTONUP) mev.Action = MOUSE_LBUP;
		else if(message == WM_RBUTTONUP) mev.Action = MOUSE_RBUP;
		else if(message == WM_LBUTTONDBLCLK) mev.Action = MOUSE_LBDOUBLECLICK;
		if(d && w) d->Command(CMD_MOUSE_EVENT, (void *)&mev, w);
		break;
	case WM_COMMAND:
		wParam &= 0xffff;
		i = 0;
		switch(wParam) {
		case CM_DELKEY:			i = CMD_DELETE;		break;
		case CM_LEFTARRKEY:		i = CMD_CURRLEFT;	break;
		case CM_RIGHTARRKEY:	i = CMD_CURRIGHT;	break;
		case CM_UPARRKEY:		i = CMD_CURRUP;		break;
		case CM_DOWNARRKEY:		i = CMD_CURRDOWN;	break;
		case CM_TAB:			i = CMD_TAB;		break;
		case CM_SHTAB:			i = CMD_SHTAB;		break;
		case CM_POS_FIRST:		i = CMD_POS_FIRST;	break;
		case CM_POS_LAST:		i = CMD_POS_LAST;	break;
		case CM_SHLEFT:			i = CMD_SHIFTLEFT;	break;
		case CM_SHRIGHT:		i = CMD_SHIFTRIGHT;	break;
		case CM_UNDO:			i = CMD_UNDO;		break;
			}
		if(i &

⌨️ 快捷键说明

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