C#删除文件夹

public bool Delete(DirectoryInfo myFolder)
        {
            if (!myFolder.Exists)
            {
                //不存在的文件夹
                return false;
                throw new DirectoryNotFoundException(“Folder not found:” + myFolder.FullName);
            }
            foreach (FileInfo nextFile in myFolder.GetFiles())
            {
                //删除文件夹下所有的文件
                try
                {
                    nextFile.Delete();
                }
                catch (Exception e)
                {
                    return false;
                }
            }
            foreach (DirectoryInfo nextFolder in myFolder.GetDirectories())
            {
                //删除文件夹下所有的文件夹,注意嵌套的调用
                try
                {
                    Delete(nextFolder);
                }
                catch (Exception e)
                {
                    return false;
                }
            }
            try
            {
                myFolder.Delete();
            }
            catch
            {
                return false;
            }
            return true;
        }

发表在 C# | 留下评论

C++逆向访问DotNet方法(不借助COM)

使用DllImport可以在DotNet中访问C++的一些导出函数,可能有非常多的人会,但是如何在C++中访问DotNet呢(不借助COM)?

使用下面的代码就可以了

//作者:boitboy
//个人博客:http://www.cadgj.com
//功能:C++访问DotNet方法
//最后修改时间:2012/7/2
#include “StdAfx.h”
#include “DotNetFunction.h”
#include “mscoree.h”
#include “corerror.h”
#include “stdio.h”
#include “string.h”
#include <atlconv.h>
//功能:在默认的DotNet应用程序域中调用DotNet方法
//参数:strAssemblyPath,DotNet DLL或EXE文件名称
//     strTypeName,类型名称,包括命名空间(要求为静态类)
//     strMethodName,方法名称,要求为静态方法,有且只有一个类型为string的参数, 返回值为一个Int类型
//     strArgument,参数
//返回值:执行结果
int ExecuteInDefaultAppDomain(const LPWSTR strAssemblyPath,
         const LPWSTR strTypeName,
         const LPWSTR strMethodName,
         const LPWSTR strArgument)
{
 try
 {
  ICLRControl *clrcontrol=NULL;
  //CLR运行时宿主
  ICLRRuntimeHost * clr=NULL;
  LPVOID clrptr;
  HRESULT res;
  DWORD value=0;
  //加载DotNet框架
  res=CorBindToRuntimeEx(L”v2.0.50727″,L”svr”,
   //启动编译优化
   STARTUP_LOADER_OPTIMIZATION_MASK|
   //启动多线程GC(垃圾回收器)
   STARTUP_CONCURRENT_GC|
   //所有程序集归属单个应用程序域(非共享)
   STARTUP_LOADER_OPTIMIZATION_SINGLE_DOMAIN,
   CLSID_CLRRuntimeHost,
   IID_ICLRRuntimeHost,&clrptr);
  clr=(ICLRRuntimeHost*)clrptr;
  clr->GetCLRControl(&clrcontrol);
  //设置CLR应用程序域控制器
  res=clrcontrol->SetAppDomainManagerType(L”mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089″,L”System.AppDomain”);
  res=clr->Start();//启动CLR(所有对CLR的设置都必须在启动前进行)
  //在默认应用程序域中执行函数(参数1 类库文件路径 参数2 类型完全限定名(包含命名空间) 参数3 方法名称(静态方法) 参数4 方法的参数) 注意:方法必须返回一个Int类型 参数是一个String类型
  res=clr->ExecuteInDefaultAppDomain(
   //参数1 类库文件路径
   strAssemblyPath,
   //参数2 类型完全限定名(包含命名空间)
   strTypeName,
   //参数3 方法名称(静态方法)
   strMethodName,
   //参数4 方法的参数
   strArgument,
   &value);
  if(FAILED(res))
  {
   WCHAR strInfo[4096]={0};
   swprintf(strInfo,L”执行DotNet方法失败HRESULT=%x。AssemblyPath=%s;TypeName=%s;MethodName=%s;Argument=%s”,res,strAssemblyPath,strTypeName,strMethodName,strArgument);
   OutputDebugStringW(strInfo);
   return -1;
  }
  return value;
 }
 catch(…)
 {
  WCHAR strInfo[4096]={0};
  swprintf(strInfo,L”执行DotNet方法发生异常。AssemblyPath=%s;TypeName=%s;MethodName=%s;Argument=%s”,strAssemblyPath,strTypeName,strMethodName,strArgument);
  OutputDebugStringW(strInfo);
  return -1;
 }
}

下载测试工程:DotNetExchange

发表在 C++ | 标签为 , , , | 留下评论

C++设置静态文本的颜色

// ColorText_Static.h : header file

#pragma once
/////////////////////////////////////////////////////////////////////////////
// CColorText_Static window

class CColorText_Static : public CStatic
{
// Attributes
private:
BOOL b_FillBackColor;
COLORREF m_DisBackColro;
COLORREF m_BackColor;
COLORREF m_TextColor;
CFont *m_Font;
CBrush m_BackBrush;
CBrush m_DisBackBrush;

// Construction
public:
CFont *GetFont() { return m_Font; }

CColorText_Static();
virtual void SetFont(LOGFONT *LogFont, BOOL bRedraw = TRUE);
virtual void SetFont(CFont* pFont, BOOL bRedraw = TRUE);
virtual void SetFont(int nHeight, LPCTSTR fontName, BOOL bRedraw = true);

void Set_BackColor(COLORREF cr);
COLORREF Get_BackColor() { return(m_BackColor); };

void Set_TextColor(COLORREF cr)
{
m_TextColor = cr;
if(GetSafeHwnd())
Invalidate();
}

COLORREF Get_TextColor()
{
return(m_TextColor);
}
// Attributes
public:

// Operations
public:

// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CColorText_Static)
//}}AFX_VIRTUAL

// Implementation
public:
virtual ~CColorText_Static();

// Generated message map functions
protected:
//{{AFX_MSG(CColorText_Static)
afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()

};

/////////////////////////////////////////////////////////////////////////////

 

// ColorText_Static.cpp : implementation file
//

#include “stdafx.h”
#include “CColorText_Static.h”

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CColorText_Static

CColorText_Static::CColorText_Static()
{
b_FillBackColor = 0;
m_Font = 0;
m_DisBackColro = RGB(200, 200, 200);
Set_BackColor(GetSysColor(COLOR_3DFACE));
Set_TextColor(0);
}

CColorText_Static::~CColorText_Static()
{
if(m_Font)
{
m_Font->DeleteObject();
delete m_Font;
}

m_BackBrush.DeleteObject();
m_DisBackBrush.DeleteObject();
}

void CColorText_Static::SetFont(LOGFONT *LogFont, BOOL bRedraw)
{
if(m_Font)
m_Font->DeleteObject();

if(m_Font == NULL)
m_Font = new CFont();

if(m_Font)
{
if(!m_Font->CreatePointFontIndirect( LogFont ))
{
delete m_Font;
m_Font = NULL;
}
}
}

void CColorText_Static::SetFont(CFont* pFont, BOOL bRedraw)
{
LOGFONT LogFont;
pFont->GetLogFont(&LogFont);
SetFont(&LogFont, bRedraw);
}

void CColorText_Static::SetFont(int nHeight, LPCTSTR fontName, BOOL bRedraw)
{
if(m_Font)
m_Font->DeleteObject();

if(m_Font == NULL)
m_Font = new CFont();

if(m_Font)
{
if(!m_Font->CreatePointFont(nHeight, fontName))
{
delete m_Font;
m_Font = NULL;
}
}
if(bRedraw && GetSafeHwnd())
Invalidate();
}

void CColorText_Static::Set_BackColor(COLORREF cr)
{
m_BackColor = cr;
b_FillBackColor = true;

m_BackBrush.DeleteObject();
m_BackBrush.CreateSolidBrush(m_BackColor);

m_DisBackBrush.DeleteObject();
m_DisBackBrush.CreateSolidBrush(m_DisBackColro);

if(GetSafeHwnd())
Invalidate();
}

BEGIN_MESSAGE_MAP(CColorText_Static, CStatic)
//{{AFX_MSG_MAP(CColorText_Static)
ON_WM_CTLCOLOR_REFLECT()
ON_WM_ERASEBKGND()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CColorText_Static message handlers

HBRUSH CColorText_Static::CtlColor(CDC* pDC, UINT nCtlColor)
{
// TODO: Change any attributes of the DC here
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(m_TextColor);

if(m_Font)
pDC->SelectObject(m_Font);

HBRUSH hBrush = (HBRUSH) m_BackBrush;
if(!IsWindowEnabled())
hBrush = (HBRUSH) m_DisBackBrush;
return ( hBrush );
// TODO: Return a non-NULL brush if the parent’s handler should not be called return NULL;
}

BOOL CColorText_Static::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
return TRUE;
return CStatic::OnEraseBkgnd(pDC);
}

发表在 C++ | 标签为 , | 留下评论

AcDbObjectId,ads_name,Handle,long之间相互转换

//文件名:IdsTrans.h
//说明:实体ID对应的各种转换
//日期:2013.06.27
#pragma once

// 功能:将选择集转换为实体ID数组
// 参数: ObjIds,实体ID数组
// ssName,选择集
// 返回:
void SSToIds(AcDbObjectIdArray& ObjIds,ads_name ssName);
// 功能:将实体ID数组转换为选择集
// 参数: ssName,选择集
// ObjIds,实体ID数组
// 返回:
Acad::ErrorStatus IdsToSS(ads_name& ssName,AcDbObjectIdArray& ObjIds);
// 功能:将实体ID转换为CAD句柄
// 参数: handle,CAD句柄
// objId,实体ID
// 返回:
Acad::ErrorStatus IdToHandle(AcDbHandle& handle,AcDbObjectId objId);
// 功能:将实体ID转换为CAD句柄
// 参数: strHandle,CAD句柄(字符串)
// objId,实体ID
// 返回:
Acad::ErrorStatus IdToHandle(CString& strHandle,AcDbObjectId objId);
// 功能:将CAD句柄转换为实体ID
// 参数: objId,实体ID
// pDB,CAD数据库
// handle,CAD句柄
// 返回:
Acad::ErrorStatus HandleToId(AcDbObjectId& objId,AcDbDatabase* pDB,AcDbHandle handle);
// 功能:将CAD句柄转换为实体ID
// 参数: objId,实体ID
// pDB,CAD数据库
// strHandle,CAD句柄(字符串)
// 返回:
Acad::ErrorStatus HandleToId(AcDbObjectId& objId,AcDbDatabase* pDB,CString strHandle);
// 功能:在当前数据库中将CAD句柄转换为实体ID
// 参数: objId,实体ID
// handle,CAD句柄
// 返回:
Acad::ErrorStatus HandleToId(AcDbObjectId& objId,AcDbHandle handle);
// 功能:在当前数据库中将CAD句柄转换为实体ID
// 参数: objId,实体ID
// strHandle,CAD句柄(字符串)
// 返回:
Acad::ErrorStatus HandleToId(AcDbObjectId& objId,CString strHandle);
// 功能:将实体ID转换为long
// 参数: objId,实体ID
// 返回:
long IdToLong(AcDbObjectId objId);
// 功能:将long转换为实体ID
// 参数: lValue,long值
// 返回:
AcDbObjectId LongToId(long lValue);
//文件名:IdsTrans.cpp
//说明:实体ID对应的各种转换
//日期:2013.06.27
#include “StdAfx.h”
#include “IdsTrans.h”
// 功能:将选择集转换为实体ID数组
// 参数: ObjIds,实体ID数组
// ssName,选择集
// 返回:
void SSToIds(AcDbObjectIdArray& ObjIds,ads_name ssName)
{
AcDbObjectId ObjId;
ads_name EntName;
long nLength=0;
acedSSLength(ssName,&nLength);

for(int nLen=0; nLengetAcDbHandle(handle);
pObj->close();
return Acad::eOk;
}
// 功能:将实体ID转换为CAD句柄
// 参数: strHandle,CAD句柄(字符串)
// objId,实体ID
// 返回:
Acad::ErrorStatus IdToHandle(CString& strHandle,AcDbObjectId objId)
{
AcDbHandle handle;
Acad::ErrorStatus es=IdToHandle(handle,objId);
if(es!=Acad::eOk)
return Acad::eOk;
TCHAR tmpStr[256]={0};
handle.getIntoAsciiBuffer(tmpStr);
strHandle=tmpStr;
return es;
}
// 功能:将CAD句柄转换为实体ID
// 参数: objId,实体ID
// pDB,CAD数据库
// handle,CAD句柄
// 返回:
Acad::ErrorStatus HandleToId(AcDbObjectId& objId,AcDbDatabase* pDB,AcDbHandle handle)
{
Acad::ErrorStatus es=Acad::eOk;
if(pDB==NULL)
{
return Acad::eNullPtr;
}
es=pDB->getAcDbObjectId(objId,false,handle);
return es;
}
// 功能:将CAD句柄转换为实体ID
// 参数: objId,实体ID
// pDB,CAD数据库
// strHandle,CAD句柄(字符串)
// 返回:
Acad::ErrorStatus HandleToId(AcDbObjectId& objId,AcDbDatabase* pDB,CString strHandle)
{
AcDbHandle handle=strHandle;
return HandleToId(objId,pDB,handle);
}
// 功能:在当前数据库中将CAD句柄转换为实体ID
// 参数: objId,实体ID
// handle,CAD句柄
// 返回:
Acad::ErrorStatus HandleToId(AcDbObjectId& objId,AcDbHandle handle)
{
return HandleToId(objId,acdbHostApplicationServices()->workingDatabase(),handle);
}
// 功能:在当前数据库中将CAD句柄转换为实体ID
// 参数: objId,实体ID
// strHandle,CAD句柄(字符串)
// 返回:
Acad::ErrorStatus HandleToId(AcDbObjectId& objId,CString strHandle)
{
return HandleToId(objId,acdbHostApplicationServices()->workingDatabase(),strHandle);
}
// 功能:将实体ID转换为long
// 参数: objId,实体ID
// 返回:
long IdToLong(AcDbObjectId objId)
{
return objId.asOldId();
}
// 功能:将long转换为实体ID
// 参数: lValue,long值
// 返回:
AcDbObjectId LongToId(long lValue)
{
AcDbObjectId tmpId;
#ifdef _WIN64
Adesk::IntDbId oldId=lValue;
tmpId.setFromOldId(oldId);
#else
tmpId.setFromOldId(lValue);
#endif
return tmpId;
}

发表在 ObjectArx | 标签为 , , , , | 留下评论

C++动态链接控件

//LinkLable.h
//作者:boitboy
//个人博客:http://www.cadgj.com
//功能:动态链接控件
//最后修改时间:2012/7/7
#pragma once
#include “afxwin.h”
typedef bool (*OnClickHandle)();
class CLinkLable :
public CStatic
{
DECLARE_DYNAMIC(CLinkLable)
public:
CLinkLable(void);
~CLinkLable(void);
public:
void SetCursor(HCURSOR hCursor);//设置光标
HCURSOR GetCursor() const; //获取光标

void SetUnderline(BOOL bUnderline = TRUE);//设置是否使用下划线
BOOL GetUnderline() const; //获取是否使用下划线

void SetAutoSize(BOOL bAutoSize = TRUE); //设置是否根据调整控件大小以适应文字
BOOL GetAutoSize() const;//获取是否根据调整控件大小以适应文字

void SetColour(COLORREF crColour);//设置控件普通情况下的颜色
COLORREF GetColour() const;//获取控件普通情况下的颜色

void SetClickColor(COLORREF crClickedColour);//设置控件被点击过后的颜色
COLORREF GetClickedColour() const;//获取控件被点击过后的颜色

void SetHoverColour(COLORREF crHoverColour);//设置鼠标晃过控件时的颜色
COLORREF GetHoverColour() const;//获取鼠标晃过控件时的颜色

void SetTip(CString Tip);//设置提示文字
CString GetTip() const;////获取提示文字

void SetOnClickHandle(OnClickHandle m_Handle);
public:
virtual BOOL PreTranslateMessage(MSG* pMsg);
protected:
//方法
virtual void PreSubclassWindow();
void PositionWindow();
void SetDefaultCursor();
void SetClicked(BOOL bClicked=TRUE);
protected:
//变量
CFont m_Font;//字体
BOOL m_bUnderline;//下划线
BOOL m_bAdjustToFit;//调整至适应文字大小
HCURSOR m_hCursor;//光标
BOOL m_bOverControl;//鼠标晃过控件
COLORREF m_crColour;//控件普通状态下的颜色
COLORREF m_crClickedColour;//按过一次后控件的颜色
COLORREF m_crHoverColour;//鼠标晃过控件的时候控件的颜色
BOOL m_bClicked;//是否被点击过了
CToolTipCtrl m_ToolTip;//ToolTip控件
CString m_strTip;//提示
OnClickHandle m_OnClickHandle;//被按下执行函数
protected:
//消息处理
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);
afx_msg virtual void OnClicked();
DECLARE_MESSAGE_MAP()
};
class CHyperLinkLable:
public CLinkLable
{
public:
CHyperLinkLable();
~CHyperLinkLable();
public:
void SetURL(CString strURL);
CString GetURL() const;
protected:
CString m_strURL;//网页地址
BOOL m_bVisited;
virtual void OnClicked();
void SetVisited(BOOL bVisited=TRUE);
private:
CLinkLable::SetTip;//方法在此类里被禁用
CLinkLable::GetTip;//方法在此类里被禁用
CLinkLable::SetOnClickHandle;//方法在此类里被禁用

};
//LinkLable.cpp
//作者:boitboy
//个人博客:http://www.cadgj.com
//功能:动态链接控件
//最后修改时间:2012/7/7
#include “StdAfx.h”
#include “LinkLable.h”
#define TOOLTIP_ID 1
IMPLEMENT_DYNAMIC (CLinkLable, CStatic)
CLinkLable::CLinkLable(void)
{
m_hCursor = NULL;//光标为空值
m_crColour = RGB( 0, 0, 238); // Blue
m_crClickedColour = RGB( 0, 0, 238); // Purple
m_crHoverColour = RGB( 0, 0, 238);
m_bOverControl = FALSE; // Cursor not yet over control
m_bClicked = FALSE; // Hasn’t been visited yet.
m_bUnderline = TRUE; // Underline the link?
m_bAdjustToFit = TRUE; // Resize the window to fit the text?
m_strTip=_T(“”);
m_OnClickHandle=NULL;
}

CLinkLable::~CLinkLable(void)
{
try
{
m_Font.DeleteObject();
}
catch(…)
{

}
}
BEGIN_MESSAGE_MAP(CLinkLable, CStatic)
//{{AFX_MSG_MAP(CLinkLable)
ON_CONTROL_REFLECT(STN_CLICKED, OnClicked)
ON_WM_MOUSEMOVE()
ON_WM_SETCURSOR()
ON_WM_CTLCOLOR_REFLECT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CLinkLable::PreSubclassWindow()
{
// We want to get mouse clicks via STN_CLICKED
DWORD dwStyle = GetStyle();
::SetWindowLong(GetSafeHwnd(), GWL_STYLE, dwStyle | SS_NOTIFY);

// Create the font
LOGFONT lf;
if(GetFont()!=NULL)
{
GetFont()->GetLogFont(&lf);
}
lf.lfUnderline = m_bUnderline;
m_Font.CreateFontIndirect(&lf);
SetFont(&m_Font);

PositionWindow(); // Adjust size of window to fit URL if necessary
SetDefaultCursor(); // Try and load up a “hand” cursor
CRect rect;
GetClientRect(rect);
m_ToolTip.Create(this);
m_ToolTip.AddTool(this, m_strTip, rect, TOOLTIP_ID);

CStatic::PreSubclassWindow();
}
BOOL CLinkLable::PreTranslateMessage(MSG* pMsg)
{
m_ToolTip.RelayEvent(pMsg);
return CStatic::PreTranslateMessage(pMsg);
}
void CLinkLable::PositionWindow()
{
if (!::IsWindow(GetSafeHwnd()) || !m_bAdjustToFit)
return;

// Get the current window position
CRect rect;
GetWindowRect(rect);

CWnd* pParent = GetParent();
if (pParent)
pParent->ScreenToClient(rect);

// Get the size of the window text
CString strWndText;
GetWindowText(strWndText);

CDC* pDC = GetDC();
CFont* pOldFont = pDC->SelectObject(&m_Font);
CSize Extent = pDC->GetTextExtent(strWndText);
pDC->SelectObject(pOldFont);
ReleaseDC(pDC);

// Get the text justification via the window style
DWORD dwStyle = GetStyle();

// Recalc the window size and position based on the text justification
if (dwStyle & SS_CENTERIMAGE)
rect.DeflateRect(0, (rect.Height() – Extent.cy)/2);
else
rect.bottom = rect.top + Extent.cy;

if (dwStyle & SS_CENTER)
rect.DeflateRect((rect.Width() – Extent.cx)/2, 0);
else if (dwStyle & SS_RIGHT)
rect.left = rect.right – Extent.cx;
else // SS_LEFT = 0, so we can’t test for it explicitly
rect.right = rect.left + Extent.cx;

// Move the window
SetWindowPos(NULL, rect.left, rect.top, rect.Width(), rect.Height(), SWP_NOZORDER);
}
void CLinkLable::SetDefaultCursor()
{
if (m_hCursor == NULL)
{
// 获取windows路径
CString strWndDir;
GetWindowsDirectory(strWndDir.GetBuffer(MAX_PATH), MAX_PATH);
strWndDir.ReleaseBuffer();

strWndDir += _T(“\\winhlp32.exe”);
// 从winhlp32.exe获取一个手型的光标
HMODULE hModule = LoadLibrary(strWndDir);
if (hModule) {
HCURSOR hHandCursor = ::LoadCursor(hModule, MAKEINTRESOURCE(106));
if (hHandCursor)
m_hCursor = CopyCursor(hHandCursor);
}
FreeLibrary(hModule);
}
}
void CLinkLable::OnMouseMove(UINT nFlags, CPoint point)
{
CStatic::OnMouseMove(nFlags, point);

if (m_bOverControl) // Cursor is currently over control
{
CRect rect;
GetClientRect(rect);

if (!rect.PtInRect(point))
{
m_bOverControl = FALSE;
ReleaseCapture();
RedrawWindow();
return;
}
}
else // Cursor has just moved over control
{
CRect rect;
GetClientRect(rect);
if (rect.PtInRect(point))
{
m_bOverControl = TRUE;
RedrawWindow();
SetCapture();
}
}
}
BOOL CLinkLable::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
if (m_hCursor)
{
::SetCursor(m_hCursor);
return TRUE;
}
return FALSE;
}
HBRUSH CLinkLable::CtlColor(CDC* pDC, UINT nCtlColor)
{
ASSERT(nCtlColor == CTLCOLOR_STATIC);

if (m_bOverControl)
pDC->SetTextColor(m_crHoverColour);
else if (m_bClicked)
pDC->SetTextColor(m_crClickedColour);
else
pDC->SetTextColor(m_crColour);

// transparent text.
pDC->SetBkMode(TRANSPARENT);
return (HBRUSH)GetStockObject(NULL_BRUSH);
}
void CLinkLable::OnClicked()
{
if(m_OnClickHandle!=NULL)
{
try
{
if(!m_OnClickHandle())
{
return;
}
}
catch(…)
{
return;
}

}
SetClicked();
}
void CLinkLable::SetClicked(BOOL bClicked)
{
m_bClicked = bClicked;

if (::IsWindow(GetSafeHwnd()))
Invalidate();
}
void CLinkLable::SetCursor(HCURSOR hCursor)
{
m_hCursor = hCursor;
if (m_hCursor == NULL)
SetDefaultCursor();
}

HCURSOR CLinkLable::GetCursor() const
{
return m_hCursor;
}

void CLinkLable::SetUnderline(BOOL bUnderline /* = TRUE */)
{
m_bUnderline = bUnderline;

if (::IsWindow(GetSafeHwnd()))
{
LOGFONT lf;
GetFont()->GetLogFont(&lf);
lf.lfUnderline = m_bUnderline;

m_Font.DeleteObject();
m_Font.CreateFontIndirect(&lf);
SetFont(&m_Font);

Invalidate();
}
}

BOOL CLinkLable::GetUnderline() const
{
return m_bUnderline;
}

void CLinkLable::SetAutoSize(BOOL bAutoSize /* = TRUE */)
{
m_bAdjustToFit = bAutoSize;

if (::IsWindow(GetSafeHwnd()))
PositionWindow();
}

BOOL CLinkLable::GetAutoSize() const
{
return m_bAdjustToFit;
}

void CLinkLable::SetColour(COLORREF crColour)
{
if(crColour==m_crColour)
return;
m_crColour=crColour;
if (m_bOverControl||m_bClicked)
return;
//刷新界面显示
if (::IsWindow(m_hWnd))
Invalidate();
}

COLORREF CLinkLable::GetColour() const
{
return m_crColour;
}
void CLinkLable::SetClickColor(COLORREF crClickedColour)
{
if(m_crClickedColour==crClickedColour)
return;
if (m_bOverControl)
return;
if(!m_bClicked)
return;
m_crClickedColour=crClickedColour;
//刷新界面显示
if (::IsWindow(m_hWnd))
Invalidate();
}
COLORREF CLinkLable::GetClickedColour() const
{
return m_crClickedColour;
}
void CLinkLable::SetHoverColour(COLORREF crHoverColour)
{
if(m_crHoverColour==crHoverColour)
{
return;
}
if(!m_bOverControl)
return;
m_crHoverColour=crHoverColour;
//刷新界面显示
if (::IsWindow(m_hWnd))
Invalidate();
}
COLORREF CLinkLable::GetHoverColour() const
{
return m_crHoverColour;
}
void CLinkLable::SetTip(CString Tip)
{
if(m_strTip.Compare(Tip)==0)
return;
m_strTip=Tip;
if (::IsWindow(GetSafeHwnd())) {
PositionWindow();
m_ToolTip.UpdateTipText(m_strTip, this, TOOLTIP_ID);
}

}
CString CLinkLable::GetTip() const
{
return m_strTip;
}
void CLinkLable::SetOnClickHandle(OnClickHandle m_Handle)
{
m_OnClickHandle=m_Handle;
}
//////////////////////////////////////////////分隔符:CHyperLinkLable///////////////////////////////////////////////////
LONG GetRegKey(HKEY key, LPCTSTR subkey, LPTSTR retdata)
{
HKEY hkey;
LONG retval = RegOpenKeyEx(key, subkey, 0, KEY_QUERY_VALUE, &hkey);

if (retval == ERROR_SUCCESS) {
long datasize = MAX_PATH;
TCHAR data[MAX_PATH];
RegQueryValue(hkey, NULL, data, &datasize);
lstrcpy(retdata,data);
RegCloseKey(hkey);
}

return retval;
}
HINSTANCE GotoURL(LPCTSTR url, int showcmd)
{
TCHAR key[MAX_PATH + MAX_PATH];

// First try ShellExecute()
HINSTANCE result = ShellExecute(NULL, _T(“open”), url, NULL,NULL, showcmd);

// If it failed, get the .htm regkey and lookup the program
if ((UINT)result == HINSTANCE_ERROR) {

if (GetRegKey(HKEY_CLASSES_ROOT, _T(“.htm”), key) == ERROR_SUCCESS) {
lstrcat(key, _T(“\\shell\\open\\command”));

if (GetRegKey(HKEY_CLASSES_ROOT,key,key) == ERROR_SUCCESS) {
TCHAR *pos;
pos = _tcsstr(key, _T(“\”%1\””));
if (pos == NULL) { // No quotes found
#ifdef _UNICODE
pos = wcsstr(key, _T(“%1”)); // Check for %1, without quotes
#else
pos = strstr(key, _T(“%1″)); // Check for %1, without quotes
#endif

if (pos == NULL) // No parameter at all…
pos = key+lstrlen(key)-1;
else
*pos = ‘\0’; // Remove the parameter
}
else
*pos = ‘\0’; // Remove the parameter

lstrcat(pos, _T(” “));
lstrcat(pos, url);
result = (HINSTANCE) WinExec((LPCSTR)key,showcmd);
}
}
}

return result;
}
CHyperLinkLable::CHyperLinkLable()
:CLinkLable()
{
m_crColour = RGB( 0, 0, 238); // Blue
m_crClickedColour = RGB( 85, 26, 139); // Purple
m_crHoverColour = ::GetSysColor(COLOR_HIGHLIGHT);
}
CHyperLinkLable::~CHyperLinkLable()
{

}
void CHyperLinkLable::SetURL(CString strURL)
{
m_strURL=strURL;
SetTip(m_strURL);

}
CString CHyperLinkLable::GetURL() const
{
return m_strURL;
}
void CHyperLinkLable::OnClicked()
{
int result = (int)GotoURL(m_strURL, SW_SHOW);
m_bVisited = (result > HINSTANCE_ERROR);
if(!m_bVisited)
return;
SetVisited();
}
void CHyperLinkLable::SetVisited(BOOL bVisited)
{
m_bVisited = bVisited;
SetClicked(bVisited);
if (::IsWindow(GetSafeHwnd()))
Invalidate();
}

