📄 winspec.cpp
字号:
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 + -