📄 igrid.c
字号:
hPenArray[15] = CreatePen(PS_SOLID, 10, RGB(192, 192, 192));
hBrushNormal = CreateSolidBrush(RGB(255, 255, 0));
hBrushHighlight = CreateSolidBrush(RGB(255, 0, 0));
// create scroll bars
hwndVertScrol = CreateWindow("scrollbar", NULL,
WS_CHILD | WS_VISIBLE | WS_TABSTOP | SBS_VERT, 0, 0, 0, 0,
hwnd, ID_SB_VERT, ((LPCREATESTRUCT) lParam)->hInstance, NULL);
hwndHorzScrol = CreateWindow("scrollbar", NULL,
WS_CHILD | WS_VISIBLE | WS_TABSTOP | SBS_HORZ, 0, 0, 0, 0,
hwnd, ID_SB_HORZ, ((LPCREATESTRUCT) lParam)->hInstance, NULL);
SetScrollRange(hwndVertScrol, SB_CTL, 0, VERTSCROLRANGE, FALSE);
SetScrollPos (hwndVertScrol, SB_CTL,
VERTSCROLRANGE - (short)(VERTSCROLRANGE * (viewheight + yOffsetView) /
deskheight), FALSE);
SetScrollRange(hwndHorzScrol, SB_CTL, 0, HORZSCROLRANGE, FALSE);
SetScrollPos (hwndHorzScrol, SB_CTL,
(short)(HORZSCROLRANGE * xOffsetView / deskwidth), FALSE);
hInstance = ((LPCREATESTRUCT) lParam)->hInstance;
lpfnRectDlgProc = MakeProcInstance((FARPROC) RectDlgProc,
hInstance);
lpfnQuadDlgProc = MakeProcInstance((FARPROC) QuadDlgProc,
hInstance);
lpfnTriDlgProc = MakeProcInstance((FARPROC) TriDlgProc,
hInstance);
lpfnOptnDlgProc = MakeProcInstance((FARPROC) OptnDlgProc,
hInstance);
lpfnMoveDlgProc = MakeProcInstance((FARPROC) MoveDlgProc,
hInstance);
lpfnResizeDlgProc = MakeProcInstance((FARPROC) ResizeDlgProc,
hInstance);
lpfnRescaleDlgProc = MakeProcInstance((FARPROC) RescaleDlgProc,
hInstance);
lpfnRotDlgProc = MakeProcInstance((FARPROC) RotDlgProc,
hInstance);
usermode = internalmode = mouse = &pointer;
PopFileInitialize(hwnd);
SetWindowText(hwndMessage, ptrinstructn);
SetWindowText(hwndMessage2, ptrinstructn2);
return 0;
case WM_DRAWITEM:
lpdis=(LPDRAWITEMSTRUCT) lParam;
switch(lpdis->CtlID){
case IDC_ZOOMIN:
if (lpdis->itemState & ODS_SELECTED)
DrawBitmap(lpdis->hDC, hBmpzminon, 0, 0);
else
DrawBitmap(lpdis->hDC, hBmpzminoff, 0, 0);
break;
case IDC_ZOOMOUT:
if (lpdis->itemState & ODS_SELECTED)
DrawBitmap(lpdis->hDC, hBmpzmouton, 0, 0);
else
DrawBitmap(lpdis->hDC, hBmpzmoutoff, 0, 0);
break;
case IDC_POINTER:
if (lpdis->itemState & ODS_SELECTED){
mouse = &pointer; // prepare for updatemousetoolbar
}
break;
case IDC_MOVEOBJECT:
if (lpdis->itemState & ODS_SELECTED){
mouse = &mover; // prepare for updatemousetoolbar
}
break;
case IDC_RESIZE:
if (lpdis->itemState & ODS_SELECTED){
mouse = &resizer;
}
break;
case IDC_ROTATE:
if (lpdis->itemState & ODS_SELECTED){
mouse = &rotater; // prepare for updatemousetoolbar
}
break;
case IDC_MODIFY:
if (lpdis->itemState & ODS_SELECTED){
mouse = &modifier; // prepare for updatemousetoolbar
}
break;
case IDC_ENQUIRY:
if (lpdis->itemState & ODS_SELECTED){
mouse = &enquirer; // prepare for updatemousetoolbar
}
break;
case IDC_RECTANGLE:
if (lpdis->itemState & ODS_SELECTED)
DrawBitmap(lpdis->hDC, hBmprecton, 0, 0);
else
DrawBitmap(lpdis->hDC, hBmprectoff, 0, 0);
break;
case IDC_QUADRILATERAL:
if (lpdis->itemState & ODS_SELECTED)
DrawBitmap(lpdis->hDC, hBmpquadon, 0, 0);
else
DrawBitmap(lpdis->hDC, hBmpquadoff, 0, 0);
break;
case IDC_TRIANGLE:
if (lpdis->itemState & ODS_SELECTED)
DrawBitmap(lpdis->hDC, hBmptrion, 0, 0);
else
DrawBitmap(lpdis->hDC, hBmptrioff, 0, 0);
break;
}
updatemodetoolbar(hwnd);
updatepropertytoolbar(hwnd);
return 0;
case WM_SIZE:
/* +------------------------------+-------------------------------+
| | |
| | viewwidth |
| | xOffsetView +------------+ |
| |<----------->| | |
| | | | |
| | +------------+ |
| | ^ |
| | yOffsetView | |
+------------------------------+-------------------------------+
| | |
| | |
| | |
| | |
| | |
| | |
| | |
+------------------------------+-------------------------------+
*/
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam);
MoveWindow(hwndVertScrol, cxClient - sbwidth, TOOLBARHEIGHT + statusheight,
sbwidth, cyClient - TOOLBARHEIGHT- sbheight - statusheight, TRUE);
MoveWindow(hwndHorzScrol, 0, cyClient - sbheight,
cxClient - sbwidth, sbheight, TRUE);
MoveWindow(hwndPaper, 0, TOOLBARHEIGHT + statusheight,
cxClient-sbwidth, cyClient - TOOLBARHEIGHT- sbheight - statusheight, TRUE);
viewwidth = deskwidth * ((double)zoomfactor / 32.0) *
((double)cxViewport / cxmaxViewport);
viewheight = deskheight * ((double)zoomfactor / 32.0) *
((double)cyViewport / cymaxViewport);
if(xOffsetView < -deskwidth / 2.0) xOffsetView = -deskwidth / 2.0;
if(yOffsetView < -deskheight / 2.0) yOffsetView = -deskheight / 2.0;
if((xOffsetView + viewwidth) > deskwidth / 2.0){
xOffsetView = deskwidth / 2.0 - viewwidth;
}
if((yOffsetView + viewheight) > deskheight / 2.0){
yOffsetView = deskheight / 2.0 - viewheight;
}
vposition = VERTSCROLRANGE * (0.5 - (yOffsetView + viewheight ) / deskheight);
hposition = HORZSCROLRANGE * (0.5 + xOffsetView / deskwidth);
SetScrollPos(hwndVertScrol, SB_CTL, (short)vposition, TRUE);
SetScrollPos(hwndHorzScrol, SB_CTL, (short)hposition, TRUE);
return 0;
case WM_COMMAND:
hMenu = GetMenu (hwnd) ;
switch (wParam){
case IDM_NEW:
if (bNeedSave && IDCANCEL ==
AskAboutSave (hwnd, szBdfTitleName))
return 0 ;
if(selected.empty() == NO) selected.clear();
if(unselected.empty() == NO) unselected.clear();
EnableMenuItem (hMenu, IDM_CUT, MF_GRAYED);
EnableMenuItem (hMenu, IDM_COPY, MF_GRAYED);
EnableMenuItem (hMenu, IDM_DEL, MF_GRAYED);
EnableMenuItem (hMenu, IDM_GENERATE, MF_GRAYED);
DrawMenuBar(hwnd);
InvalidateRect(hwndPaper, NULL, TRUE);
resetnextavailableid();
blockvacancy = YES;
szBdfFileName [0] = '\0' ;
szBdfTitleName [0] = '\0' ;
DoCaption (hwnd, szBdfTitleName) ;
bNeedSave = FALSE ;
return 0;
case IDM_OPEN:
if (bNeedSave && IDCANCEL ==
AskAboutSave (hwnd, szBdfTitleName))
return 0 ;
if(BdfFileOpenDlg(hwnd, szBdfFileName, szBdfTitleName)){
selected.clear();
unselected.clear();
EnableMenuItem (hMenu, IDM_CUT, MF_GRAYED);
EnableMenuItem (hMenu, IDM_COPY, MF_GRAYED);
EnableMenuItem (hMenu, IDM_DEL, MF_GRAYED);
InvalidateRect(hwndPaper, NULL, TRUE);
resetnextavailableid();
blockvacancy = YES;
if(importgdfinfo(szBdfFileName, unselected)){
importsize = unselected.getsize();
adjustpapersize(importsize);
adjustallowablesnap();
unselected.assignid();
InvalidateRect(hwndPaper, NULL, TRUE);
}
}
if(unselected.empty() == NO){
EnableMenuItem (hMenu, IDM_GENERATE, MF_ENABLED);
DrawMenuBar(hwnd);
}
DoCaption (hwnd, szBdfTitleName);
bNeedSave = FALSE;
return 0;
case IDM_SAVE:
if((selected.empty() == NO ) || (unselected.empty() == NO)){
if (szBdfFileName [0]){
if(savegdfinfo(szBdfFileName)){
bNeedSave = FALSE ;
return 1 ;
}
else
OkMessage (hwnd, "Could not write file %s",
szBdfTitleName) ;
return 0 ;
}
}
// fall through
case IDM_SAVE_AS:
if((selected.empty() == NO ) || (unselected.empty() == NO)){
if(BdfFileSaveDlg(hwnd, szBdfFileName, szBdfTitleName)){
DoCaption(hwnd, szBdfTitleName);
if(savegdfinfo(szBdfFileName)){
bNeedSave = FALSE ;
return 1 ;
}
else{
OkMessage (hwnd, "Could not write file %s",
szBdfTitleName) ;
}
}
}
return 0 ;
case IDM_IMPORT:
if((blockvacancy) &&
(BdfFileOpenDlg(hwnd, szBdfImportFile, szBdfImportTitle))){
if(importgdfinfo(szBdfImportFile, addon)){
importsize = addon.getsize();
expandpapersize(importsize);
adjustallowablesnap();
if(addon.empty() == NO){
addon.assignid();
addon.center(&gcenter);
adder.setcenter(gcenter);
usermode->releasetoolbar();
internalmode = mouse = &adder;
}
}
}
return 0;
case IDM_EXIT:
SendMessage (hwnd, WM_CLOSE, 0, 0L) ;
return 0 ;
case IDM_CUT:
if(selected.empty() == NO){
copied.clear();
selected.disconnect(unselected);
selected.transfer(copied);
EnableMenuItem (hMenu, IDM_CUT, MF_GRAYED);
EnableMenuItem (hMenu, IDM_COPY, MF_GRAYED);
EnableMenuItem (hMenu, IDM_DEL, MF_GRAYED);
EnableMenuItem (hMenu, IDM_PASTE, MF_ENABLED) ;
InvalidateRect(hwndPaper, NULL, TRUE);
blockvacancy = YES;
}
if(unselected.empty() == YES){
EnableMenuItem (hMenu, IDM_GENERATE, MF_GRAYED);
DrawMenuBar(hwnd);
}
return 0;
// selected is disconnect first, so that after copied to copied,
// copied is a close block. i.e. its nodes and sides is
// connected to the blocks in copied only.
case IDM_COPY:
copied.clear();
selected.disconnect(unselected);
selected.copy(copied);
unselected.clearconnectmask();
selected.clearconnectmask();
selected.connect(unselected);
if(copied.empty() == NO)
EnableMenuItem (hMenu, IDM_PASTE, MF_ENABLED) ;
else
EnableMenuItem (hMenu, IDM_PASTE, MF_GRAYED);
return 0;
case IDM_PASTE:
if(blockvacancy){
copied.copy(addon);
// MessageBox(hwndMain, "copy doned", "Message", MB_OK);
addon.assignid();
addon.center(&gcenter);
adder.setcenter(gcenter);
usermode->releasetoolbar();
internalmode = mouse = &adder;
}
return 0;
case IDM_DEL:
if(selected.empty() == NO){
selected.disconnect(unselected);
selected.clear();
blockvacancy = YES;
EnableMenuItem (hMenu, IDM_CUT, MF_GRAYED);
EnableMenuItem (hMenu, IDM_COPY, MF_GRAYED);
EnableMenuItem (hMenu, IDM_DEL, MF_GRAYED);
InvalidateRect(hwndPaper, NULL, TRUE);
option.allowablesnap = unselected.allowablesnap();
}
if(unselected.empty() == YES){
EnableMenuItem (hMenu, IDM_GENERATE, MF_GRAYED);
DrawMenuBar(hwnd);
}
return 0 ;
case IDM_SELECT_ALL:
unselected.transfer(selected);
InvalidateRect(hwndPaper, NULL, TRUE);
if(selected.empty() == NO){
EnableMenuItem (hMenu, IDM_CUT, MF_ENABLED) ;
EnableMenuItem (hMenu, IDM_COPY, MF_ENABLED) ;
EnableMenuItem (hMenu, IDM_DEL, MF_ENABLED) ;
}
return 0;
case IDM_UNSELECT_ALL:
selected.transfer(unselected);
InvalidateRect(hwndPaper, NULL, TRUE);
EnableMenuItem (hMenu, IDM_CUT, MF_GRAYED) ;
EnableMenuItem (hMenu, IDM_COPY, MF_GRAYED) ;
EnableMenuItem (hMenu, IDM_DEL, MF_GRAYED) ;
return 0;
case IDM_ZOOM_IN:
if(zoomfactor > 1){
zoomfactor /= 2;
viewwidth = deskwidth * ((double)zoomfactor / 32.0) *
((double)cxViewport / cxmaxViewport);
viewheight = deskheight * ((double)zoomfactor / 32.0) *
((double)cyViewport / cymaxViewport);
xOffsetView += deskwidth * ((double)zoomfactor / 64.0) *
((double)cxViewport / cxmaxViewport);
yOffsetView += deskheight * ((double)zoomfactor / 64.0) *
((double)cyViewport / cymaxViewport);
if(zoomfactor == 1)
EnableMenuItem (hMenu, IDM_ZOOM_IN, MF_GRAYED);
EnableMenuItem (hMenu, IDM_ZOOM_OUT, MF_ENABLED);
}
vposition = VERTSCROLRANGE * (0.5 - (yOffsetView + viewheight ) / deskheight);
hposition = HORZSCROLRANGE * (0.5 + xOffsetView / deskwidth);
SetScrollPos(hwndVertScrol, SB_CTL, (short)vposition, TRUE);
SetScrollPos(hwndHorzScrol, SB_CTL, (short)hposition, TRUE);
InvalidateRect(hwndPaper, NULL, TRUE);
return 0;
case IDM_ZOOM_OUT:
if(zoomfactor < MAXZOOMFACTOR){
zoomfactor *= 2;
viewwidth = deskwidth * ((double)zoomfactor / 32.0) *
((double)cxViewport / cxmaxViewport);
viewheight = deskheight * ((double)zoomfactor / 32.0) *
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -