【求助】在TabControl上画图 结果只有图,控件显示不出来了

ATiS_DXT 2017-07-10 11:15:32
Tab Control要鼠标点击到才显示 求解决方法
代码如下:
// RainDropDlg.cpp : implementation file
//

#include "stdafx.h"
#include "RainDropDlg.h"
#include "afxdialogex.h"


// CRainDropDlg dialog

IMPLEMENT_DYNAMIC(CRainDropDlg, CDialogEx)

CRainDropDlg::CRainDropDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CRainDropDlg::IDD, pParent)
{

}

CRainDropDlg::~CRainDropDlg()
{
}

void CRainDropDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_TAB_CHANNEL, m_ChannelTab);
}


BEGIN_MESSAGE_MAP(CRainDropDlg, CDialogEx)
ON_WM_PAINT()
ON_NOTIFY(TCN_SELCHANGE, IDC_TAB_CHANNEL, &CRainDropDlg::OnTcnSelchangeTabChannel)
END_MESSAGE_MAP()


// CRainDropDlg message handlers
BOOL CRainDropDlg::OnInitDialog()
{
CDialog::OnInitDialog();
int i;
for (i = 0; i < m_pChannel.GetCount(); i++)
{
m_ChannelTab.InsertItem(i, m_pChannel[i]->m_strChannelName);
}
return TRUE;
}

void CRainDropDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
if (IsIconic())
{

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
// TODO: Add your message handler code here
CRect TabRect;
m_ChannelTab.GetClientRect(TabRect);
m_ChannelTab.AdjustRect(FALSE, TabRect);
TabRect.bottom = TabRect.bottom - 20;
CDC *cdc;
cdc=m_ChannelTab.GetDC();
CPen pen;
pen.CreatePen(PS_SOLID, 1, RGB(255, 125, 0));
cdc->SelectObject(&pen);
cdc->MoveTo(20, 40);
cdc->LineTo(20, TabRect.bottom);
cdc->LineTo((int)(TabRect.right*0.5 - 20), TabRect.bottom);
DrawXAxis(cdc, TabRect);
DrawBarGraph(cdc, TabRect);
ReleaseDC(cdc);
// Do not call CDialogEx::OnPaint() for painting messages
}

void CRainDropDlg::DrawXAxis(CDC *pDC,CRect rect)
{
CPen pen;
pen.CreatePen(PS_SOLID, 1, RGB(125, 125, 125));
pDC->SelectObject(pen);
int i,deltaX,perBlockLength;//deltaX 每个柱状图相差X轴长度
int nCh = m_ChannelTab.GetCurSel();
deltaX = (rect.Width()*0.5 - 90) / m_pChannel[nCh]->m_pRainDropChart[1]->m_nBlocks;
perBlockLength = deltaX-5;
//刻度
for (i = 0; i <= m_pChannel[nCh]->m_pRainDropChart[1]->m_nBlocks; i = i++)
{
pDC->MoveTo(25 + deltaX*i, rect.bottom);
pDC->LineTo(25 + deltaX*i, rect.bottom - 2);
pDC->MoveTo(25 + deltaX*i + perBlockLength, rect.bottom);
pDC->LineTo(25 + deltaX*i + perBlockLength, rect.bottom - 2);
}
}

void CRainDropDlg::DrawBarGraph(CDC *pDC,CRect rect)
{
int i, deltaX, perBlockLength;//deltaX 每个柱状图相差X轴长度
int nChIdx = m_ChannelTab.GetCurSel();
deltaX = (rect.Width()*0.5 - 90) / m_pChannel[nChIdx]->m_pRainDropChart[1]->m_nBlocks;
perBlockLength = deltaX - 5;
for (i = 0; i <= m_pChannel[nChIdx]->m_pRainDropChart[1]->m_nBlocks; i = i++)
{
pDC->MoveTo(25 + deltaX*i, rect.bottom);
pDC->LineTo(25 + deltaX*i, rect.bottom - m_pChannel[nChIdx]->m_pRainDropChart[1]->m_pBlock[i]->m_nCycles);
pDC->LineTo(25 + deltaX*i + perBlockLength, rect.bottom - m_pChannel[nChIdx]->m_pRainDropChart[1]->m_pBlock[i]->m_nCycles);
pDC->LineTo(25 + deltaX*i + perBlockLength, rect.bottom);
}
}

...全文
288 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-07-10
  • 打赏
  • 举报
回复
怀疑你控件未正确注册。
ATiS_DXT 2017-07-10
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
在64位Windows下: 64位exe和dll在目录c:\windows\system32目录下; 32位exe和dll在目录c:\windows\syswow64目录下; 所以要注意: 在win64位系统下注册32位ocx或dll需要将32位ocx或dll拷贝到c:\windows\syswow64\目录下。 且注册要用c:\windows\syswow64\regsvr32 xxxxxxx.ocx或dll 在win64位系统下设置32位程序使用的数据库别名要用c:\windows\syswow64\cliconfg.exe 在win64位系统下设置32位程序使用的系统DSN要用c:\windows\syswow64\odbcad32.exe 64 位 Windows 平台注意点之文件系统重定向 http://www.cnblogs.com/jiake/p/4981555.html 64 位 Windows 平台注意点之注册表重定向 http://www.cnblogs.com/jiake/p/4956218.html
赵4老师 2017-07-10
  • 打赏
  • 举报
回复
在64位Windows下: 64位exe和dll在目录c:\windows\system32目录下; 32位exe和dll在目录c:\windows\syswow64目录下; 所以要注意: 在win64位系统下注册32位ocx或dll需要将32位ocx或dll拷贝到c:\windows\syswow64\目录下。 且注册要用c:\windows\syswow64\regsvr32 xxxxxxx.ocx或dll 在win64位系统下设置32位程序使用的数据库别名要用c:\windows\syswow64\cliconfg.exe 在win64位系统下设置32位程序使用的系统DSN要用c:\windows\syswow64\odbcad32.exe 64 位 Windows 平台注意点之文件系统重定向 http://www.cnblogs.com/jiake/p/4981555.html 64 位 Windows 平台注意点之注册表重定向 http://www.cnblogs.com/jiake/p/4956218.html
ATiS_DXT 2017-07-10
  • 打赏
  • 举报
回复
引用 11 楼 schlafenhamster 的回复:
在 对话框中 给 控件绘图 要先 控件.UpdateWindow

// TODO: Add your message handler code here
		m_ChannelTab.UpdateWindow();// 重要 !
		CRect TabRect;
		m_ChannelTab.GetClientRect(TabRect);
		m_ChannelTab.AdjustRect(FALSE, TabRect);
		TabRect.bottom = TabRect.bottom - 20;
		CDC *cdc;
		cdc=m_ChannelTab.GetDC();
		CPen pen;
		pen.CreatePen(PS_SOLID, 1, RGB(255, 125, 0));
		cdc->SelectObject(&pen);
		cdc->MoveTo(20, 40);
		cdc->LineTo(20, TabRect.bottom);
		cdc->LineTo((int)(TabRect.right*0.5 - 20), TabRect.bottom);
DrawXAxis(cdc, TabRect);
DrawBarGraph(cdc, TabRect);
		ReleaseDC(cdc);
1 CDialog::OnPaint(); 不但 绘对话框 还使 各 控件 窗口 无效 2 各控件的 绘制,在 对话框退出 paint 后, 3 所以 在对话框中 绘制 控件 必须 先 UpdateWindow() 让 控件 窗口有效。 即 m_ChannelTab.UpdateWindow();// 重要 !
好厉害
schlafenhamster 2017-07-10
  • 打赏
  • 举报
回复
在 对话框中 给 控件绘图 要先 控件.UpdateWindow

// TODO: Add your message handler code here
		m_ChannelTab.UpdateWindow();// 重要 !
		CRect TabRect;
		m_ChannelTab.GetClientRect(TabRect);
		m_ChannelTab.AdjustRect(FALSE, TabRect);
		TabRect.bottom = TabRect.bottom - 20;
		CDC *cdc;
		cdc=m_ChannelTab.GetDC();
		CPen pen;
		pen.CreatePen(PS_SOLID, 1, RGB(255, 125, 0));
		cdc->SelectObject(&pen);
		cdc->MoveTo(20, 40);
		cdc->LineTo(20, TabRect.bottom);
		cdc->LineTo((int)(TabRect.right*0.5 - 20), TabRect.bottom);
DrawXAxis(cdc, TabRect);
DrawBarGraph(cdc, TabRect);
		ReleaseDC(cdc);
1 CDialog::OnPaint(); 不但 绘对话框 还使 各 控件 窗口 无效 2 各控件的 绘制,在 对话框退出 paint 后, 3 所以 在对话框中 绘制 控件 必须 先 UpdateWindow() 让 控件 窗口有效。 即 m_ChannelTab.UpdateWindow();// 重要 !
赵4老师 2017-07-10
  • 打赏
  • 举报
回复
百度搜相关关键字?
赵4老师 2017-07-10
  • 打赏
  • 举报
回复
学会使用Spy++软件?
ATiS_DXT 2017-07-10
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
怀疑你控件未正确注册。
赵4老师 我代码里加了个对话框 发现对话框一直跳 估计是一直在刷新 所以显示不出来 请问有什么办法吗
ATiS_DXT 2017-07-10
  • 打赏
  • 举报
回复
引用 6 楼 zgl7903 的回复:
一般都是在Tab中放置子对话框页,绘制/控件都一般放在子页上
我知道 想偷懒
zgl7903 2017-07-10
  • 打赏
  • 举报
回复
一般都是在Tab中放置子对话框页,绘制/控件都一般放在子页上
schlafenhamster 2017-07-10
  • 打赏
  • 举报
回复
把画图的代码 放 Tab 里
ATiS_DXT 2017-07-10
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
怀疑你控件未正确注册。
我把画图的代码删掉 控件就全部显示了呀

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