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

时间:2021-04-18 08:49:27
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);
}
}

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

12 个解决方案

#1


在64位Windows下:
64位exe和dll在目录c:\windows\sys tem32目录下;
32位exe和dll在目录c:\windows\sys wow64目录下;
所以要注意:
    在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

#2


引用 1 楼 zhao4zhong1 的回复:
在64位Windows下:
64位exe和dll在目录c:\windows\sys tem32目录下;
32位exe和dll在目录c:\windows\sys wow64目录下;
所以要注意:
    在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


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

#3


怀疑你控件未正确注册。

#4


引用 3 楼 zhao4zhong1 的回复:
怀疑你控件未正确注册。

我把画图的代码删掉    控件就全部显示了呀

#5


把画图的代码 放 Tab 里

#6


一般都是在Tab中放置子对话框页,绘制/控件都一般放在子页上

#7


引用 6 楼 zgl7903 的回复:
一般都是在Tab中放置子对话框页,绘制/控件都一般放在子页上

我知道  【求助】在TabControl上画图 结果只有图,控件显示不出来了  想偷懒

#8


引用 3 楼 zhao4zhong1 的回复:
怀疑你控件未正确注册。

赵4老师    我代码里加了个对话框   发现对话框一直跳   估计是一直在刷新   所以显示不出来   请问有什么办法吗

#9


学会使用Spy++软件?

#10


百度搜相关关键字?

#11


在 对话框中 给 控件绘图 要先 控件.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();// 重要 !

#12


引用 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();// 重要 !
【求助】在TabControl上画图 结果只有图,控件显示不出来了好厉害

#1


在64位Windows下:
64位exe和dll在目录c:\windows\sys tem32目录下;
32位exe和dll在目录c:\windows\sys wow64目录下;
所以要注意:
    在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

#2


引用 1 楼 zhao4zhong1 的回复:
在64位Windows下:
64位exe和dll在目录c:\windows\sys tem32目录下;
32位exe和dll在目录c:\windows\sys wow64目录下;
所以要注意:
    在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


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

#3


怀疑你控件未正确注册。

#4


引用 3 楼 zhao4zhong1 的回复:
怀疑你控件未正确注册。

我把画图的代码删掉    控件就全部显示了呀

#5


把画图的代码 放 Tab 里

#6


一般都是在Tab中放置子对话框页,绘制/控件都一般放在子页上

#7


引用 6 楼 zgl7903 的回复:
一般都是在Tab中放置子对话框页,绘制/控件都一般放在子页上

我知道  【求助】在TabControl上画图 结果只有图,控件显示不出来了  想偷懒

#8


引用 3 楼 zhao4zhong1 的回复:
怀疑你控件未正确注册。

赵4老师    我代码里加了个对话框   发现对话框一直跳   估计是一直在刷新   所以显示不出来   请问有什么办法吗

#9


学会使用Spy++软件?

#10


百度搜相关关键字?

#11


在 对话框中 给 控件绘图 要先 控件.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();// 重要 !

#12


引用 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();// 重要 !
【求助】在TabControl上画图 结果只有图,控件显示不出来了好厉害