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

📄 ttl_inverterdlg.cpp

📁 数字电路学习。TTL方向器的具体工作过程。各器件导通截至情况和电路各点电压变化。
💻 CPP
字号:
// ttl_inverterDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "ttl_inverter.h"
#include "ttl_inverterDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// Cttl_inverterDlg 对话框



Cttl_inverterDlg::Cttl_inverterDlg(CWnd* pParent /*=NULL*/)
	: CDialog(Cttl_inverterDlg::IDD, pParent)
	, show_which(0)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void Cttl_inverterDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(Cttl_inverterDlg, CDialog)
	ON_WM_PAINT()
	ON_WM_TIMER( )
	ON_WM_QUERYDRAGICON()
	//}}AFX_MSG_MAP
	ON_BN_CLICKED(IDC_BUTTON3, OnBnClickedButton3)
	ON_BN_CLICKED(IDC_BUTTON4, OnBnClickedButton4)
	ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)
	ON_BN_CLICKED(IDC_BUTTON2, OnBnClickedButton2)
	ON_BN_CLICKED(IDC_BUTTON6, OnBnClickedButton6)
	ON_BN_CLICKED(IDC_BUTTON5, OnBnClickedButton5)
	ON_BN_CLICKED(IDC_BUTTON7, OnBnClickedButton7)
	ON_BN_CLICKED(IDC_BUTTON8, OnBnClickedButton8)
END_MESSAGE_MAP()


// Cttl_inverterDlg 消息处理程序

BOOL Cttl_inverterDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO:在此添加额外的初始化代码
	timer_on = false;
	cnt = 0;
	byhand = false;
	dis_step = 0;//

	return TRUE;  // 除非设置了控件的焦点,否则返回 TRUE
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void Cttl_inverterDlg::OnPaint() 
{
	CPaintDC dc(this); // 用于绘制的设备上下文
	CDC mem_dc;
	CBitmap res;
		mem_dc.CreateCompatibleDC( &dc );
		int px = 50 ,py = 340;
		CBitmap * old_bmp;

	if( 0 == show_which ){

		res.LoadBitmap( IDB_BITMAP3 );
		old_bmp = mem_dc.SelectObject( &res );
		res.DeleteObject();
		dc.StretchBlt( 0,0,377,382,&mem_dc,0,0,754,765,SRCCOPY );
	}
	else if( 1 == show_which ){
		res.LoadBitmap( IDB_BITMAP1 );
		old_bmp = mem_dc.SelectObject( &res );
		res.DeleteObject();
		dc.StretchBlt( 0,0,377,382,&mem_dc,0,0,754,765,SRCCOPY );
	}
	else{
		res.LoadBitmap( IDB_BITMAP2 );
		old_bmp = mem_dc.SelectObject( &res );
		res.DeleteObject();
		dc.StretchBlt( 0,0,377,382,&mem_dc,0,0,754,765,SRCCOPY );
	}

}

//当用户拖动最小化窗口时系统调用此函数取得光标显示。
HCURSOR Cttl_inverterDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}

void Cttl_inverterDlg::OnBnClickedButton3()
{
	if( timer_on )
		KillTimer(timer_ID);

	show_which = 0;//显示原图
	InvalidateRect(NULL,false);
}

void Cttl_inverterDlg::OnBnClickedButton4()
{
	EndDialog( 0 );

}

void Cttl_inverterDlg::OnBnClickedButton1()
{
	if( timer_on )
		KillTimer(timer_ID);
	
	show_which = 0;//显示原图
    byhand = false;//自动显示一气合成
	InvalidateRect(NULL,false);
	SendMessage( WM_PAINT );

	cnt = 0;
	show_which = 1;//输入高电平图
	step = 0;
	timer_on = true;
	timer_ID = SetTimer(1,10,NULL);
}

void Cttl_inverterDlg::OnBnClickedButton2()
{
	if( timer_on )
		KillTimer(timer_ID);
	
	show_which = 0;//显示原图
    byhand = false;//自动显示一气合成
	InvalidateRect(NULL,false);
	SendMessage( WM_PAINT );

	cnt = 0;
	show_which = 2;//输入低电平图
	step = 0;
	timer_on = true;
	timer_ID = SetTimer(1,10,NULL);
}

void Cttl_inverterDlg::OnTimer( UINT )
{
	if( 2 == show_which ){
		int t_step[] = { 1,7,8,11,17,18 };

		ShowOneStep2();
		if( byhand ){
			if( step >= t_step[dis_step] ){
				KillTimer(timer_ID);
				timer_on = false;
			}
		}
		else{
			//计算当前的步骤:
			dis_step = 0;
			while( t_step[dis_step] < step ) dis_step++; 
			if( step > 18 ){
				KillTimer(timer_ID);
				timer_on = false;
			}
		}
	}
	else if( 1 == show_which ){

		int t_step[] = { 1,15,19,20,21,22,23,24 };

		ShowOneStep();
		if( byhand ){
			if( step >= t_step[dis_step] ){
				KillTimer(timer_ID);
				timer_on = false;
			}
		}
		else{
			//计算当前的步骤:
			dis_step = 0;
			while( t_step[dis_step] < step ) dis_step++; 
			if( step > 22 ){
				KillTimer(timer_ID);
				timer_on = false;
			}
		}
	}

}

void Cttl_inverterDlg::ShowOneStep()
{
		CRect block[] = { 
			CRect(14,385,109,94),//输入信号
			CRect(240,63,427,22),//T1\T2\T5导通
			CRect(232,83,31,176),CRect(230,257,24,73),CRect(223,329,53,7),
			CRect(254,335,135,44),CRect(388,349,8,56),
			CRect(395,383,49,67),
			CRect(443,437,85,8),CRect(527,415,9,54),
			CRect(535,447,68,158),

			CRect(378,82,81,105),CRect(378,185,62,183),
			CRect(440,84,173,270),CRect(563,352,27,19),//T4截止

			CRect(584,370,94,11),CRect(565,370,20,14),			CRect(565,383,15,51),CRect(535,407,45,27),//输出回路
			CRect(467,357,99,81),CRect(272,378,116,84),CRect(253,254,117,71),//三点电压
			CRect(613,380,126,99)//输出电压
		};
		//动态显示方向:上0下1左2右3,整体4
		int dir[] = { 
			4,//1
			2,//2
			1,1,1,//3
			3,3,
			1,
			3,3,
			1,
			1,1,
			4,4,
			2,2, 1,1,//4
			4,4,4,4//5,6,7,8
		};
		/*
		int cnt_total[] = {
			50,
			50,
			50,25,3,
			25,3,
			10,
			25,3,
			50,
			25,35,
			5,5,
			50,10,10,10,
			50,50,50,50
		};*/
		int cnt_total[] = {
			1,
			1,
			1,1,1,
			1,1,
			1,
			1,1,
			1,
			1,1,
			1,1,
			1,1,1,1,
			1,1,1,1
		};
		CRect rect;

		switch( dir[step] ){
			case 0:  break;
			case 1:
				//向下
				rect.top = block[step].top/2;
				rect.bottom = rect.top + (block[step].bottom*cnt/cnt_total[step])/2;
				rect.left = block[step].left/2;
				rect.right = rect.left + block[step].right/2;
				InvalidateRect( &rect,false );
				cnt++;
				if( rect.bottom > (block[step].top + block[step].bottom)/2 ){
					step ++;
					cnt = 0;
				}
			break;
			case 2:
				//向左
				rect.right = ( block[step].left + block[step].right )/2;
				rect.top = block[step].top/2;
				rect.left = rect.right - (block[step].right*cnt/cnt_total[step])/2;
				rect.bottom = rect.top + block[step].bottom/2;
				InvalidateRect( &rect,false );
				cnt++;
				if( rect.left < block[step].left/2 ){
					step++;
					cnt = 0;
				}
			break;
			case 3:
				//右3
				rect.left = block[step].left/2;
				rect.right = rect.left + (block[step].right*cnt/cnt_total[step])/2;
				rect.top = block[step].top/2;
				rect.bottom = rect.top + block[step].bottom/2;
				InvalidateRect( &rect,false );
				cnt++;
				if( rect.right > (block[step].left +  block[step].right)/2 ){
					step++;
					cnt = 0;
				}
			break;
			case 4:
				rect.left = block[step].left/2;
				rect.right = rect.left + block[step].right/2;
				rect.top = block[step].top/2;
				rect.bottom = rect.top + block[step].bottom/2;
				InvalidateRect( &rect,false );
				cnt++;
				if( byhand ){
						step++;
						cnt = 0;
				}
				else{
					if( cnt > cnt_total[step] ){
						step++;
						cnt = 0;
					}
				}
		}

}

