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

📄 igrid.c

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