收录日期:2018/10/23 13:40:57 时间:2016/05/22 09:12:32 标签:界面
如何实现类似 Photoshop 中图层面板的浮动面板?

谢谢:)
我试着在一个单文档程序的 MainFrm 的 OnCreate 里创建一个非模态对话框,

PanelShape = new CPanelShape();
PanelShape->Create(IDD_PANEL_SHAPE, this);
PanelShape->ShowWindow(SW_SHOW);

对话框显示不正确,对话框成灰色,不能被移动:(

可以直接在一个Dialog里面直接放控件
然后从CDialogBar派生出来
类向导里面没有直接派生
可以先从CDialog派生,在里面生成消息映射
然后修改相应的CDialog为CDialogBar

调用的时候,和CToolBar应该一模一样
可以看看这个
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnwui/html/msdn_dlgbar.asp

这里在CMainFrame里面
不要用toolBar。EnableDocking()
也不要用Dock。。(&toolBar);
要用Float。。
你需要的是CToolBar不是自己做对话框的
使用 CDialogBar 来实现,下面是 XImage 中的一段源码:

class DlgHisto : public CDialogBar
{
// Construction
public:
DlgHisto();
virtual ~DlgHisto();

BOOL Create(CWnd* pParentWnd, LPCTSTR lpszTemplateName, UINT nStyle, UINT nID );
BOOL Create(CWnd* pParentWnd, UINT nIDTemplate, UINT nStyle, UINT nID );

void InitDlg();

//{{AFX_VIRTUAL(DlgHisto)
protected:
//}}AFX_VIRTUAL

// Implementation
protected:
CxTargetButton m_r;
CxTargetButton m_g;
CxTargetButton m_b;
CxTargetButton m_gray;
int m_ren;
int m_gen;
int m_ben;
int m_grayen;
int m_logen;
bool m_initok;
// Generated message map functions
//{{AFX_MSG(DlgHisto)
afx_msg void OnPaint();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);
};
/////////////////////////////////////////////////////////////////////////////
// DlgHisto dialog
DlgHisto::DlgHisto()
{ m_initok = false;}
/////////////////////////////////////////////////////////////////////////////
DlgHisto::~DlgHisto()
{ }
/////////////////////////////////////////////////////////////////////////////
BOOL DlgHisto::Create(CWnd* pParentWnd, LPCTSTR lpszTemplateName, UINT nStyle, UINT nID)
{
BOOL bSuccess = CDialogBar::Create(pParentWnd, lpszTemplateName, nStyle, nID);
InitDlg();
return bSuccess;
}
/////////////////////////////////////////////////////////////////////////////
BOOL DlgHisto::Create(CWnd* pParentWnd, UINT nIDTemplate, UINT nStyle, UINT nID)
{
BOOL bSuccess = CDialogBar::Create(pParentWnd, nIDTemplate, nStyle, nID);
InitDlg();
return bSuccess;
}
/////////////////////////////////////////////////////////////////////////////
BEGIN_MESSAGE_MAP(DlgHisto, CDialogBar)
//{{AFX_MSG_MAP(DlgHisto)
ON_WM_PAINT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// DlgHisto message handlers
void DlgHisto::InitDlg()
{
if (m_initok) return;

RECT r1 = {10,8,59,35};
m_r.Create("",WS_VISIBLE|WS_TABSTOP,r1,this,0);
m_r.SetButtonStyle(BS_PUSHLIKE|BS_FLAT|BS_AUTOCHECKBOX,0);
m_r.SetWindowText("R");
m_r.EnableTarget(0);
m_r.SetIcon(IDI_R,BS_LEFT);
m_r.SetCheck(1);
m_r.EnableWindow(1);

RECT r2 = {60,8,109,35};
m_g.Create("",WS_VISIBLE|WS_TABSTOP,r2,this,0);
m_g.SetButtonStyle(BS_PUSHLIKE|BS_FLAT|BS_AUTOCHECKBOX,0);
m_g.SetWindowText("G");
m_g.EnableTarget(0);
m_g.SetIcon(IDI_G,BS_LEFT);
m_g.SetCheck(1);
m_g.EnableWindow(1);

RECT r3 = {110,8,159,35};
m_b.Create("",WS_VISIBLE|WS_TABSTOP,r3,this,0);
m_b.SetButtonStyle(BS_PUSHLIKE|BS_FLAT|BS_AUTOCHECKBOX,0);
m_b.SetWindowText("B");
m_b.EnableTarget(0);
m_b.SetIcon(IDI_B,BS_LEFT);
m_b.SetCheck(1);
m_b.EnableWindow(1);

RECT r4 = {160,8,209,35};
m_gray.Create("",WS_VISIBLE|WS_TABSTOP,r4,this,0);
m_gray.SetButtonStyle(BS_PUSHLIKE|BS_FLAT|BS_AUTOCHECKBOX,0);
m_gray.SetWindowText("gray");
m_gray.EnableTarget(0);
m_gray.SetIcon(IDI_GRAY,BS_LEFT);
m_gray.SetCheck(1);
m_gray.EnableWindow(1);

m_ren=m_gen=m_ben=m_grayen=1;

CButton* plog = (CButton*)GetDlgItem(IDC_LOG);
if (plog) { plog->SetCheck(1); m_logen=1; } else  m_logen=0;

m_initok=true;
}

BOOL DlgHisto::OnCommand(WPARAM wparam, LPARAM lparam) 
{
CDialogBar::OnCommand(wparam, lparam);

m_ren=m_r.GetCheck();
m_gen=m_g.GetCheck();
m_ben=m_b.GetCheck();
m_grayen=m_gray.GetCheck();

CButton* plog = (CButton*)GetDlgItem(IDC_LOG);
m_logen=plog->GetCheck();

Invalidate();

return TRUE;
}

void DlgHisto::OnPaint() 
{
CPaintDC dc(this); // device context for painting

CDemoDoc* pDoc = (CDemoDoc*) ((CMainFrame*)AfxGetMainWnd())->GetActiveFrame()->GetActiveDocument();

RECT r;
GetClientRect(&r);

CPen gridPen(PS_DOT,1,::GetSysColor(COLOR_APPWORKSPACE));
CPen* pOldPen = dc.SelectObject(&gridPen);
for (int gx=9+32;gx<265;gx+=32){
dc.MoveTo(gx,40);
dc.LineTo(gx,r.bottom - 6);
}
for (int gy=0;gy<(r.bottom - 40);gy+=((r.bottom - 40)/10)){
dc.MoveTo(8,r.bottom - 9 - gy);
dc.LineTo(268,r.bottom - 9 - gy);
}
dc.SelectObject(pOldPen);

CPen axisPen(PS_SOLID, 1, ::GetSysColor(COLOR_3DSHADOW));
pOldPen = dc.SelectObject(&axisPen);
dc.MoveTo(9, 38);
dc.LineTo(9, r.bottom - 9);
dc.LineTo(266, r.bottom - 9);
dc.LineTo(266, 38);
dc.SelectObject(pOldPen);

if (pDoc && pDoc->image) {

if (pDoc->m_hmax){
int ybase = r.bottom-10;
if (m_logen){
float yratio = (r.bottom - r.top - 50)/(float)log10(pDoc->m_hmax+1);
if (m_ren){
CPen redPen(PS_SOLID, 1, RGB(222, 0, 0));
pOldPen = dc.SelectObject(&redPen);
dc.MoveTo(10, (int)(ybase-log10(1+pDoc->m_hr[0])*yratio));
for (int x=1; x<256; x++)
dc.LineTo(x+10, (int)(ybase-log10(1+pDoc->m_hr[x])*yratio));
}
if (m_gen){
CPen greenPen(PS_SOLID, 1, RGB(0, 222, 0));
pOldPen = dc.SelectObject(&greenPen);
dc.MoveTo(10, (int)(ybase-log10(1+pDoc->m_hg[0])*yratio));
for (int x=1; x<256; x++)
dc.LineTo(x+10, (int)(ybase-log10(1+pDoc->m_hg[x])*yratio));
}
if (m_ben){
CPen bluePen(PS_SOLID, 1, RGB(0, 0, 222));
pOldPen = dc.SelectObject(&bluePen);
dc.MoveTo(10, (int)(ybase-log10(1+pDoc->m_hb[0])*yratio));
for (int x=1; x<256; x++)
dc.LineTo(x+10, (int)(ybase-log10(1+pDoc->m_hb[x])*yratio));
}
if (m_grayen){
CPen grayPen(PS_SOLID, 1, RGB(64, 64, 64));
pOldPen = dc.SelectObject(&grayPen);
dc.MoveTo(10, (int)(ybase-log10(1+pDoc->m_hgray[0])*yratio));
for (int x=1; x<256; x++)
dc.LineTo(x+10, (int)(ybase-log10(1+pDoc->m_hgray[x])*yratio));
}
dc.SelectObject(pOldPen);
} else {
float yratio = (r.bottom - r.top - 50)/(float)pDoc->m_hmax;
if (m_ren){
CPen redPen(PS_SOLID, 1, RGB(222, 0, 0));
pOldPen = dc.SelectObject(&redPen);
dc.MoveTo(10, (int)(ybase-pDoc->m_hr[0]*yratio));
for (int x=1; x<256; x++)
dc.LineTo(x+10, (int)(ybase-pDoc->m_hr[x]*yratio));
}
if (m_gen){
CPen greenPen(PS_SOLID, 1, RGB(0, 222, 0));
pOldPen = dc.SelectObject(&greenPen);
dc.MoveTo(10, (int)(ybase-pDoc->m_hg[0]*yratio));
for (int x=1; x<256; x++)
dc.LineTo(x+10, (int)(ybase-pDoc->m_hg[x]*yratio));
}
if (m_ben){
CPen bluePen(PS_SOLID, 1, RGB(0, 0, 222));
pOldPen = dc.SelectObject(&bluePen);
dc.MoveTo(10, (int)(ybase-pDoc->m_hb[0]*yratio));
for (int x=1; x<256; x++)
dc.LineTo(x+10, (int)(ybase-pDoc->m_hb[x]*yratio));
}
if (m_grayen){
CPen grayPen(PS_SOLID, 1, RGB(64, 64, 64));
pOldPen = dc.SelectObject(&grayPen);
dc.MoveTo(10, (int)(ybase-pDoc->m_hgray[0]*yratio));
for (int x=1; x<256; x++)
dc.LineTo(x+10, (int)(ybase-pDoc->m_hgray[x]*yratio));
}
dc.SelectObject(pOldPen);
}
}
else
{
pDoc->m_hmax=pDoc->GetImage()->Histogram(pDoc->m_hr,pDoc->m_hg,pDoc->m_hb,pDoc->m_hgray);
if (pDoc->m_hmax) Invalidate();
}
}
}

