Example #1
0
XU32 XHTMLButton::Paint(DRAWCONTEXT *pDraw)
{
	if(m_nWidth==0) return XFALSE;
	XRect rect(m_nPosX,m_nPosY,m_nPosX+m_nWidth,m_nPosY+m_nHeight);
	if(!rect.IsUnion(pDraw->paint)) return XFALSE;
	//
	rect.DeflateRect(1,1);

	XU32 bc=pDraw->pDraw->GetBackColor();
	XU32 tc=pDraw->pDraw->GetColor();
	XGraphics*p=pDraw->pDraw;
	
	XU8 s=XBS_BFRAME;
	rect.InflateRect(1,1);
	PaintSelect(rect,pDraw);
	rect.DeflateRect(1,1);
	int dx=1,dy=1;
	if(m_nStatus==0) {s|=XBS_THICK;dx=0;dy=0;}
	XColor cc(pDraw->DCBACK);
	if(pDraw->DCBACK==0)
		cc=XWindow::GetSysColor(XCW_BACK);
	cc.Dark(10);
	XRect rtt=rect;
	p->DrawButton(rect,cc,s);//pDraw->DCBUTTON,s);
	
	p->SetBackColor(cc);//pDraw->DCBUTTON);
	p->SetColor(tc);
	PaintBack(pDraw,rtt);
	XU32 s1=0;
	if(dx==0)
		s1=XDomNode::Handle(XDO_PAINT,(XU32)pDraw,0);//(dy<<8)|dx);
	else
	{
		int mx,my;
		p->GetOrigin(mx,my);
		mx+=dx;
		my+=dy;
		p->SetOrigin(mx,my);
		s1=XDomNode::Handle(XDO_PAINT,(XU32)pDraw,0);//(dy<<8)|dx);
		mx-=dx;
		my-=dy;
		p->SetOrigin(mx,my);
	}

	p->SetBackColor(bc);
	return s1;
}
Example #2
0
XBOOL XDomTD::Paint(DRAWCONTEXT *pDraw,XU32 nData)
{
	if(m_nWidth<=0) 
		return 0;
	
	XRect rect(m_nPosX+pDraw->SPACING,m_nPosY+pDraw->SPACING,
				m_nPosX+m_nWidth-1,m_nPosY+m_nHeight-1);
	if(pDraw->bCollapse)
		rect.InflateRect(2,2);
	if(rect.IsUnion(pDraw->paint))
	{
//		pDraw->Save();
	//	XRect ra(m_nPosX,m_nPosY,m_nPosX
		if(pDraw->bCollapse)
		{	rect.DeflateRect(1,1);
			/*rect.InflateRect(1,1);
			rect.top--;
			rect.left--;
			rect.right++;
			rect.bottom++;*/
		}
		PaintBack(pDraw,rect);
		
		//	rect.InflateRect(1,1);
		XDomNode::Handle(XDO_PAINT,(XU32)pDraw,0);
		if(pDraw->TABBORDER)
		{
			XColor color(pDraw->DCBACK);
			color.Dark(30);
			XU32 nColor=pDraw->pDraw->SetColor(color);
			pDraw->pDraw->FrameRectangle(rect);
			pDraw->pDraw->SetColor(nColor);
		}
		if(pDraw->bCollapse)
		{
			//rect.top--;
			rect.right++;
			//rect.bottom++;
		}
		PaintBorder(pDraw,rect);
		//if(bSet) 
	//	pDraw->Restore();
		return XTRUE;
	}
	return XFALSE;
}
Example #3
0
 XU32 XHTMLBody::Handle(XU32 nOpera, XU32 pData1, XU32 pData2)
 {
	XU32 i;
 	switch(nOpera)
 	{
 	//case XDO_SET_START:
 	//	 return StartEvent((DRAWCONTEXT*)pData1);
	/*case XDO_LAYEROUT_CELLS:
		{
			CELLDATA*p=(CELLDATA*)pData2;
			DRAWCONTEXT*pd=(DRAWCONTEXT*)pData1;
			XU32 ss=PreLayerout(pd,p);
 			XDomCard::Handle(nOpera,pData1,pData2);
 			EndLayerout(pd,p);
		}return 1;*/
 	case XDO_LAYEROUT_CELL:
 		{
			  CELLDATA data;
			  LAYEROUTDATA margin;
			  //data.Reset(pData->cur.x,pData->cur.y,XTRUE);
			  CELLDATA*pData=&data;//(CELLDATA*)pData2;
			  DRAWCONTEXT*pDraw=(DRAWCONTEXT*)pData1;
			  pDraw->Init();
			  pData->Reset(pDraw->win.left,pDraw->win.top,XTRUE);

			  PreLayerout(pDraw,pData,&margin);
			  if(m_nWidth>0) 
			  {
				  if(margin.nMargin[BORDERDATA::LEFT]>0&&
					 margin.nMargin[BORDERDATA::LEFT]+m_nWidth>pDraw->view.Width())
				  {
					  margin.nMargin[BORDERDATA::LEFT]=XMAX(
						  (pDraw->view.Width()-m_nWidth)>>1,0);
				  }
				  if(m_nWidth>pDraw->win.Width())
					pDraw->win.right=pDraw->win.left+m_nWidth;
			  }
			  
			  
			  //pData->Init();
			  InitMargin(pDraw,pData,&margin,m_nPosX,m_nPosY,m_nWidth,m_nHeight);
			  XPoint pt=pData->cur;
			  for(i=0;i<m_childs.GetSize();i++)
				m_childs[i]->LayeroutItem(pDraw,pData,XTRUE);//Handle(XDO_LAYEROUT_CELLS,(XU32)pDraw,(XU32)&data);
			  pData->Reset(pt.x,pt.y,XFALSE);
			  NewRow(0,pDraw,pData,pDraw->IND);
			  pData->bEmpty=XTRUE;
			  for(i=0;i<m_childs.GetSize();i++)
				m_childs[i]->LayeroutItem(pDraw,pData,XFALSE);//Handle(XDO_LAYEROUT_CELL,(XU32)pDraw,(XU32)&data);
			  //data.max.cx-=pData->cur.x;
			  //data.max.cy-=pData->cur.y;
			  m_nWidth=pData->max.cx-pt.x;
			  m_nHeight=pData->max.cy-pt.y;
			  if(m_nWidth<pDraw->view.Width())
				  m_nWidth=pDraw->view.Width();
			  if(m_nHeight<pDraw->view.Height())
				  m_nHeight=pDraw->view.Height();
			  XSize size(m_nWidth,m_nHeight);
			  SetMargin(&margin,m_nWidth,m_nHeight,size);
			  //m_nWidth=data.max.cx-pData->cur.x;
	          pData=(CELLDATA*)pData2;
			  SetRowSize(pDraw,pData,size,m_nWidth,XFALSE);
			  NewRow(0,pDraw,pData,pDraw->IND);

			/*CELLDATA*p=(CELLDATA*)pData2;
			DRAWCONTEXT*pd=(DRAWCONTEXT*)pData1;
			LAYEROUTDATA margin;
			XU32 ss=PreLayerout(pd,p,margin);
//			StartMargin(pd,p,XTRUE);
			//BeginMargin(pd,p);
			m_nPosX=p->cur.x;
			m_nPosY=p->cur.y;
 			XDomCard::Handle(nOpera,pData1,pData2);
 			EndLayerout(pd,p);
 			m_nWidth=XMAX(p->max.cx-m_nPosX,pd->view.Width()-(m_nPosX<<1)-1);
 			m_nHeight=XMAX(p->max.cy-m_nPosY,pd->view.Height()-(m_nPosY<<1)-1);*/
 		}return 1;
 	case XDO_PAINT:
 		{
 			XRect rect(m_nPosX,m_nPosY,m_nPosX+m_nWidth,m_nPosY+m_nHeight);
 			PaintBack((DRAWCONTEXT*)pData1,rect);
			XU32 s=XDomCard::Handle(nOpera,pData1,pData2);
			PaintBorder((DRAWCONTEXT*)pData1,rect);
			return s;
 		};
	case XDO_EVENT_ONTIMER:
		{
			XRect rect(0,0,m_nWidth,m_nHeight);
			return OnTimer((XEVENTDATA*)pData1,rect)|
				   XDomCard::Handle(nOpera,pData1,pData2);
		}break;
 /*	case XDO_SET_ATTR:
 	case XDO_ADD_ATTR:
 		 SetBodyAttrib((XVar*)pData1);
 		 break;	*/
 		 //return XTRUE;
 	}
Example #4
0
XU32 XDomTable::Paint(DRAWCONTEXT *pDraw)
{
   	//XString8 str=FindAttrib(XEAB::ID,"");
	//if(str=="last")
	//	int a=0;


   if(m_nWidth<=0) return 0;
   if(m_nPosX>=pDraw->paint.right||
	  m_nPosX+m_nWidth<=pDraw->paint.left||
	  m_nPosY>=pDraw->paint.bottom||
	  m_nPosY+m_nHeight<=pDraw->paint.top) return 0;

  XU32 ss=PrePaint(pDraw);

  XRect rect(m_nPosX,m_nPosY,m_nPosX+m_nWidth,m_nPosY+m_nHeight);

  int bd=FindAttrib(XEAB::BORDER,0);
  XU8 nType=FindAttrib(XEAB::FRAME,XEnumFrame::BOX);
  XU8 bCollapse=pDraw->bCollapse;
  pDraw->bCollapse=FindAttrib(XEAB::BORDER_COLLAPSE,0);
  int nr=pDraw->SPACING;
  pDraw->SPACING=XMAX(FindAttrib(XEAB::CELLSPACING,1),0);
  XU8 d=pDraw->TABBORDER;
  pDraw->TABBORDER=bd;

  XRect ar=XRect(rect.left,rect.top,rect.right,rect.bottom);
  
  PaintBack(pDraw,ar,XTRUE);
  
  XU32 s=HandleChild(XDO_PAINT_TABLE,(XU32)pDraw,0);
  pDraw->bCollapse=bCollapse;
  pDraw->TABBORDER=d;
  if(nType==XEF::VOID_X) bd=0;

  if(bd>0)
  {
	  XGraphics*pg=pDraw->pDraw;
	  //pDraw->Save();
	  XColor cc(pDraw->DCBACK);
	  XColor dc(cc);
	  dc.Dark(60);
	  cc.Dark(30);
	  
	  int bx=m_nPosX,by=m_nPosY;
	  int ex=m_nPosX+m_nWidth-1,ey=m_nPosY+m_nHeight-1;
	  for(int i=0;i<bd;i++)
	  {
		pg->SetColor(cc);
		switch(nType)
		{
		case XEF::BOX:
		case XEF::ABOVE:
		case XEF::BORDER:
		case XEF::HSIDES:
			 pg->DrawLine(bx,by,ex,by);
			 break;
		}
		switch(nType)
		{
		case XEF::BORDER:
		case XEF::BOX:
		case XEF::VSIDES:
		case XEF::LHS:
			 pg->DrawLine(bx,by,bx,ey);
			 break;
		}
		pg->SetColor(dc);
		switch(nType)
		{
		case XEF::BORDER:
		case XEF::BOX:
		case XEF::VSIDES:
		case XEF::RHS:
			 pg->DrawLine(ex,by,ex,ey);
			 break;
		}
		switch(nType)
		{
		case XEF::BORDER:
		case XEF::BOX:
		case XEF::HSIDES:
		case XEF::BELOW:
			 pg->DrawLine(bx,ey,ex,ey);
			 break;
		}
		cc.Bright(3);
		dc.Bright(3);
		bx++;
		by++;
		ex--;
		ey--;
	  }

	  //cc.Dark(20);
	  /*pDraw->pDraw->DrawFrame(
		  XRect(m_nPosX,m_nPosY,m_nPosX+m_nWidth,m_nPosY+m_nHeight),
		  cc,bd,XTRUE);*/
//	  pDraw->Restore();
  }
  pDraw->SPACING=nr;
  PaintBorder(pDraw,ar);
  EndPaint(pDraw);
  //if(bSave) 
	//  pDraw->Restore();

  return s;
}
Example #5
0
int WINAPI PaintConEmuBackground(struct PaintBackgroundArg* pBk)
{
	DWORD nPanelBackIdx = CONBACKCOLOR(pBk->nFarColors[col_PanelText]);
	DWORD nEditorBackIdx = CONBACKCOLOR(pBk->nFarColors[col_EditorText]);
	DWORD nViewerBackIdx = CONBACKCOLOR(pBk->nFarColors[col_ViewerText]);

	if (pBk->dwLevel == 0)
	{
		if ((pBk->Place & pbp_Panels) && gbLinesColorPanel)
		{
			if (pBk->LeftPanel.bVisible)
			{
				PaintBack(pBk->hdc,
					(pBk->LeftPanel.bPlugin && gbHilightPlugins) ? gcrHilightPlugBack : pBk->crPalette[nPanelBackIdx],
					pBk->rcDcLeft);
			}
			if (pBk->RightPanel.bVisible)
			{
				PaintBack(pBk->hdc,
					(pBk->RightPanel.bPlugin && gbHilightPlugins) ? gcrHilightPlugBack : pBk->crPalette[nPanelBackIdx],
					pBk->rcDcRight);
			}
		}
		else if (((pBk->Place & pbp_Viewer) && gbLinesColorViewer)
			|| ((pBk->Place & pbp_Editor) && gbLinesColorEditor)
			)
		{
			int nCellHeight = pBk->dcSizeY / (pBk->rcConWorkspace.bottom - pBk->rcConWorkspace.top + 1);
			RECT rcWork = {0, nCellHeight, pBk->dcSizeX, pBk->dcSizeY - nCellHeight};
			PaintBack(pBk->hdc,
				pBk->crPalette[(pBk->Place & pbp_Editor) ? nEditorBackIdx : nViewerBackIdx],
				rcWork);
		}
	}

	if ((pBk->Place & pbp_Panels) && gbLinesColorPanel
		&& (pBk->LeftPanel.bVisible || pBk->RightPanel.bVisible))
	{
		int nCellHeight = 12;

		if (pBk->LeftPanel.bVisible)
			nCellHeight = pBk->rcDcLeft.bottom / (pBk->LeftPanel.rcPanelRect.bottom - pBk->LeftPanel.rcPanelRect.top + 1);
		else
			nCellHeight = pBk->rcDcRight.bottom / (pBk->RightPanel.rcPanelRect.bottom - pBk->RightPanel.rcPanelRect.top + 1);

		int nY1 = (pBk->LeftPanel.bVisible) ? pBk->rcDcLeft.top : pBk->rcDcRight.top;
		int nY2 = (pBk->rcDcLeft.bottom >= pBk->rcDcRight.bottom) ? pBk->rcDcLeft.bottom : pBk->rcDcRight.bottom;
		int nX1 = (pBk->LeftPanel.bVisible) ? 0 : pBk->rcDcRight.left;
		int nX2 = (pBk->RightPanel.bVisible) ? pBk->rcDcRight.right : pBk->rcDcLeft.right;

		PaintLines(pBk->hdc, gcrLinesColorPanel, nCellHeight, nX1, nY1, nX2, nY2);
	}
	else if (((pBk->Place & pbp_Viewer) && gbLinesColorViewer)
		|| ((pBk->Place & pbp_Editor) && gbLinesColorEditor)
		)
	{
		int nCellHeight = pBk->dcSizeY / (pBk->rcConWorkspace.bottom - pBk->rcConWorkspace.top + 1);

		PaintLines(pBk->hdc,
			(pBk->Place & pbp_Editor) ? gcrLinesColorEditor : gcrLinesColorViewer,
			nCellHeight, 0, 0, pBk->dcSizeX, pBk->dcSizeY);
	}

	return TRUE;
}
Example #6
0
/************************************************************************
* dasm                                                                  *
* - dasm is the application main window.                                *
* - everything the main window does is in this routine (for now) and    *
*   where a response is quick it appears in one of its helper functions *
*   later in this file, otherwise it has been substantial enough to     *
*   warrant its own file and routines........                           *
* - this is long                                                        *
************************************************************************/
LRESULT CALLBACK MainWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	TEXTMETRIC tm;
	POINT point;
	lptr scrll;
	int killcount;
	g_hMainWnd=hwnd;
	RECT tmp_rect;
	switch(message)
	{
	case WM_COMMAND:
		switch(LOWORD(wParam))
		{
		case file_exit:
			SendMessage(g_hMainWnd,WM_CLOSE,0,0);
			break;
		case file_save:
			savefile_text(hwnd,true,false);
			break;
		case get_comment:
			getcomment();
			break;
		case jump_to:
			jumpto();
			break;
		case change_oep:
			changeoep();
			break;
		case save_database:
			savedb();
			break;
		case load_database:
			loaddb();
			break;
		case save_asm:
			savefile_text(hwnd,false,false);
			break;
		case block_saveasm:
			savefile_text(hwnd,false,true);
			break;
		case block_savetext:
			savefile_text(hwnd,true,true);
			break;
		case cm_decrypt:
			decrypterdialog();
			break;
		case file_open:
			newfile();
			break;
		case view_segment:
			segviewer();
			break;
		case view_names:
			namesviewer();
			break;
		case view_imports:
			importsviewer();
			break;
		case view_exports:
			exportsviewer();
			break;
		case view_xrefs:
			xrefsviewer();
			break;
		case make_code:
			g_scheduler.addtask(user_makecode,priority_userrequest,nlptr,NULL);
			break;
		case make_dword:
			g_scheduler.addtask(user_makedword,priority_userrequest,nlptr,NULL);
			break;
		case float_single:
			g_scheduler.addtask(user_makesingle,priority_userrequest,nlptr,NULL);
			break;
		case float_double:
			g_scheduler.addtask(user_makedouble,priority_userrequest,nlptr,NULL);
			break;
		case float_longdouble:
			g_scheduler.addtask(user_makelongdouble,priority_userrequest,nlptr,NULL);
			break;
		case make_word:
			g_scheduler.addtask(user_makeword,priority_userrequest,nlptr,NULL);
			break;
		case make_string:
			g_scheduler.addtask(user_makestring,priority_userrequest,nlptr,NULL);
			break;
		case pascal_string:
			g_scheduler.addtask(user_pascalstring,priority_userrequest,nlptr,NULL);
			break;
		case uc_string:
			g_scheduler.addtask(user_ucstring,priority_userrequest,nlptr,NULL);
			break;
		case up_string:
			g_scheduler.addtask(user_upstring,priority_userrequest,nlptr,NULL);
			break;
		case dos_string:
			g_scheduler.addtask(user_dosstring,priority_userrequest,nlptr,NULL);
			break;
		case general_string:
			g_scheduler.addtask(user_generalstring,priority_userrequest,nlptr,NULL);
			break;
		case argover_dec:
			g_scheduler.addtask(user_argoverdec,priority_userrequest,nlptr,NULL);
			break;
		case arg_single:
			g_scheduler.addtask(user_argsingle,priority_userrequest,nlptr,NULL);
			break;
		case argover_hex:
			g_scheduler.addtask(user_argoverhex,priority_userrequest,nlptr,NULL);
			break;
		case argnegate:
			g_scheduler.addtask(user_argnegate,priority_userrequest,nlptr,NULL);
			break;
		case offset_dseg:
			g_scheduler.addtask(user_argoveroffsetdseg,priority_userrequest,nlptr,NULL);
			break;
		case argover_char:
			g_scheduler.addtask(user_argoverchar,priority_userrequest,nlptr,NULL);
			break;
		case undefine_line:
			g_scheduler.addtask(user_undefineline,priority_userrequest,nlptr,NULL);
			break;
		case undefine_lines:
			g_scheduler.addtask(user_undefinelines,priority_userrequest,nlptr,NULL);
			break;
		case undefine_lines_long:
			g_scheduler.addtask(user_undefinelines_long,priority_userrequest,nlptr,NULL);
			break;
		case block_undefine:
			g_scheduler.addtask(user_undefineblock,priority_userrequest,nlptr,NULL);
			break;
		case block_view:
			blockview();
			break;
		case block_top:
			g_scheduler.addtask(user_marktopblock,priority_userrequest,nlptr,NULL);
			break;
		case block_bottom:
			g_scheduler.addtask(user_markbottomblock,priority_userrequest,nlptr,NULL);
			break;
		case line_jumpto:
			g_scheduler.addtask(user_jumpto,priority_userrequest,nlptr,NULL);
			break;
		case line_jumptoarg2:
			g_scheduler.addtask(user_jumptoarg2,priority_userrequest,nlptr,NULL);
			break;
		case Name_Location:
			namelocation();
			break;
		case help_short:
			DialogBox(g_hInst,MAKEINTRESOURCE(help_shortcuts),hwnd,(DLGPROC)helpshortcuts);
			break;
		case help_about:
			DialogBox(g_hInst,MAKEINTRESOURCE(D_help_about),hwnd,(DLGPROC)habox);
			break;
		case Jump_Back:
			g_scheduler.addtask(user_jumpback,priority_userrequest,nlptr,NULL);
			break;
		case main_search:
			searchengine();
			break;
		case search_again:
			searchmore();
			break;
		case set_bg_color:
			g_options.bgcolor=choosecolour(g_options.bgcolor);
			GetClientRect(g_hMainWnd,&tmp_rect);
			InvalidateRect(g_hMainWnd,&tmp_rect,true);
			g_scheduler.addtask(windowupdate,priority_window,nlptr,NULL);
			break;
		case set_high_color:
			g_options.highcolor=choosecolour(g_options.highcolor);
			GetClientRect(g_hMainWnd,&tmp_rect);
			InvalidateRect(g_hMainWnd,&tmp_rect,true);
			g_scheduler.addtask(windowupdate,priority_window,nlptr,NULL);
			break;
		case set_text_color:
			g_options.textcolor=choosecolour(g_options.textcolor);
			GetClientRect(g_hMainWnd,&tmp_rect);
			InvalidateRect(g_hMainWnd,&tmp_rect,true);
			g_scheduler.addtask(windowupdate,priority_window,nlptr,NULL);
			break;
		case font_system:
			g_options.font=systemfont;
			setupfont();
			break;
		case font_courier:
			g_options.font=courierfont;
			setupfont();
			break;
		case font_courier10:
			g_options.font=courierfont10;
			setupfont();
			break;
		case font_courier12:
			g_options.font=courierfont12;
			setupfont();
			break;
		case font_ansi:
			g_options.font=ansifont;
			setupfont();
			break;
		default:
			return DefWindowProc(hwnd,message,wParam,lParam);
		}
		break;
	case WM_CHAR:
		if(charinputenabled)
			switch(wParam)
		{
			case 'c':
				g_scheduler.addtask(user_makecode,priority_userrequest,nlptr,NULL);
				break;
			case 'C':
				g_scheduler.addtask(user_argoverchar,priority_userrequest,nlptr,NULL);
				break;
			case 'd':
				g_scheduler.addtask(user_makedword,priority_userrequest,nlptr,NULL);
				break;
			case 'D':
				g_scheduler.addtask(user_argoverdec,priority_userrequest,nlptr,NULL);
				break;
			case 'H':
				g_scheduler.addtask(user_argoverhex,priority_userrequest,nlptr,NULL);
				break;
			case '-':
				g_scheduler.addtask(user_argnegate,priority_userrequest,nlptr,NULL);
				break;
			case 'n':
				namelocation();
				break;
			case ';':
				getcomment();
				break;
			case 'o':
				g_scheduler.addtask(user_argoveroffsetdseg,priority_userrequest,nlptr,NULL);
				break;
			case 'p':
				g_scheduler.addtask(user_pascalstring,priority_userrequest,nlptr,NULL);
				break;
			case 's':
				g_scheduler.addtask(user_makestring,priority_userrequest,nlptr,NULL);
				break;
			case 'u':
				g_scheduler.addtask(user_undefineline,priority_userrequest,nlptr,NULL);
				break;
			case 'U':
				g_scheduler.addtask(user_undefinelines,priority_userrequest,nlptr,NULL);
				break;
			case 'w':
				g_scheduler.addtask(user_makeword,priority_userrequest,nlptr,NULL);
				break;
			case 't':
				g_scheduler.addtask(user_marktopblock,priority_userrequest,nlptr,NULL);
				break;
			case 'b':
				g_scheduler.addtask(user_markbottomblock,priority_userrequest,nlptr,NULL);
				break;
			default:
				break;
		}
		break;
	case WM_LBUTTONDOWN:
		dio.setpos(HIWORD(lParam));
		break;
	case WM_RBUTTONDOWN:
		dio.setpos(HIWORD(lParam));
		point.x=LOWORD(lParam);
		point.y=HIWORD(lParam);
		ClientToScreen(g_hMainWnd,&point);
		TrackPopupMenu(rmenu,0,point.x,point.y,0,g_hMainWnd,NULL);
		break;
	case WM_PAINT:
		if(!KillThread)
			DoPaint(hwnd,cxChar,cyChar);
		else
			PaintBack(hwnd);
		ValidateRect(g_hMainWnd,NULL);
		break;
	case WM_CLOSE:
		if(MessageBox(g_hMainWnd,"Are you sure that you want to exit Borg ?\n\rHit Yes To Exit\n\rHit No to Stay","Borg Disassembler",
			MB_ICONEXCLAMATION|MB_YESNO)==IDNO)
			break;
		g_scheduler.stopthread();
		g_scheduler.addtask(quitborg,priority_quit,nlptr,NULL);
		KillThread=true;
		if(InThread)
			SetThreadPriority(ThreadHandle,THREAD_PRIORITY_TIME_CRITICAL);
		DestroyWindow(g_hMainWnd);
		return 0;
	case WM_DESTROY:
		save_reg_entries();
		KillThread=true;
		killcount=0;
		Sleep(0);
		SetPriorityClass(ThreadHandle,HIGH_PRIORITY_CLASS);
		if(InThread)
			while(TestThread())
			{
				killcount++;
				if(killcount>2)
				{
					// this is a nasty way of getting out.
					// sometimes the thread just will not exit nicely when its busy.
					if(TerminateThread(ThreadHandle,1))
					{
						CloseHandle(ThreadHandle);
						break;
					}
				}
			}
			DeleteCriticalSection(&g_hCs);
			PostQuitMessage(0);
			break;
	case WM_SIZE:
		if(wParam==SIZE_MAXIMIZED)
			g_options.winmax=true;
		else if (wParam==SIZE_RESTORED)
			g_options.winmax=false;
		mainwndsize.top=0;
		mainwndsize.left=0;
		mainwndsize.right=LOWORD(lParam);
		mainwndsize.bottom=HIWORD(lParam);
		GetWindowRect(hwndStatusBar,&StatusWindowSize);
		GetWindowRect(g_hMainWnd,&mainwnd);
		MoveWindow(hwndStatusBar,0,mainwndsize.bottom-StatusWindowSize.bottom+StatusWindowSize.top,
			mainwndsize.right,StatusWindowSize.bottom-StatusWindowSize.top,true);
		break;
	case WM_MOUSEWHEEL:
		if (GET_KEYSTATE_WPARAM(wParam) & MK_SHIFT)
		{
			scrll.assign(0,GET_WHEEL_DELTA_WPARAM(wParam)/WHEEL_DELTA);
			g_scheduler.addtask(hscroll,priority_userrequest,scrll,NULL);
		} 
		else
		{
			scrll.assign(0,-GET_WHEEL_DELTA_WPARAM(wParam)/WHEEL_DELTA);
			if(InThread)
				g_scheduler.addtask(scrolling,priority_userrequest,scrll,NULL);
		}
		break;
	case WM_VSCROLL:
		switch(LOWORD(wParam))
		{
		case SB_TOP:
			break;
		case SB_BOTTOM:
			break;
		case SB_LINEUP:
			scrll.assign(0,-1);
			if(InThread)
				g_scheduler.addtask(scrolling,priority_userrequest,scrll,NULL);
			break;
		case SB_LINEDOWN:
			scrll.assign(0,1);
			if(InThread)
				g_scheduler.addtask(scrolling,priority_userrequest,scrll,NULL);
			break;
		case SB_PAGEUP:
			scrll.assign(0,-mainwndsize.bottom/cyChar+1);
			if(InThread)
				g_scheduler.addtask(scrolling,priority_userrequest,scrll,NULL);
			break;
		case SB_PAGEDOWN:
			scrll.assign(0,mainwndsize.bottom/cyChar-1);
			if(InThread)
				g_scheduler.addtask(scrolling,priority_userrequest,scrll,NULL);
			break;
		case SB_THUMBPOSITION:
			scrll.assign(0,HIWORD(wParam));
			if(InThread)
				g_scheduler.addtask(vthumbposition,priority_userrequest,scrll,NULL);
			break;
		default:
			break;
		}
		break;
	case WM_HSCROLL:
		switch(LOWORD(wParam))
		{
		case SB_LINEUP:
			scrll.assign(0,-1);
			g_scheduler.addtask(hscroll,priority_userrequest,scrll,NULL);
			break;
		case SB_LINEDOWN:
			scrll.assign(0,1);
			g_scheduler.addtask(hscroll,priority_userrequest,scrll,NULL);
			break;
		case SB_PAGEUP:
			scrll.assign(0,-8);
			g_scheduler.addtask(hscroll,priority_userrequest,scrll,NULL);
			break;
		case SB_PAGEDOWN:
			scrll.assign(0,8);
			g_scheduler.addtask(hscroll,priority_userrequest,scrll,NULL);
			break;
		case SB_THUMBPOSITION:
			scrll.assign(0,HIWORD(wParam));
			if(InThread)
				g_scheduler.addtask(hthumbposition,priority_userrequest,scrll,NULL);
			break;
		default:
			break;
		}
		break;
	case WM_REPEATNAMEVIEW:
		namesviewer();
		break;
	case WM_REPEATXREFVIEW:
		xrefsviewer();
		break;
		// maximises window, used when the reg is read in at the start to maximise
		// the main window after initialisation of it
	case WM_MAXITOUT:
		ShowWindow(g_hMainWnd,SW_MAXIMIZE);
		break;
	case WM_CREATE:
		optionsinit();
		hdc=GetDC(hwnd);
		SelectObject(hdc,GetStockObject(ANSI_FIXED_FONT));
		GetTextMetrics(hdc,&tm);
		cxChar=tm.tmAveCharWidth;
		cyChar=tm.tmHeight+tm.tmExternalLeading;
		ReleaseDC(hwnd,hdc);
		InitializeCriticalSection(&g_hCs);
		hwndStatusBar=CreateStatusWindow(WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|CCS_BOTTOM,
			"No File Loaded",hwnd,2);
		GetWindowRect(hwndStatusBar,&StatusWindowSize);
		GetWindowRect(g_hMainWnd,&mainwnd);
		SetScrollRange(hwnd,SB_VERT,0,VERTSCROLLRANGE,false);
		SetScrollPos(hwnd,SB_VERT,0,false);
		KillThread=false;
		InThread=false;
		rmenu=LoadMenu(g_hInst,MAKEINTRESOURCE(right_click_menu));
		rmenu=GetSubMenu(rmenu,0);
		load_reg_entries();
		setupfont();
		break;
	case WM_KEYDOWN:
		if(!charinputenabled) break;
		switch(wParam)
		{
		case VK_HOME:
			SendMessage(hwnd,WM_VSCROLL,SB_TOP,0L);
			break;
		case VK_PRIOR:
			SendMessage(hwnd,WM_VSCROLL,SB_PAGEUP,0L);
			break;
		case VK_NEXT:
			SendMessage(hwnd,WM_VSCROLL,SB_PAGEDOWN,0L);
			break;
		case VK_DOWN:
			SendMessage(hwnd,WM_VSCROLL,SB_LINEDOWN,0L);
			break;
		case VK_UP:
			SendMessage(hwnd,WM_VSCROLL,SB_LINEUP,0L);
			break;
		case VK_LEFT:
			SendMessage(hwnd,WM_HSCROLL,SB_PAGEUP,0L);
			break;
		case VK_RIGHT:
			SendMessage(hwnd,WM_HSCROLL,SB_PAGEDOWN,0L);
			break;
		case VK_RETURN:
			if(GetKeyState(VK_SHIFT)&0x8000)
				g_scheduler.addtask(user_jumptoarg2,priority_userrequest,nlptr,NULL);
			else
				g_scheduler.addtask(user_jumpto,priority_userrequest,nlptr,NULL);
			break;
		case VK_ESCAPE:
			g_scheduler.addtask(user_jumpback,priority_userrequest,nlptr,NULL);
			break;
		case VK_F1:
			DialogBox(g_hInst,MAKEINTRESOURCE(help_shortcuts),hwnd,(DLGPROC)helpshortcuts);
			break;
		case VK_F3:
			searchmore();
			break;
		default:
			break;
		}
		break;
	default:
		return DefWindowProc(hwnd,message,wParam,lParam);
	}
	return 0;
}
Example #7
0
/************************************************************************
* DoPaint                                                               *
* - This is the main painting routine. If the program is quitting then  *
*   it returns (we dont want thread clashes due to critical sections    *
*   here and theres no point to repainting when we're exitting).        *
* - If the buffer is not ready then we wait, and go to sleep.           *
* - Otherwise the routine paints the screen from the buffer, using the  *
*   selected font and colours                                           *
************************************************************************/
void DoPaint(HWND hWnd,int cxChar,int cyChar)
{
	HDC         hDC;   // handle for the display device
	PAINTSTRUCT ps;    // holds PAINT information
	UINT        nI;
	RECT rRect;
	int startpt,sn;
	char sl[300];

	cyc=cyChar;
	while(!bufferready)
		Sleep(0);                   // wait if filling buffer
	if(KillThread)
		return;
	if(!lastline)
	{
		PaintBack(hWnd);
		return;
	}
	EnterCriticalSection(&g_hCs);
	memset(&ps, 0x00, sizeof(PAINTSTRUCT));
	hDC = BeginPaint(hWnd, &ps);
	// Included as the background is not a pure color
	//SetBkMode(hDC,TRANSPARENT);
	switch(g_options.font)
	{
	case courierfont:
	case courierfont10:
	case courierfont12:
		if(cf==NULL)
			SelectObject(hDC,GetStockObject(ANSI_FIXED_FONT));
		else
			SelectObject(hDC,cf);
		break;
	case ansifont:
		SelectObject(hDC,GetStockObject(ANSI_FIXED_FONT));
		break;
	case systemfont:
		SelectObject(hDC,GetStockObject(SYSTEM_FIXED_FONT));
		break;
	default:
		SelectObject(hDC,GetStockObject(ANSI_FIXED_FONT));
		break;
	}
	GetClientRect(hWnd,&rRect);
	if(hpos>max_length-(rRect.right/cxChar))
		hpos=max_length-rRect.right/cxChar;
	if(rrr!=(unsigned int)rRect.right)
	{
		rrr=(unsigned int)rRect.right;
		SetScrollRange(hWnd,SB_HORZ,0,max_length-rRect.right/cxChar,true);
	}
	SetScrollPos(hWnd,SB_HORZ,hpos,true);
	nScreenRows = rRect.bottom/cyChar;
	ShowScrollBar (hWnd, SB_VERT, true);
	ShowScrollBar (hWnd, SB_HORZ, max_length>(rRect.right/cxChar));
	startpt=0;
	SetTextColor(hDC,g_options.textcolor);
	for(nI=startpt;nI<lastline;nI++)
	{
		if((userselonscreen)&&(nI==usersel))
			SetBkColor(hDC,g_options.highcolor);
		else
			SetBkColor(hDC,g_options.bgcolor);
		strcpy(sl,&MainBuff[nI*max_length]);
		sn=strlen(sl);
		if(sn<max_length)
			memset(&sl[sn],' ',max_length-sn);
		sl[max_length]=0;
		TabbedTextOut(hDC,2-hpos*cxChar,nI*cyChar,sl,
			max_length,0,NULL,2-hpos*cxChar);
	}
	for(nI=lastline;nI<nScreenRows+1;nI++)
	{
		if((userselonscreen)&&(nI==usersel))
			SetBkColor(hDC,g_options.highcolor);
		else
			SetBkColor(hDC,g_options.bgcolor);
		memset(sl,' ',max_length);
		sl[max_length]=0;
		TabbedTextOut(hDC,2-hpos*cxChar,nI*cyChar,sl,
			max_length,0,NULL,2-hpos*cxChar);
	}
	// Inform Windows painting is complete
	EndPaint(hWnd,&ps);
	LeaveCriticalSection(&g_hCs);
}