使用:
在页面放置一个静态文本
在对话框的
DoDataExchange (CDataExchange *pDX)
增加
DDX_Control(pDX,IDC_STATIC_XX,m_LinkXX);
即可使用

发表在 C++ | 标签为 | 留下评论

枚举电脑上安装的所有CAD产品

枚举本机安装的所有CAD产品软件下载

运行效果:

代码:

//AcadProduct.cs

using System;
using System.Collections.Generic;
using System.Text;

namespace Cadgj.Com.AllInstallCad
{
    /// <summary>
    /// CAD产品
    /// </summary>
    public class AcadProduct
    {
        private string _strVer = null;
        /// <summary>
        /// CAD版本号(如R16.1)
        /// </summary>
        public string strVer
        {
            get
            {
                return _strVer;
            }
            set
            {
                _strVer = value;
            }
        }
        private string _strKey = null;
        /// <summary>
        /// CAD内部识别KEY(如ACAD-301:804)
        /// </summary>
        public string strKey
        {
            get
            {
                return _strKey;
            }
            set
            {
                _strKey = value;
            }
        }
        private string _strProductName = null;
        /// <summary>
        /// CAD产品名称(如AutoCAD 2005)
        /// </summary>
        public string strProductName
        {
            get
            {
                return _strProductName;
            }
            set
            {
                _strProductName = value;
            }
        }
        private string _strLanguage = null;
        /// <summary>
        /// 语言(如Simplified Chinese)
        /// </summary>
        public string strLanguage
        {
            get
            {
                return _strLanguage;
            }
            set
            {
                _strLanguage = value;
            }
        }
        private string _strLangAbbrev = null;
        /// <summary>
        /// 语言(简写)(如chs)
        /// </summary>
        public string strLangAbbrev
        {
            get
            {
                return _strLangAbbrev;
            }
            set
            {
                _strLangAbbrev = value;
            }
        }
        private string _strAcadLocation = null;
        /// <summary>
        /// 安装路径(如D:\Program Files\AutoCAD 2005)
        /// </summary>
        public string strAcadLocation
        {
            get
            {
                return _strAcadLocation;
            }
            set
            {
                _strAcadLocation = value;
            }
            }
        private string _strRegLocation;
        /// <summary>
        /// 注册表路径(如SOFTWARE\Autodesk\AutoCAD\R16.1\ACAD-301:804)
        /// </summary>
        public string strRegLocation
        {
            get
            {
                return _strRegLocation;
            }
            set
            {
                _strRegLocation = value;
            }
        }
        private bool _bX64 = false;
        /// <summary>
        /// 是否是64位版本
        /// </summary>
        public bool bX64
        {
            get
            {
                return _bX64;
            }
            set
            {
                _bX64 = value;
            }
        }
        public override string ToString()
        {
            return strProductName + “(” + strLangAbbrev + “)”;
        }
    }
}

//AcadProducts.cs

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Win32;
using System.IO;

namespace Cadgj.Com.AllInstallCad
{
    /// <summary>
    /// CAD产品列表
    /// </summary>
    public class AcadProducts
    {
        /// <summary>
        /// 读取CAD产品
        /// </summary>
        /// <param name=”subKey”></param>
        /// <param name=”strCadVer”></param>
        /// <param name=”pszName”></param>
        /// <param name=”strSubKey”></param>
        /// <param name=”bX64″></param>
        /// <returns></returns>
        private AcadProduct ReadProduct(RegistryKey subKey, string strCadVer, string pszName, string strSubKey, bool bX64)
        {
            if (subKey == null)
                return null;
            string lpProductName = subKey.GetValue(“ProductName”).ToString();
            string lpAcadLocation = subKey.GetValue(“AcadLocation”).ToString();
            string lpLanguage = subKey.GetValue(“Language”).ToString();
            string lpLangAbbrev = subKey.GetValue(“LangAbbrev”).ToString();
            if (string.IsNullOrEmpty(lpAcadLocation))
            {
                return null;
            }
            if ((!File.Exists(Path.Combine(lpAcadLocation, “acad.exe”))) || (string.IsNullOrEmpty(lpProductName)))
            {
                return null;
            }
            AcadProduct profile = new AcadProduct();
            profile.strVer = strCadVer;
            profile.strKey = pszName;
            profile.strProductName = lpProductName;
            profile.strLanguage = lpLanguage;
            profile.strLangAbbrev = lpLangAbbrev;
            profile.strAcadLocation = lpAcadLocation;
            profile.strRegLocation = strSubKey;
            profile.bX64 = bX64;
            return profile;
        }
        /// <summary>
        /// 读取CAD产品列表
        /// </summary>
        /// <param name=”key”></param>
        /// <param name=”strCadVer”></param>
        /// <param name=”strKey”></param>
        /// <param name=”bX64″></param>
        /// <returns></returns>
        private List<AcadProduct> ReadProducts(RegistryKey key, string strCadVer, string strKey,bool bX64)
        {
            if (key == null)
            {
                return null;
            }
            List<AcadProduct> apArray = new List<AcadProduct>();
            foreach (string pszName in key.GetSubKeyNames())
            {
                try
                {
                    string strSubKey = strKey + “\\” + pszName;
                    RegistryKey subKey = key.OpenSubKey(pszName);
                    if (subKey == null)
                        continue;
                    AcadProduct ap = ReadProduct(subKey,strCadVer,pszName,strSubKey,bX64);
                    if (ap != null)
                    {
                        apArray.Add(ap);
                    }
                    subKey.Close();
                }
                catch
                {

                }
            }
            return apArray;
        }
        /// <summary>
        /// 读取所有安装的32位版本的CAD
        /// </summary>
        /// <param name=”verArray”></param>
        /// <returns></returns>
        public List<AcadProduct> EnumAcadProductsX86(IList<string> verArray)
        {
            List<AcadProduct> apArray = new List<AcadProduct>();
            try
            {
                for (int i = 0; i < verArray.Count; i++)
                {
                    string strCadVer = verArray[i];
                    // 查找AutoCAD系列产品
                    //string strKey = string.Format(“Software\\Autodesk\\AutoCAD\\{0}”, strCadVer);
                    string strKey = string.Format(“Software\\Autodesk\\AutoCAD\\{0}”, strCadVer);
                    RegistryKey key = X64RegistryKeyHelper.OpenRegistryKey(X64RegistryKeyHelper.HKEY_LOCAL_MACHINE, strKey);
                    if (key == null)
                    {
                        continue;
                    }
                    List<AcadProduct> apArray1 = ReadProducts(key, strCadVer, strKey, false);
                    if (apArray1 != null)
                    {
                        apArray.AddRange(apArray1);
                    }
                }
                return apArray;
            }
            catch
            {
                return apArray;
            }
        }
        /// <summary>
        /// 读取所有安装的64位版本的CAD(32位系统调用会返回空的列表)
        /// </summary>
        /// <param name=”verArray”></param>
        /// <returns></returns>
        public List<AcadProduct> EnumAcadProductsX64(IList<string> verArray)
        {
            List<AcadProduct> apArray = new List<AcadProduct>();
            if (IntPtr.Size == 8)
            {
                try
                {
                    for (int i = 0; i < verArray.Count; i++)
                    {
                        string strCadVer = verArray[i];
                        // 查找AutoCAD系列产品
                        //string strKey = string.Format(“Software\\Autodesk\\AutoCAD\\{0}”, strCadVer);
                        string strKey = string.Format(“Software\\Autodesk\\AutoCAD\\{0}”, strCadVer);
                        RegistryKey key = Registry.LocalMachine;
                        key = key.OpenSubKey(strKey);
                        if (key == null)
                        {
                            continue;
                        }
                        List<AcadProduct> apArray1 = ReadProducts(key, strCadVer, strKey, false);
                        if (apArray1 != null)
                        {
                            apArray.AddRange(apArray1);
                        }
                    }
                    return apArray;
                }
                catch
                {
                    return apArray;
                }
            }
            else
            {
                return apArray;
            }
        }
    }
}

//X64RegistryKeyHelper.cs

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Reflection;
using Microsoft.Win32;

namespace Cadgj.Com.AllInstallCad
{
    /// <summary>
    /// 读取64位操作系统的32位注册表辅助类
    /// </summary>
    public static class X64RegistryKeyHelper
    {
        public const int STANDARD_RIGHTS_REQUIRED = 0x000F0000;
        public const int READ_CONTROL = 0x00020000;
        public const int SYNCHRONIZE = 0x00100000;
        public const int STANDARD_RIGHTS_READ = READ_CONTROL;
        public const int STANDARD_RIGHTS_WRITE = READ_CONTROL;
        public const int STANDARD_RIGHTS_EXECUTE = READ_CONTROL;
        public const int STANDARD_RIGHTS_ALL = 0x001F0000;
        public const int KEY_QUERY_VALUE = (0x0001);
        public const int KEY_SET_VALUE = (0x0002);
        public const int KEY_CREATE_SUB_KEY = (0x0004);
        public const int KEY_ENUMERATE_SUB_KEYS = (0x0008);
        public const int KEY_NOTIFY = (0x0010);
        public const int KEY_CREATE_LINK = (0x0020);
        public const int KEY_WOW64_32KEY = (0x0200);
        public const int KEY_WOW64_64KEY = (0x0100);
        public const int KEY_WOW64_RES = (0x0300);

        public const int KEY_READ = ((STANDARD_RIGHTS_READ |
            KEY_QUERY_VALUE |
            KEY_ENUMERATE_SUB_KEYS
            | KEY_NOTIFY)
            &
            (~SYNCHRONIZE));

