📄 igrid.c
字号:
((double)cyViewport / cymaxViewport);
xOffsetView -= deskwidth * ((double)zoomfactor / 128.0) *
((double)cxViewport / cxmaxViewport);
yOffsetView -= deskheight * ((double)zoomfactor / 128.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;
}
if(zoomfactor == MAXZOOMFACTOR)
EnableMenuItem (hMenu, IDM_ZOOM_OUT, MF_GRAYED);
EnableMenuItem (hMenu, IDM_ZOOM_IN, 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_REDRAW:
InvalidateRect(hwndPaper, NULL, TRUE);
return 0;
case IDM_POINTER:
CheckMenuItem (hMenu, IDM_POINTER, MF_CHECKED) ;
CheckMenuItem (hMenu, IDM_MOVE_OBJ, MF_UNCHECKED) ;
CheckMenuItem (hMenu, IDM_RESIZE_OBJ, MF_UNCHECKED) ;
CheckMenuItem (hMenu, IDM_ROTATE_OBJ, MF_UNCHECKED) ;
CheckMenuItem (hMenu, IDM_MODIFY_PRO, MF_UNCHECKED) ;
CheckMenuItem (hMenu, IDM_ENQUIRY, MF_UNCHECKED) ;
internalmode->releasetoolbar();
usermode = internalmode = mouse = &pointer;
mouse->presstoolbar();
SetWindowText(hwndMessage, ptrinstructn);
SetWindowText(hwndMessage2, ptrinstructn2);
return 0;
case IDM_MOVE_OBJ:
CheckMenuItem (hMenu, IDM_POINTER, MF_UNCHECKED) ;
CheckMenuItem (hMenu, IDM_MOVE_OBJ, MF_CHECKED) ;
CheckMenuItem (hMenu, IDM_RESIZE_OBJ, MF_UNCHECKED) ;
CheckMenuItem (hMenu, IDM_ROTATE_OBJ, MF_UNCHECKED) ;
CheckMenuItem (hMenu, IDM_MODIFY_PRO, MF_UNCHECKED) ;
CheckMenuItem (hMenu, IDM_ENQUIRY, MF_UNCHECKED) ;
internalmode->releasetoolbar();
usermode = internalmode = mouse = &mover;
mouse->presstoolbar();
SetWindowText(hwndMessage, movinstructn);
SetWindowText(hwndMessage2, movinstructn2);
return 0;
case IDM_RESIZE_OBJ:
CheckMenuItem (hMenu, IDM_POINTER, MF_UNCHECKED) ;
CheckMenuItem (hMenu, IDM_MOVE_OBJ, MF_UNCHECKED) ;
CheckMenuItem (hMenu, IDM_RESIZE_OBJ, MF_CHECKED) ;
CheckMenuItem (hMenu, IDM_ROTATE_OBJ, MF_UNCHECKED) ;
CheckMenuItem (hMenu, IDM_MODIFY_PRO, MF_UNCHECKED) ;
CheckMenuItem (hMenu, IDM_ENQUIRY, MF_UNCHECKED) ;
internalmode->releasetoolbar();
usermode = internalmode = mouse = &resizer;
mouse->presstoolbar();
SetWindowText(hwndMessage, resizeinstructn);
SetWindowText(hwndMessage2, resizeinstructn2);
return 0;
case IDM_ROTATE_OBJ:
CheckMenuItem (hMenu, IDM_POINTER, MF_UNCHECKED) ;
CheckMenuItem (hMenu, IDM_MOVE_OBJ, MF_UNCHECKED) ;
CheckMenuItem (hMenu, IDM_RESIZE_OBJ, MF_UNCHECKED) ;
CheckMenuItem (hMenu, IDM_ROTATE_OBJ, MF_CHECKED) ;
CheckMenuItem (hMenu, IDM_MODIFY_PRO, MF_UNCHECKED) ;
CheckMenuItem (hMenu, IDM_ENQUIRY, MF_UNCHECKED) ;
internalmode->releasetoolbar();
usermode = internalmode = mouse = &rotater;
mouse->presstoolbar();
SetWindowText(hwndMessage, rotinstructn);
SetWindowText(hwndMessage2, rotinstructn2);
return 0;
case IDM_MODIFY_PRO:
CheckMenuItem (hMenu, IDM_POINTER, MF_UNCHECKED) ;
CheckMenuItem (hMenu, IDM_MOVE_OBJ, MF_UNCHECKED) ;
CheckMenuItem (hMenu, IDM_RESIZE_OBJ, MF_UNCHECKED) ;
CheckMenuItem (hMenu, IDM_ROTATE_OBJ, MF_UNCHECKED) ;
CheckMenuItem (hMenu, IDM_MODIFY_PRO, MF_CHECKED) ;
CheckMenuItem (hMenu, IDM_ENQUIRY, MF_UNCHECKED) ;
internalmode->releasetoolbar();
usermode = internalmode = mouse = &modifier;
mouse->presstoolbar();
SetWindowText(hwndMessage, modinstructn);
SetWindowText(hwndMessage2, modinstructn2);
return 0;
case IDM_ENQUIRY:
CheckMenuItem (hMenu, IDM_POINTER, MF_UNCHECKED) ;
CheckMenuItem (hMenu, IDM_MOVE_OBJ, MF_UNCHECKED) ;
CheckMenuItem (hMenu, IDM_RESIZE_OBJ, MF_UNCHECKED) ;
CheckMenuItem (hMenu, IDM_ROTATE_OBJ, MF_UNCHECKED) ;
CheckMenuItem (hMenu, IDM_MODIFY_PRO, MF_UNCHECKED) ;
CheckMenuItem (hMenu, IDM_ENQUIRY, MF_CHECKED) ;
internalmode->releasetoolbar();
usermode = internalmode = mouse = &enquirer;
mouse->presstoolbar();
SetWindowText(hwndMessage, enqinstructn);
SetWindowText(hwndMessage2, enqinstructn2);
return 0;
case IDM_ABSORBING:
mouse->toggleproperty(ABSORBING);
if(mouse->getproperty() & ABSORBING)
CheckMenuItem (hMenu, IDM_ABSORBING, MF_CHECKED);
else
CheckMenuItem (hMenu, IDM_ABSORBING, MF_UNCHECKED);
updatepropertytoolbar(hwnd);
return 0;
case IDM_MAGNETIC:
mouse->toggleproperty(MAGNETIC);
if(mouse->getproperty() & MAGNETIC)
CheckMenuItem (hMenu, IDM_MAGNETIC, MF_CHECKED);
else
CheckMenuItem (hMenu, IDM_MAGNETIC, MF_UNCHECKED);
updatepropertytoolbar(hwnd);
return 0;
case IDM_CONDUCTING:
mouse->toggleproperty(CONDUCTING);
if(mouse->getproperty() & CONDUCTING)
CheckMenuItem (hMenu, IDM_CONDUCTING, MF_CHECKED);
else
CheckMenuItem (hMenu, IDM_CONDUCTING, MF_UNCHECKED);
updatepropertytoolbar(hwnd);
return 0;
case IDM_EXTERIOR:
mouse->toggleproperty(EXTERIOR);
if(mouse->getproperty() & EXTERIOR)
CheckMenuItem (hMenu, IDM_EXTERIOR, MF_CHECKED);
else
CheckMenuItem (hMenu, IDM_EXTERIOR, MF_UNCHECKED);
updatepropertytoolbar(hwnd);
return 0;
case IDM_MOVEBYLOC:
DialogBox(hInstance, "MOVEDLG", hwnd, lpfnMoveDlgProc);
return 0;
case IDM_RESIZEBYLOC:
DialogBox(hInstance, "RESIZEDLG", hwnd, lpfnResizeDlgProc);
return 0;
case IDM_RESCALEBYFACT:
DialogBox(hInstance, "RESCALEDLG", hwnd, lpfnRescaleDlgProc);
return 0;
case IDM_ROTATEBYANGLE:
DialogBox(hInstance, "ROTDLG", hwnd, lpfnRotDlgProc);
return 0;
case IDM_RECTANGLE:
if(blockvacancy)
DialogBox(hInstance, "RECTDLG", hwnd, lpfnRectDlgProc);
else
MessageBox(hwndMain, "No more block allowed", "WARNING", MB_ICONEXCLAMATION | MB_OK);
return 0;
case IDM_QUADRILATERAL:
if(blockvacancy)
DialogBox(hInstance, "QUADDLG", hwnd, lpfnQuadDlgProc);
else
MessageBox(hwndMain, "No more block allowed", "WARNING", MB_ICONEXCLAMATION | MB_OK);
return 0;
case IDM_TRIANGLE:
if(blockvacancy)
DialogBox(hInstance, "TRIDLG", hwnd, lpfnTriDlgProc);
else
MessageBox(hwndMain, "No more block allowed", "WARNING", MB_ICONEXCLAMATION | MB_OK);
return 0;
case IDM_GENERATE:
if((selected.empty() == NO ) || (unselected.empty() == NO)){
if(GeoFileSaveDlg(hwnd, szGeoFileName, szGeoTitleName)){
generategeoinfo(szGeoFileName);
}
}
return 0;
case IDM_NUM_BLOCK:
sprintf(buffer,"Number of blocks = %d", selected.blockcount() + unselected.blockcount());
MessageBox(hwndMain, buffer, "Block count", MB_ICONINFORMATION | MB_OK);
return 0;
case IDM_NUM_CELL:
sprintf(buffer,"Number of cells = %d", selected.cellcount() + unselected.cellcount());
MessageBox(hwndMain, buffer, "Block count", MB_ICONINFORMATION | MB_OK);
return 0;
case IDM_NUM_NODE:
extcount = numberexteriorelmts();
sprintf(buffer,"Number of Nodes = %d", extcount.node + selected.interiornodecount() + unselected.interiornodecount() - 1);
MessageBox(hwndMain, buffer, "Node count", MB_ICONINFORMATION | MB_OK);
return 0;
case IDM_NUM_EDGE:
extcount = numberexteriorelmts();
sprintf(buffer,"Number of Edges = %d", extcount.side + selected.interiorsidecount() + unselected.interiorsidecount() - 1);
MessageBox(hwndMain, buffer, "Edge count", MB_ICONINFORMATION | MB_OK);
return 0;
case IDM_OPTIONS:
DialogBox(hInstance, "OPTNDLG", hwnd, lpfnOptnDlgProc);
return 0;
case IDM_HELP:
MessageBox (hwnd, "Call these numbers:\n"
"Australia: 11 444\n"
"HongKong: 999\n"
"Japan: 110\n"
"Netherlands: 06-11\n"
"New Zealand: 111\n"
"Malaysia, Singapore: 999\n"
"Taiwan: 119\n"
"U.S.A.: 911\n"
"Yugoslavia: 92",
szAppName, MB_ICONEXCLAMATION | MB_OK) ;
return 0 ;
case IDM_ABOUT:
MessageBox (hwnd, "Interactive Gridding Program\n"
" Version 1.11\n"
" by\n"
" Thng Cheok Hoey\n"
" Copyright 1995",
szAppName, MB_ICONINFORMATION | MB_OK) ;
return 0 ;
case NEEDSAVE:
bNeedSave = YES;
return 0;
}
break ;
case WM_VSCROLL:
switch(wParam){
case SB_PAGEDOWN:
yOffsetView -= viewheight;
if(yOffsetView < -deskheight / 2.0) yOffsetView = -deskheight / 2.0;
vposition = VERTSCROLRANGE * (0.5 - (yOffsetView + viewheight ) / deskheight);
break;
case SB_PAGEUP:
yOffsetView += viewheight;
if((yOffsetView + viewheight) > deskheight / 2.0){
yOffsetView = deskheight / 2.0 - viewheight;
}
vposition = VERTSCROLRANGE * (0.5 - (yOffsetView + viewheight ) / deskheight);
break;
case SB_LINEDOWN:
yOffsetView -= (viewheight / 8.0);
if(yOffsetView < -deskheight / 2.0) yOffsetView = -deskheight / 2.0;
vposition = VERTSCROLRANGE * (0.5 - (yOffsetView + viewheight ) / deskheight);
break;
case SB_LINEUP:
yOffsetView += (viewheight / 8.0);
if((yOffsetView + viewheight) > deskheight / 2.0){
yOffsetView = deskheight / 2.0 - viewheight;
}
vposition = VERTSCROLRANGE * (0.5 - (yOffsetView + viewheight ) / deskheight);
break;
case SB_BOTTOM:
yOffsetView = -deskheight / 2.0;
vposition = VERTSCROLRANGE * (0.5 - (yOffsetView + viewheight ) / deskheight);
break;
case SB_TOP:
yOffsetView = deskheight / 2.0 - viewheight;
vposition = 0.0;
break;
case SB_THUMBTRACK:
redrawflag = DRAFT;
vposition = (double)LOWORD(lParam);
yOffsetView = (0.5 - vposition / VERTSCROLRANGE) * deskheight - viewheight;
if(yOffsetView < -deskheight / 2.0) yOffsetView = -deskheight / 2.0;
vposition = VERTSCROLRANGE * (0.5 - (yOffsetView + viewheight ) / deskheight);
break;
case SB_THUMBPOSITION:
redrawflag = DETAILS;
vposition = (double)LOWORD(lParam);
yOffsetView = (0.5 - vposition / VERTSCROLRANGE) * deskheight - viewheight;
if(yOffsetView < -deskheight / 2.0) yOffsetView = -deskheight / 2.0;
vposition = VERTSCROLRANGE * (0.5 - (yOffsetView + viewheight ) / deskheight);
break;
}
SetScrollPos(hwndVertScrol, SB_CTL, (short)vposition, TRUE);
InvalidateRect(hwndPaper, NULL, TRUE);
return 0;
case WM_HSCROLL:
switch(wParam){
case SB_PAGERIGHT:
xOffsetView += viewwidth;
if((xOffsetView + viewwidth) > deskwidth / 2.0){
xOffsetView = deskwidth / 2.0 - viewwidth;
}
hposition = HORZSCROLRANGE * (0.5 + xOffsetView / deskwidth);
break;
case SB_PAGELEFT:
xOffsetView -= viewwidth;
if(xOffsetView < -deskwidth / 2.0) xOffsetView = -deskwidth / 2.0;
hposition = HORZSCROLRANGE * (0.5 + xOffsetView / deskwidth);
break;
case SB_LINERIGHT:
xOffsetView += (viewwidth / 8.0);
if((xOffsetView + viewwidth) > deskwidth / 2.0){
xOffsetView = deskwidth / 2.0 - viewwidth;
}
hposition = HORZSCROLRANGE * (0.5 + xOffsetView / deskwidth);
break;
case SB_LINELEFT:
xOffsetView -= (viewwidth / 8.0);
if(xOffsetView < -deskwidth / 2.0) xOffsetView = -deskwidth / 2.0;
hposition = HORZSCROLRANGE * (0.5 + xOffsetView / deskwidth);
break;
case SB_RIGHT:
xOffsetView = deskwidth / 2.0 - viewwidth;
hposition = HORZSCROLRANGE * (0.5 + xOffsetView / deskwidth);
break;
case SB_LEFT:
xOffsetView = 0.0;
hposition = HORZSCROLRANGE * (0.5 + xOffsetView / deskwidth);
break;
case SB_THUMBTRACK:
redrawflag = DRAFT;
hposition = (double)LOWORD(lParam);
xOffsetView = deskwidth * (hposition / HORZSCROLRANGE - 0.5);
if((xOffsetView + viewwidth) > deskwidth / 2.0){
xOffsetView = deskwidth / 2.0 - viewwidth;
}
hposition = HORZSCROLRANGE * (0.5 + xOffsetView / deskwidth);
break;
case SB_THUMBPOSITION:
redrawflag = DETAILS;
hposition = (double)LOWORD(lParam);
xOffsetView = deskwidth * (hposition / HORZSCROLRANGE - 0.5);
if((xOffsetView + viewwidth) > deskwidth / 2.0){
xOffsetView = deskwidth / 2.0 - viewwidth;
}
hposition = HORZSCROLRANGE * (0.5 + xOffsetView / deskwidth);
break;
}
SetScrollPos(hwndHorzScrol, SB_CTL, (short)hposition, TRUE);
InvalidateRect(hwndPaper, NULL, TRUE);
return 0;
case WM_TIMER:
MessageBeep (0) ;
return 0 ;
case WM_CLOSE:
if(!bNeedSave || IDCANCEL != AskAboutSave(hwnd,szBdfTitleName))
DestroyWindow(hwnd);
return 0;
case WM_DESTROY :
DeleteObject(hPenDotBlack);
DeleteObject(hPenSolidBlack);
DeleteObject(hPenSolidYellow);
for(i = 0; i < 16; i++) DeleteObject(hPenArray[i]);
DeleteObject(hBrushNormal);
DeleteObject(hBrushHighlight);
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
void DrawBitmap(HDC hdc, HBITMAP hBitmap, short xStart, short yStart)
{
BITMAP bm;
HDC hdcMem;
DWORD dwSize;
POINT ptSize, ptOrg;
hdcMem = CreateCompatibleDC(hdc);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -