📄 ttl_inverterdlg.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 + -