一个简单的算法题~~~谢谢 兼容IE和FF的div拖拽与撑拉js文件 用其它名字代替显示获取的MAC地址显示 求救!tomcat+apache下文件下载经apache转发造成文件数据不正确 rss转换成html?还有如何把一个门户网站的一部分嵌入到我这个网站的一块区域里面来? [向神仙提问]我到底哪儿得罪你了??? SQL语句分组这样做可以吗? 从一个windowsform窗口打开另一个窗口,同时关闭此窗口。问题来了 线程创建问题,参数有误??????? 帮我看看好吗??? 高分求如何解析SQL语句。!!!!!!!!!!!在线急等 谢谢 询问一个查询语句 控制发帖数量 louts script 取到当前用户所在的组? 这样一个从txt导入mssql的语句应该怎么写 活跃气氛,再散200分。15:15结帖 kye_jufei 來接分 .net点击button弹出按钮对话框 如果代码很长,光标怎么样才能快速定位左大括号与右大括号? 关于excel中表格格式的转换 DataGridView如何自定义列数据? 夫妻二人和强奸犯 怎么防止用户绕过登陆界面 不定长数组相加 .net用网页编辑器更新数据问题 沉默的天空 请看一个错误: 深圳钱袋商务有限公司急聘(http://www.kdmoney.com)――技术经理 在线急等 求帮忙解析SQL语句问题! 用c++做出界面