void Cttl_inverterDlg::ShowOneStep2()
{
		CRect block[] = { //输入信号
			CRect(14,384,128,93),//1
			CRect( 239,65,437,17),//2
			CRect(228,80,39,197), CRect(238,277,15,53),CRect(221,329,55,7),CRect(213,335,33,45),
			CRect(60,366,154,16),
			CRect(254,245,127,81),//3
			CRect(251,336,144,76), CRect( 394,233,126,233),CRect(519,382,97,171),//4
			CRect(410,81,41,139), CRect(425,195,108,62),CRect(532,229,73,142),CRect(561,370,63,16),CRect(623,370,57,11),
			CRect(532,81,64,140),
			CRect(628,380,115,96)//5
		};
		//动态显示方向:上0下1左2右3,整体4
		int dir[] = { 
			4,//1
			2,//2
			1,1,1,1,
			2,
			4,//3
			4,4,4,//4
			1,3,1,3,3,//5
			1,
			4
		};
/*
		int cnt_total[] = {
			100,//1
			100,//2
			50,25,3,25,
			50,
			100,//3
			2,2,2,//4
			50,50,60,30,30,//5
			50,
			100
		};*/
	int cnt_total[] = {
			1,//1
			1,//2
			1,1,1,1,
			1,
			1,//3
			1,1,1,//4
			1,1,1,1,1,//5
			1,
			1
		};
		CRect rect;

		switch( dir[step] ){
			case 0:  break;
			case 1:
				//向下
				rect.top = block[step].top/2;
				rect.bottom = rect.top + (block[step].bottom*cnt/cnt_total[step])/2;
				rect.left = block[step].left/2;
				rect.right = rect.left + block[step].right/2;
				InvalidateRect( &rect,false );
				cnt++;
				if( rect.bottom > (block[step].top + block[step].bottom)/2 ){
					step ++;
					cnt = 0;
				}
			break;
			case 2:
				//向左
				rect.right = ( block[step].left + block[step].right )/2;
				rect.top = block[step].top/2;
				rect.left = rect.right - (block[step].right*cnt/cnt_total[step])/2;
				rect.bottom = rect.top + block[step].bottom/2;
				InvalidateRect( &rect,false );
				cnt++;
				if( rect.left < block[step].left/2 ){
					step++;
					cnt = 0;
				}
			break;
			case 3:
				//右3
				rect.left = block[step].left/2;
				rect.right = rect.left + (block[step].right*cnt/cnt_total[step])/2;
				rect.top = block[step].top/2;
				rect.bottom = rect.top + block[step].bottom/2;
				InvalidateRect( &rect,false );
				cnt++;
				if( rect.right > (block[step].left +  block[step].right)/2 ){
					step++;
					cnt = 0;
				}
			break;
			case 4:
				rect.left = block[step].left/2;
				rect.right = rect.left + block[step].right/2;
				rect.top = block[step].top/2;
				rect.bottom = rect.top + block[step].bottom/2;
				InvalidateRect( &rect,false );
				cnt++;
				if( byhand ){
						step++;
						cnt = 0;
				}
				else{
					if( cnt > cnt_total[step] ){
						step++;
						cnt = 0;
					}
				}
		}

}

void Cttl_inverterDlg::OnBnClickedButton5()
{
	if( 1 != show_which ){
		//如果以前不是显示本图
		show_which = 0;//显示原图
		InvalidateRect(NULL,false);
		SendMessage( WM_PAINT );

		show_which = 1;//显示本图
		dis_step = 0;//
		byhand = true;
		cnt = 0;
		step = 0;
		timer_on = true;
		timer_ID = SetTimer(1,10,NULL);
	}
	else{
		dis_step++;
		if( dis_step > 6 ){
			dis_step = 6;
			return;
		}
		byhand = true;
		if( dis_step < 1 ){
			cnt = 0;
			step = 0;
		}
		timer_on = true;
		timer_ID = SetTimer(1,10,NULL);
	}

}

void Cttl_inverterDlg::OnBnClickedButton6()
{
	int t_step[] = { 1,15,19,20,21,22,23,24 };

	if( 1 != show_which ){
		//如果以前不是显示本图
		show_which = 0;//显示原图
		InvalidateRect(NULL,false);
		SendMessage( WM_PAINT );

		show_which = 1;//显示本图
		byhand = true;
		dis_step = -1;
	}
	else{
		dis_step--;

		show_which = 0;//显示原图
		cnt = 0;
		InvalidateRect(NULL,false);
		SendMessage( WM_PAINT );
		if( dis_step < 0 ){
			dis_step = -1;
			return;
		}
		//显示
		show_which = 1;
		step = 0;
		while(  step < t_step[dis_step] )
			ShowOneStep();
		//SendMessage( WM_PAINT );
	}

}
//〈〈〈〈〈〈〈〈〈
void Cttl_inverterDlg::OnBnClickedButton7()
{
		int t_step[] = { 1,7,8,11,17,18 };

	if( 2 != show_which ){
		//如果以前不是显示本图
		show_which = 0;//显示原图
		InvalidateRect(NULL,false);
		SendMessage( WM_PAINT );

		show_which = 2;//显示本图
		byhand = true;
		dis_step = -1;
	}
	else{
		dis_step--;

		show_which = 0;//显示原图
		cnt = 0;
		InvalidateRect(NULL,false);
		SendMessage( WM_PAINT );
		if( dis_step < 0 ){
			dis_step = -1;
			return;
		}
		//显示
		show_which = 2;
		step = 0;
		while(  step < t_step[dis_step] )
			ShowOneStep2();
		//SendMessage( WM_PAINT );
	}
}

//〉〉〉〉〉〉〉〉
void Cttl_inverterDlg::OnBnClickedButton8()
{
	if( 2 != show_which ){
		//如果以前不是显示本图
		show_which = 0;//显示原图
		InvalidateRect(NULL,false);
		SendMessage( WM_PAINT );

		show_which = 2;//显示本图
		dis_step = 0;//
		byhand = true;
		cnt = 0;
		step = 0;
		timer_on = true;
		timer_ID = SetTimer(1,10,NULL);
	}
	else{
		dis_step++;
		if( dis_step > 5 ){
			dis_step = 5;
			return;
		}
		byhand = true;
		if( dis_step < 1 ){
			cnt = 0;
			step = 0;
		}
		timer_on = true;
		timer_ID = SetTimer(1,10,NULL);
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -