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

📄 igrid.c

📁 有限元学习研究用源代码(老外的),供科研人员参考
💻 C
📖 第 1 页 / 共 5 页
字号:
			   ((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 + -