        public const int KEY_WRITE = ((STANDARD_RIGHTS_WRITE |
            KEY_SET_VALUE |
            KEY_CREATE_SUB_KEY)
            &
            (~SYNCHRONIZE));

        public const int KEY_EXECUTE = ((KEY_READ)
            &
            (~SYNCHRONIZE));

        public const int KEY_ALL_ACCESS = ((STANDARD_RIGHTS_ALL |
                                          KEY_QUERY_VALUE |
                                          KEY_SET_VALUE |
                                          KEY_CREATE_SUB_KEY |
                                          KEY_ENUMERATE_SUB_KEYS |
                                          KEY_NOTIFY |
                                          KEY_CREATE_LINK)
                                          &
                                         (~SYNCHRONIZE));

        static UIntPtr HKEY_CLASSES_ROOT = (UIntPtr)0x80000000;
        static UIntPtr HKEY_CURRENT_USER = (UIntPtr)0x80000001;
        static UIntPtr HKEY_USERS = (UIntPtr)0x80000003;
        static UIntPtr HKEY_CURRENT_CONFIG = (UIntPtr)0x80000005;
        public static UIntPtr HKEY_LOCAL_MACHINE = new UIntPtr(0x80000002u);
        [DllImport(“advapi32.dll”, CharSet = CharSet.Unicode, EntryPoint = “RegOpenKeyEx”)]
        static extern int RegOpenKeyEx(
            UIntPtr hKey,
            string subKey,
            uint options,
            int sam,
            out IntPtr phkResult);
        private static SafeHandle CreateRegistrySafeHandle(IntPtr handle)
        {
            Assembly ass = typeof(SafeHandle).Assembly;
            Type type = ass.GetType(“Microsoft.Win32.SafeHandles.SafeRegistryHandle”);
            SafeHandle sh = (SafeHandle)Activator.CreateInstance(type, BindingFlags.Instance | BindingFlags.NonPublic, null, new object[] { handle, true }, null);
            return sh;
        }
        private static FieldInfo GetHkeyField()
        {
            Type type = typeof(RegistryKey);
            FieldInfo info = type.GetField(“hkey”, BindingFlags.NonPublic | BindingFlags.Instance);
            return info;
        }
        public static RegistryKey OpenRegistryKey(UIntPtr rootKey, string strKey)
        {
            FieldInfo hkeyInfo = GetHkeyField();
            IntPtr hTargetKey = IntPtr.Zero;
            int l = RegOpenKeyEx(rootKey, strKey, 0, KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS | KEY_WOW64_32KEY, out hTargetKey);
            if (l != 0)
            {
                return null;
            }
            SafeHandle sh = CreateRegistrySafeHandle(hTargetKey);
            RegistryKey targetKey = (RegistryKey)Activator.CreateInstance(typeof(RegistryKey), BindingFlags.Instance | BindingFlags.NonPublic, null, new object[] { sh, true }, null);
            return targetKey;

        }
    }
}

VS工程下载:Cadgj.Com.AllInstallCad

发表在 C# | 留下评论

小游戏是男人就下100层源代码(C语言-API)+是男人就下100层声音图像资源

一直觉得是男人就下100层挺好玩的,一时兴起就自己做了一个,效果当然没有原来的好,但还是能玩的,主要是我这个人美工方面不怎么样,所以做出来的画面还是差了那么一点点。

游戏截图:

游戏下载:Man100Floor

开发工程+声音图像:Man100Floor源代码

#include <windows.h>
#include <stdio.h>
#include<stdlib.h>
#include <time.h>
#include “resource.h”
HINSTANCE hInst;
const int DLou=6;//楼层数
int CJieTi[DLou+1]={1,2,3,3,4,4,2};//阶梯类型
int LJieTi[DLou+1];//阶梯左边距
int HJieTi[DLou+1];//阶梯高度
int WJieTi[DLou+1];//阶梯宽度
int XJieTi[DLou+1];//阶梯左上脚X坐标
int YJieTi[DLou+1];//阶梯左上脚Y坐标
int TJieTi[DLou+1];//阶梯的个性数据
const int VY_JieTi=5;
const int RefreshTime=100;//刷新时间
const int AY_Num=5;
const int VX_Num=20;
const int VY_TH=26;
int zt=0;//游戏是否开始=0等待开始=1正在进行中=2结束了
static char Text[100];
//const int FixTime=12;//计算时间片
int VX=0;//X方向速度
int LAST_VX=0;//上一次X方向速度
int MOVE_RIGHT_TIMER=0;//往右移动的次数
int MOVE_LEFT_TIMER=0;//往左移动的次数
int VY=-VY_JieTi;//Y方向速度
int AY=0;//Y方向的加速度
int ManX;//角色的X坐标
int ManY;//角色的Y坐标
static int OManX,OManY;
int pz;
int pztime;
const int GameWindowWidth=411;//游戏窗口的有效区域宽度
const int GameWindowHeight=535;//游戏窗口的有效区域高度
const int GameTopHeight=23;//游戏的有效区域上部提示信息区宽度
const int GameMainHeight=495;//游戏主区域高度
const int GameMainWidth=376;//游戏主区域宽度
const int ManWidth=16;//角色的宽度
const int ManHeight=16;//角色的高度
const int DYLou=5;//楼层Y方向均分数
const int DJieTi=10;//每层分数
const int DXJieTi=3;//阶梯X方向均分数
const int VX_TS=3;
int vx_ts=0;
int Life=10;//角色的生命值
int Num=0;
int Num_time;
static HBITMAP RoleBmp;
static HBITMAP DingZiBmp;
static HBITMAP LCBmp;
static HBITMAP JieTiBmp[6];
static HBITMAP hMemBmp;//图像缓存
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int IsJiaCeng();//判断是否需要加一层阶梯
int on(int);
int Init();
int FixMan();//处理人物的函数
HWND hwnd;
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
       LPSTR lpcmdLine,int nCmdShow)
{
 hInst=hInstance;
 static TCHAR szAppName[]=TEXT(“DisplayWithScrollBar”);
 static TCHAR szClassName[]=TEXT(“DisplayWithscrlBarClass”);
 MSG msg;
 WNDCLASS wndclass;
 wndclass.style=CS_HREDRAW|CS_VREDRAW;
 wndclass.lpfnWndProc=WndProc;
 wndclass.cbClsExtra=0;
 wndclass.cbWndExtra=0;
 wndclass.hInstance=hInstance;
 wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
 wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
 wndclass.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
 wndclass.lpszMenuName=NULL;
 wndclass.lpszClassName=szClassName;
 //注册窗口类
 if(!RegisterClass(&wndclass))
 {
  MessageBox(NULL,TEXT(“This promgrame requires Windows NT”),szAppName,MB_ICONERROR);
  return 0;
 }
 //创建窗口
 hwnd=CreateWindow(
  szClassName,
  TEXT(“是男人就下100层”),
  //创建窗口时,添加了WS_VSCROLL风格,以增加垂直滚动条
  WS_OVERLAPPEDWINDOW,
  50,
  100,
  420,
  571,
  NULL,
  NULL,
  hInstance,
  NULL);
 //显示窗口
 ShowWindow(hwnd,nCmdShow);
 //更新窗口
 UpdateWindow(hwnd);
 //消息循环
 while(GetMessage(&msg,NULL,0,0))
 {
  TranslateMessage(&msg);
  DispatchMessage(&msg);
 }
 return msg.wParam;
}
static HDC hdc,hdc_Role,hdc_JieTi,hdc_lp,hdc_dz;
void Draw(HDC hdc)
{
 HPEN hpen_black;
 hpen_black=CreatePen(PS_SOLID,2,RGB(255,255,255));
 int RoleSrcX=128;
 int RoleSrcY=0;
 int i;
 SelectObject(hdc,hpen_black);
 SetTextColor(hdc,RGB(207,49,211));
 SetBkMode(hdc,TRANSPARENT);
 sprintf(Text,”LIFE:%2d 第%6d层,作者:游荡男孩(site:www.cadgj.com)”,Life,Num);
 TextOut(hdc,25,0,Text,strlen(Text));
 /*绘制游戏界面的边界*/
 MoveToEx(hdc,0,GameWindowHeight,NULL);
 LineTo(hdc,GameWindowWidth,GameWindowHeight);
 MoveToEx(hdc,GameWindowWidth,GameWindowHeight,NULL);
 LineTo(hdc,GameWindowWidth,0);
 /*开始载入人物*/
 if(zt==1)
 {
  //正在进行游戏
  if(VX==0)
  {
   //静止
   if(Life>3)
   {
    RoleSrcX=128;
    RoleSrcY=0;
   }
   else
   {
    RoleSrcX=128;
    RoleSrcY=16;
   }
  }
  else if(VX>0)
  {
   if(LAST_VX>0)
   {
    MOVE_RIGHT_TIMER+=1;
    if(MOVE_RIGHT_TIMER==4)
    {
     MOVE_RIGHT_TIMER=0;
    }
   }
   else
   {
    MOVE_RIGHT_TIMER=0;
   }

   //向右运动
   RoleSrcX=MOVE_RIGHT_TIMER*16;
   RoleSrcY=16;
   if(Life<=4)
   {
    RoleSrcX+=16*4;
   }
  }
  else
  {
   //向左运动
   if(LAST_VX<0)
   {
    MOVE_LEFT_TIMER+=1;
    if(MOVE_LEFT_TIMER==4)
    {
     MOVE_LEFT_TIMER=0;
    }
   }
   else
   {
    MOVE_LEFT_TIMER=0;
   }
   RoleSrcX=MOVE_LEFT_TIMER*16;
   RoleSrcY=0;
   if(Life<=4)
   {
    RoleSrcX+=16*4;
   }

  }
  LAST_VX=VX;

 }
 else
 {
  RoleSrcX=128;
  RoleSrcY=0;
 }
 SelectObject(hdc_Role,RoleBmp);
 BitBlt(hdc,OManX,OManY,16,16,hdc_Role,RoleSrcX,RoleSrcY,SRCCOPY);
 /*开始载入左右边带动条*/
 SelectObject(hdc_lp,LCBmp);
 BitBlt(hdc,0,GameTopHeight,(GameWindowWidth-GameMainWidth)/2,GameWindowHeight-GameTopHeight,hdc_lp,0,0,SRCCOPY);
 BitBlt(hdc,GameWindowWidth-(GameWindowWidth-GameMainWidth)/2,GameTopHeight,(GameWindowWidth-GameMainWidth)/2,GameWindowHeight-GameTopHeight,hdc_lp,0,0,SRCCOPY);
 /*绘制上面的钉子*/
 SelectObject(hdc_dz,DingZiBmp);
 BitBlt(hdc,(GameWindowWidth-GameMainWidth)/2,GameTopHeight,GameMainWidth,GameWindowHeight-GameTopHeight-GameMainHeight,hdc_dz,5,0,SRCCOPY);
 /*开始绘制阶梯*/
 for(i=0;i<=DLou-1;i++)
 {
  if(CJieTi[i]==0)
  {
   SelectObject(hdc_JieTi,JieTiBmp[0]);
   //BitBlt(MemDC,0,0,16,16,hdc_Role,0,0,NOTSRCERASE);
   BitBlt(hdc,XJieTi[i],YJieTi[i],WJieTi[i],HJieTi[i],hdc_JieTi,0,0,SRCCOPY);
  }
  else if(CJieTi[i]==1)
  {
   SelectObject(hdc_JieTi,JieTiBmp[1]);
   //BitBlt(MemDC,0,0,16,16,hdc_Role,0,0,NOTSRCERASE);
   BitBlt(hdc,XJieTi[i],YJieTi[i],WJieTi[i],HJieTi[i],hdc_JieTi,0,0,SRCCOPY);
  }
  else if(CJieTi[i]==2)
  {
   SelectObject(hdc_JieTi,JieTiBmp[2]);
   //BitBlt(MemDC,0,0,16,16,hdc_Role,0,0,NOTSRCERASE);
   BitBlt(hdc,XJieTi[i],YJieTi[i],WJieTi[i],HJieTi[i],hdc_JieTi,0,0,SRCCOPY);
  }
  else if(CJieTi[i]==3)
  {
   SelectObject(hdc_JieTi,JieTiBmp[3]);
   //BitBlt(MemDC,0,0,16,16,hdc_Role,0,0,NOTSRCERASE);
   BitBlt(hdc,XJieTi[i],YJieTi[i],WJieTi[i],HJieTi[i],hdc_JieTi,0,0,SRCCOPY);
  }
  else if(CJieTi[i]==4)
  {
   SelectObject(hdc_JieTi,JieTiBmp[4]);
   //BitBlt(MemDC,0,0,16,16,hdc_Role,0,0,NOTSRCERASE);
   BitBlt(hdc,XJieTi[i],YJieTi[i],WJieTi[i],HJieTi[i],hdc_JieTi,0,0,SRCCOPY);
  }
  else
  {
   SelectObject(hdc_JieTi,JieTiBmp[0]);
   //BitBlt(MemDC,0,0,16,16,hdc_Role,0,0,NOTSRCERASE);
   BitBlt(hdc,XJieTi[i],YJieTi[i],WJieTi[i],HJieTi[i],hdc_JieTi,0,0,NOTSRCCOPY);
  }
 }
 if(zt==0)
 {
  SetBkColor(hdc,RGB(0,0,0));
  SetBkMode(hdc,OPAQUE);
  sprintf(Text,”按任意键开始游戏”);
  TextOut(hdc,125,250,Text,16);
 }
 if(zt==2)
 {
  SetBkColor(hdc,RGB(0,0,0));
  SetBkMode(hdc,OPAQUE);
  sprintf(Text,”按任意键重新开始游戏”);
  TextOut(hdc,120,250,Text,20);
 }
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{

 RECT rect;
 RECT rectClip;
 int Width,Height;
 static HDC MemDC;
 HDC dcMemory;
 PAINTSTRUCT ps;
 int i;
 static HPEN hpen_black,hpen_blue,hpen_red,hpen_gray;
 static HBRUSH hbrush_black,hbrush_blue,hbrush_red,hbrush_gray;
 static int nClientWidth,nClientHeight; //窗口宽高
 hpen_black=CreatePen(PS_SOLID,2,RGB(255,255,255));
 HBITMAP bmpMemory;
 switch(message)
 {
 case WM_CREATE:
  /*DC初始化*/
  hdc=GetDC(hwnd);
  GetClientRect(hwnd,&rect);
  nClientWidth=rect.right-rect.left ;
  nClientHeight=rect.bottom -rect.top ;
  hdc_Role=CreateCompatibleDC(hdc);
  hdc_JieTi=CreateCompatibleDC(hdc);
  hdc_lp=CreateCompatibleDC(hdc);
  hdc_dz=CreateCompatibleDC(hdc);
  MemDC=CreateCompatibleDC(hdc);
  /*初始化临时画布 必须*/
  hMemBmp=CreateCompatibleBitmap(hdc,nClientWidth,nClientHeight);
  SelectObject(hdc_Role,hMemBmp);
  SelectObject(hdc_JieTi,hMemBmp);
  SelectObject(hdc_lp,hMemBmp);
  SelectObject(hdc_dz,hMemBmp);
  /*载入人物的图片*/
  RoleBmp= (HBITMAP)LoadImage(hInst,MAKEINTRESOURCE(IDB_BITMAP_MAN),
   IMAGE_BITMAP,0,0,LR_LOADMAP3DCOLORS);
  JieTiBmp[0]= (HBITMAP)LoadImage(hInst,MAKEINTRESOURCE(IDB_BITMAP_BLUEFLOOR),
   IMAGE_BITMAP,0,0,LR_LOADMAP3DCOLORS);
  JieTiBmp[1]= (HBITMAP)LoadImage(hInst,MAKEINTRESOURCE(IDB_BITMAP_SPRING),
   IMAGE_BITMAP,0,0,LR_LOADMAP3DCOLORS);
  JieTiBmp[2]= (HBITMAP)LoadImage(hInst,MAKEINTRESOURCE(IDB_BITMAP_NAILFLOOR),
   IMAGE_BITMAP,0,0,LR_LOADMAP3DCOLORS);
  JieTiBmp[3]= (HBITMAP)LoadImage(hInst,MAKEINTRESOURCE(IDB_BITMAP_TRANSPORT_RIGHT),
   IMAGE_BITMAP,0,0,LR_LOADMAP3DCOLORS);
  JieTiBmp[4]= (HBITMAP)LoadImage(hInst,MAKEINTRESOURCE(IDB_BITMAP_TRANSPORT_LEFT),
   IMAGE_BITMAP,0,0,LR_LOADMAP3DCOLORS);
  LCBmp= (HBITMAP)LoadImage(hInst,MAKEINTRESOURCE(IDB_BITMAP_TRANSPORT),
   IMAGE_BITMAP,0,0,LR_LOADMAP3DCOLORS);
  DingZiBmp= (HBITMAP)LoadImage(hInst,MAKEINTRESOURCE(IDB_BITMAP_NAIL),
   IMAGE_BITMAP,0,0,LR_LOADMAP3DCOLORS);
  Init();
  return 0;
 case WM_PAINT:
  hdc=BeginPaint(hwnd,&ps);
  ::GetClipBox(hdc,&rectClip);
  Width=abs(rectClip.right-rectClip.left);
  Height=abs(rectClip.bottom-rectClip.top);
  dcMemory=CreateCompatibleDC(hdc);
  ::SetBkColor(dcMemory,::GetBkColor(hdc));
  bmpMemory=::CreateCompatibleBitmap(hdc,  Width, Height);
  ::SelectObject(dcMemory,bmpMemory);
     
    /*设置内存DC的起始点*/
    //dcMemory.SetViewportOrg(-1*rectClip.left, -1*rectClip.top);
 
    /*粉刷背景*/
    //dcMemory.FillSolidRect(&rectClip, pDC->GetBkColor());

  ::Draw(hdc);
  //::BitBlt(hdc,rectClip.left, rectClip.top, abs(rectClip.right-rectClip.left), abs(rectClip.bottom-rectClip.top),
        //dcMemory, rectClip.left, rectClip.top, SRCCOPY);
  DeleteObject(bmpMemory);
  ::DeleteObject(dcMemory);

 

  ReleaseDC(hwnd,hdc);
  EndPaint(hwnd,&ps);
  return 0;
 case WM_TIMER:
  Num_time++;
  //时间函数,重难点
  for(i=0;i<=DLou-1;i++)
  {
   YJieTi[i]-=VY_JieTi;
   if(CJieTi[i]==3||CJieTi[i]==4)
   {
    TJieTi[i]++;
    if(TJieTi[i]==3)
     TJieTi[i]=0;
   }
  }
  if(OManX+VX+vx_ts<(GameWindowWidth-GameMainWidth)/2)
   ManX=(GameWindowWidth-GameMainWidth)/2;
  else if(OManX+VX+vx_ts+ManWidth>GameWindowWidth-(GameWindowWidth-GameMainWidth)/2)
   ManX=GameWindowWidth-(GameWindowWidth-GameMainWidth)/2-ManWidth;
  else
   ManX=OManX+VX+vx_ts;
  VY+=AY;
  ManY=OManY+VY;
  if(ManY>GameWindowHeight)
   Life=0;
  if(ManY<GameWindowHeight-GameMainHeight)
   Life=0;
  /*最难的人物处理函数*/
  IsJiaCeng();
  FixMan();
  if(Life==0)
  {
   KillTimer(hwnd,1);
   zt=2;
  }
  RECT invalidRect;
  invalidRect.left=(GameWindowWidth-GameMainWidth)/2;
  invalidRect.right=GameWindowWidth-(GameWindowWidth-GameMainWidth)/2;
  invalidRect.top=GameTopHeight;
  invalidRect.bottom=GameWindowHeight;
  InvalidateRect(hwnd,&invalidRect,true);

  RECT invalidRect1;
  invalidRect1.left=(GameWindowWidth-GameMainWidth)/2;
  invalidRect1.right=GameWindowWidth-(GameWindowWidth-GameMainWidth)/2;
  invalidRect1.top=0;
  invalidRect1.bottom=GameTopHeight;
  InvalidateRect(hwnd,&invalidRect1,true);
  UpdateWindow(hwnd);
  return 0;
 case WM_KEYDOWN:
  if(zt!=1)
  {
   SetTimer(hwnd,1,RefreshTime,NULL);
   zt=1;
   Init();
  }
  if(zt==1)
  {
   switch(wParam)
   {
   case VK_LEFT:VX=-VX_Num;break;
   case VK_RIGHT:VX=VX_Num;break;
   }
  }
  return 0;
 case WM_KEYUP:
  switch(wParam)
  {
  case VK_LEFT:VX=0;break;
  case VK_RIGHT:VX=0;break;
  }
  return 0;
 case WM_DESTROY:
  //释放DC
  ReleaseDC(hwnd,hdc_Role);
  ReleaseDC(hwnd,hdc_JieTi);
  ReleaseDC(hwnd,hdc_lp);
  ReleaseDC(hwnd,hdc_dz);
  ReleaseDC(hwnd,MemDC);
  PostQuitMessage(0);
  return 0;
 }
 return DefWindowProc(hwnd,message,wParam,lParam);
}
int FixMan()
{
 int JiaoX=0;
 int JiaoY=0;
 int i;
 /*最难的碰撞部分已经解决*/
 for(i=0;i<DLou;i++)
 {
  if(OManY+ManHeight<YJieTi[i]+VY_JieTi&&ManY+ManHeight>YJieTi[i]&&JiaoY==0)
   JiaoX=OManX+int(float((YJieTi[i]+VY_JieTi-OManY-ManHeight)*(ManX-OManX))/float(ManY-OManY+VY_JieTi));
  if(JiaoX>XJieTi[i]+WJieTi[i]||JiaoX+ManWidth<XJieTi[i])
  {
   JiaoX=0;
   JiaoY=0;
  }
  else
  {
   JiaoY=YJieTi[i];
   pz=i;
   pztime=1;
   break;
  }
  if(OManY+ManHeight==YJieTi[i]+VY_JieTi&&ManY+ManHeight==YJieTi[i])
  {
   if(ManX>XJieTi[i]+WJieTi[i]||ManX+ManWidth<XJieTi[i])
   {
    VY=10;
    AY=AY_Num;
    VX=0;
    pz=DLou;
    pztime=0;
    vx_ts=0;
   }
   else
   {
    AY=0;
    VY=-VY_JieTi;
    pz=i;
    pztime++;
   }
  }
 }
 if(JiaoX==0&&JiaoY==0)
 {
  OManX=ManX;
  OManY=ManY;
 }
 else
 {
  OManX=JiaoX;
  OManY=JiaoY;
 }
 if(pz!=DLou)
  on(pz);
 sprintf(Text,”%d%d”,pz,CJieTi[pz]);
 return 0;
}
/*步上阶梯的函数*/
int on(int k)
{
 int i=k;
 /*碰到灰色阶梯*/
 if(CJieTi[i]==5)
 {
  if(pztime%4==1)
   TJieTi[i]=rand()%10;
  if((TJieTi[i]==0||TJieTi[i]==1||TJieTi[i]==2)&&pztime%4==1)
  {
   OManY=YJieTi[i]+1;
   VY=0;
   AY=AY_Num;
   pz=DLou;
   pztime=0;
  }
  else
  {
   OManY=YJieTi[i]-ManHeight;
   VY=-VY_JieTi;
   AY=0;
   pz=i;
   pztime++;
  }
 }
 /*遇到反时针方向的滑轮,已经解决*/
 else if(CJieTi[i]==4)
 {
  OManY=YJieTi[i]-ManHeight;
  VY=-VY_JieTi;
  vx_ts=-VX_TS;
  AY=0;
 }
 /*遇到顺时针方向的滑轮,已经解决*/
 else if(CJieTi[i]==3)
 {
  OManY=YJieTi[i]-ManHeight;
  VY=-VY_JieTi;
  vx_ts=VX_TS;
  AY=0;
 }
 /*碰上弹簧,已经解决*/
 else if(CJieTi[i]==1)
 {
  OManY=YJieTi[i]-ManHeight;
  VY=-VY_TH;
  VX=0;
  AY=AY_Num;
  pz=DLou;
 }
 /*碰上钉子板*/
 else if(CJieTi[i]==2)
 {
  OManY=YJieTi[i]-ManHeight;
  VY=-VY_JieTi;
  AY=0;
  if(pztime%10==1)
   Life-=3;
  if(Life<0)
   Life=0;
 }
 /*碰上蓝色板部分,已经解决*/
 else{
  OManY=YJieTi[i]-ManHeight;
  VY=-VY_JieTi;
  AY=0;
  if(pztime==1&&Life>0&&Life<10)
   Life++;
 }
 return 0;
}
/*是否需要加一个阶梯的函数,已经解决的没有问题了*/
int IsJiaCeng()
{
 int i,j;
 if(YJieTi[0]<=GameWindowHeight-GameMainHeight)
 {
  Num++;
  for(i=0;i<DLou-1;i++)
  {
   YJieTi[i]=YJieTi[i+1];
   XJieTi[i]=XJieTi[i+1];
   HJieTi[i]=HJieTi[i+1];
   WJieTi[i]=WJieTi[i+1];
   CJieTi[i]=CJieTi[i+1];
   LJieTi[i]=LJieTi[i+1];
   TJieTi[i]=TJieTi[i+1];
   if(pz!=DLou&&pz>0)
    pz-=1;
  }
  j=rand()%DJieTi;
  if(j==0||j==1||j==2||j==3)
   CJieTi[DLou-1]=0;
  else if(j==4)
   CJieTi[DLou-1]=1;
  else if(j==5)
   CJieTi[DLou-1]=2;
  else if(j==6)
   CJieTi[DLou-1]=3;
  else if(j==7)
   CJieTi[DLou-1]=4;
  else
   CJieTi[DLou-1]=5;
  LJieTi[DLou-1]=rand()%(DJieTi-DXJieTi+1);
  XJieTi[DLou-1]=LJieTi[DLou-1]*GameMainWidth/DJieTi+(GameWindowWidth-GameMainWidth)/2;
  YJieTi[DLou-1]=YJieTi[DLou-2]+GameMainHeight/DLou;
  HJieTi[DLou-1]=GameMainHeight/(DYLou*DLou);
  WJieTi[DLou-1]=GameMainWidth*DXJieTi/DJieTi;
  if(CJieTi[DLou-1]==5)
   TJieTi[DLou-1]=rand()%10;
  else
   TJieTi[DLou-1]=0;
  return 1;
 }
 else
  return 0;
}
int Init()//初始化游戏
{
 int i,j;
 while(CJieTi[2]!=0&&CJieTi[3]!=0&&CJieTi[4]!=0&&CJieTi[5]!=0)
 {
  srand( (unsigned)time( NULL ) );
  //设置随机种子保证每次随机的结果均不相同
  for(i=0;i<=DLou-1;i++)
  {
   j=rand()%DJieTi;
   if(j==0||j==1||j==2||j==3)
    CJieTi[i]=0;
   else if(j==4)
    CJieTi[i]=1;
   else if(j==5)
    CJieTi[i]=2;
   else if(j==6)
    CJieTi[i]=3;
   else if(j==7)
    CJieTi[i]=4;
   else
    CJieTi[i]=5;
  }
  //产生随机数组
 }
 //产生合理的阶梯类型数组
 for(i=0;i<=DLou-1;i++)
 {
  LJieTi[i]=rand()%(DJieTi-DXJieTi+1);
  //产生阶梯布置的随机数组
  HJieTi[i]=GameMainHeight/(DYLou*DLou);
  WJieTi[i]=GameMainWidth*DXJieTi/DJieTi;
  XJieTi[i]=LJieTi[i]*GameMainWidth/DJieTi+(GameWindowWidth-GameMainWidth)/2;
  YJieTi[i]=GameWindowHeight-GameMainHeight+i*GameMainHeight/DLou+(DYLou-1)*GameMainHeight/(DYLou*DLou);
 }
 /*计算出初始角色状态*/
 for(i=0;i<=3;i++)
 {
  if(CJieTi[i+2]==0)
  {
   OManX=XJieTi[i+2]+(WJieTi[i+2]-ManWidth)/2;
   OManY=YJieTi[i+2]-ManWidth;
   pz=i+2;
   pztime=0;
   //sprintf(Text,”%d %d”,ManX,ManY);
   //MessageBox(hwnd,Text,Text,MB_OK);
   break;
  }
  //计算出角色的位置
 }
 /*初始化人物的运动性质*/
 VX=0;
 AY=0;
 VY=-VY_JieTi;
 /*初始化各个阶梯的个性数据*/
 for(i=0;i<=DLou;i++)
 {
  if(CJieTi[i]==5)
   TJieTi[i]=rand()%10;
  else
   TJieTi[i]=0;
 }
 Life=10;
 SetTimer(hwnd,1,RefreshTime,NULL);//设置刷新计时器
 return 0;
}

发表在 C++ | 2条评论

【转载】C#读取电脑信息(CPU序列号,网卡硬件地址,IP地址,硬盘ID等)

注意不要忘记添加引用System.Management

using System.Management;

public class Computer
        {

            public string CpuID;

            public string MacAddress;

            public string DiskID;

            public string IpAddress;

            public string LoginUserName;

            public string ComputerName;

            public string SystemType;

            public string TotalPhysicalMemory; //单位:M

            private static Computer _instance;

            public static Computer Instance()
            {

                if (_instance == null)

                    _instance = new Computer();

                return _instance;

            }

            public Computer()
            {

                CpuID = GetCpuID();

                MacAddress = GetMacAddress();

                DiskID = GetDiskID();

                IpAddress = GetIPAddress();

                //LoginUserName = GetUserName();

                //SystemType = GetSystemType();

                //TotalPhysicalMemory = GetTotalPhysicalMemory();

                //ComputerName = GetComputerName();

            }

            string GetCpuID()
            {

                try
                {

                    //获取CPU序列号代码

                    string cpuInfo = “”;//cpu序列号

                    ManagementClass mc = new ManagementClass(“Win32_Processor”);

                    ManagementObjectCollection moc = mc.GetInstances();

                    foreach (ManagementObject mo in moc)
                    {

                        cpuInfo = mo.Properties[“ProcessorId”].Value.ToString();

                    }

                    moc = null;

                    mc = null;

                    return cpuInfo;

                }

                catch
                {

                    return “unknow”;

                }

                finally
                {

                }
            }

            string GetMacAddress()
            {

                try
                {

                    //获取网卡硬件地址

                    string mac = “”;

                    ManagementClass mc = new ManagementClass(“Win32_NetworkAdapterConfiguration”);

                    ManagementObjectCollection moc = mc.GetInstances();

                    foreach (ManagementObject mo in moc)
                    {

                        if ((bool)mo[“IPEnabled”] == true)
                        {

                            mac = mo[“MacAddress”].ToString();

                            break;

                        }

                    }

                    moc = null;

                    mc = null;

                    return mac;

                }

                catch
                {

                    return “unknow”;

                }

                finally
                {

                }
            }

            string GetIPAddress()
            {

                try
                {

                    //获取IP地址

                    string st = “”;

                    ManagementClass mc = new ManagementClass(“Win32_NetworkAdapterConfiguration”);

                    ManagementObjectCollection moc = mc.GetInstances();

                    foreach (ManagementObject mo in moc)
                    {

                        if ((bool)mo[“IPEnabled”] == true)
                        {

                            //st=mo[“IpAddress”].ToString();

                            System.Array ar;

                            ar = (System.Array)(mo.Properties[“IpAddress”].Value);

                            st = ar.GetValue(0).ToString();

                            break;

                        }

                    }

                    moc = null;

                    mc = null;

                    return st;

                }

                catch
                {

                    return “unknow”;

                }

                finally
                {

                }
            }
            string GetDiskID()
            {

                try
                {

                    //获取硬盘ID

                    String HDid = “”;

                    ManagementClass mc = new ManagementClass(“Win32_DiskDrive”);

                    ManagementObjectCollection moc = mc.GetInstances();

                    foreach (ManagementObject mo in moc)
                    {

                        HDid = (string)mo.Properties[“Model”].Value;

                    }

                    moc = null;

                    mc = null;

                    return HDid;

                }

                catch
                {

                    return “unknow”;

                }

                finally
                {

                }
            }

            /// <summary>

            /// 操作系统的登录用户名

            /// </summary>

            /// <returns></returns>

            string GetUserName()
            {

                try
                {

                    string st = “”;

                    ManagementClass mc = new ManagementClass(“Win32_ComputerSystem”);

                    ManagementObjectCollection moc = mc.GetInstances();

                    foreach (ManagementObject mo in moc)
                    {
                        st = mo[“UserName”].ToString();
                    }

                    moc = null;

                    mc = null;

                    return st;

                }

                catch
                {

                    return “unknow”;

                }

                finally
                {

                }
            }
            /// <summary>

            /// PC类型

            /// </summary>

            /// <returns></returns>

            string GetSystemType()
            {

                try
                {

                    string st = “”;

                    ManagementClass mc = new ManagementClass(“Win32_ComputerSystem”);

                    ManagementObjectCollection moc = mc.GetInstances();

                    foreach (ManagementObject mo in moc)
                    {
                        st = mo[“SystemType”].ToString();
                    }

                    moc = null;

                    mc = null;

                    return st;

                }

                catch
                {

                    return “unknow”;

                }

                finally
                {

                }
            }

            /// <summary>

            /// 物理内存

            /// </summary>

            /// <returns></returns>

            string GetTotalPhysicalMemory()
            {

                try
                {
                    string st = “”;

                    ManagementClass mc = new ManagementClass(“Win32_ComputerSystem”);

                    ManagementObjectCollection moc = mc.GetInstances();

                    foreach (ManagementObject mo in moc)
                    {
                        st = mo[“TotalPhysicalMemory”].ToString();
                    }

                    moc = null;

                    mc = null;

                    return st;

                }

                catch
                {

                    return “unknow”;

                }

                finally
                {

                }

            }

            /// <summary>

            ///

            /// </summary>

            /// <returns></returns>

            string GetComputerName()
            {

                try
                {

                    return System.Environment.GetEnvironmentVariable(“ComputerName”);

                }

                catch
                {

                    return “unknow”;

                }

                finally
                {

                }

            }
        }

发表在 C# | 标签为 , , , | 留下评论

SimplePath 简单路径类

核心类:GSimplePath

主要功能:

     1:是否自相交

     2:计算自相交的点

     3:根据相交的点将其拆分成多条路径

     4:计算路径的长度

     5:反向路径

     6:将两条路径连接起来

     7:获取路径的范围

     8:点是否在路径内部

     9:路径是否在另一条路径内部

     10:获取子路径

     11:用一条线段将路径切开,分成两部分

     12:计算面积和中心点

     13:计算减去另外一个曲线后的结果

     14:将另外一条路径和本路径的交点加入到当前路径中

     15:将路径中的自相交点加入到路径中

     16:移除小短线

      17:填充三角化

 

辅助类:GLine,直线类

       1:计算直线的两个点和另外一个点构成的三角形的面积

       2:计算线段的标准方程

       3:根据x求y

       4:根据y求x

       5:计算直线和直线之间的交点

 

示例程序效果

1:直线相交(绿色的十字叉标识出了相交的位置)

 2:点是否在曲线内(蓝色的为曲线,红色的十字叉标识了在曲线外的点,绿色的十字叉标识了在曲线内的点)

3:曲线自相交(红色的曲线根据自相交的位置被才成了青色,白色,紫色,黄色四个子曲线)

4:曲线相减(蓝色和白色的曲线为原始出现,蓝色的曲线减去和白色部分相交的得到绿色的曲线,白色的部分减去和蓝色的相交的得到红色的部分)

5:填充三角化(左边的表示了一个填充区域,一个大的曲线里面被挖掉了两个小的曲线,右边显示的三角化后的填充区域,得到了三个曲线,和左边表示的填充区域是完全一样的,只不过挖掉了内曲线)

下载测试程序:

http://files.cnblogs.com/boitboy/SimplePathTest.rar

下载源代码:

http://files.cnblogs.com/boitboy/SimplePath.rar

发表在 C++ | 标签为 | 留下评论

支持回车换行的DataGridView

运行效果截图(原始)

运行效果截图(按下回车键)

/*
 * 文件:From1.cs
 * 说明:支持回车换行的DataGridView
 * 作者:Boitboy(游荡男孩)
 * 博客:http://www.cadgj.com/
 * 支持回车换行的列有特定的要求
 * 本例中必须设定
 * dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.True;
 * this.Column2.DefaultCellStyle = dataGridViewCellStyle2;
 */
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace Boitboy.DataGridViewEx
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            dataGridView1.Rows.Add(“测试行1”, “不支持回车换行的单元格”, “”);
            dataGridView1.Rows[0].Height = 25;

            dataGridView1.Rows.Add(“测试行2”, “支持回车换行的单元格”, “”);
            dataGridView1.Rows[1].Height = 75;
            //属性值
            dataGridView1.Rows[1].Cells[1].Style.Tag = true;
        }
        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            if (keyData != Keys.Enter)
            {
                //继续原来base.ProcessCmdKey中的处理
                return base.ProcessCmdKey(ref msg, keyData);
            }
            if (!this.dataGridView1.IsCurrentCellInEditMode)   //如果当前单元格处于编辑模式
            {
                //继续原来base.ProcessCmdKey中的处理
                return base.ProcessCmdKey(ref msg, keyData);
            }
            if (this.dataGridView1.CurrentCell.Style.Tag == null ||
                !(this.dataGridView1.CurrentCell.Style.Tag is bool))
            {
                return base.ProcessCmdKey(ref msg, keyData);
            }
            TextBox textBox = this.dataGridView1.EditingControl as TextBox;
            int nStart = textBox.SelectionStart;//得到当前光标的位置
            string text = textBox.Text;
            if (nStart < 0 || nStart > text.Length)
                return false;
            //光标签名的字
            string text1 = “”;
            if (nStart > 0)
            {
                text1 = text.Substring(0, nStart);
            }
            //光标后面的字
            string text2 = “”;
            if (nStart < text.Length)
            {
                text2 = text.Substring(nStart, text.Length – nStart);
            }
            text = text1 + “\r\n” + text2;
            textBox.Text = text;
            this.dataGridView1.CurrentCell.Value = text;
            textBox.Select(nStart + 2, 0);

            return true;
        }
    }
}

发表在 C# | 标签为 , | 留下评论