mugong:如何去掉最大化按钮? 我的MFC程序是MDI,我想去掉最大化按钮,保留最小化和关闭按钮,该如何实现? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 cs.style &= ~WS_MAXIMIZEBOX; 楼上的,对话框的怎么实现?------------------------------------体验速度,体验CSDN新版论坛助手:http://community.csdn.net/Expert/TopicView.asp?id=3108679 cs.style &= ~WS_MAXIMIZEBOX 可以重载WM_SYSCOMMAND在里面可以实现你想要的任何操作,呵呵 用VC++在标题栏上画按钮根据需要,有时候我们可能要在一些特殊控件上创建控件,比如在STATUSBAR上创建进度条,在TOOLBAR,REBAR上创建COMBOX,上次发表了一个在STATUSBAR上创建BUTTON的文章,这次就介绍下如何在标题栏上画按钮吧?现在很多换皮肤程序是怎么实现的呢? 实际上就是画上去的,当然,说起来很简单,做起来也要涉及很多知识,我们这次就在标题栏上创建一个BUTTON。程序的原理是把2副做好的图片(一个表示按下,另一个表示非按下状态),画到标题栏上。小弟水平很菜,希望大家不要见笑!首先画2个BITMAP图象,由于标题栏很小,所以就画16X16图象就行了,然后声明3个变量CBitmap m_bitmapPressed; file://按钮被按下的图象CBitmap m_bitmapUnpressed; file://按钮没被按下的图象BOOL m_bPressed; file://按钮是否被按下??接着在程序初始化构造函数里添加代码m_bPressed = FALSE ;m_bitmapPressed.LoadBitmap(IDB_PRESS); /m_bitmapUnpressed.LoadBitmap(IDB_UNPRESS); file://16x16 bitmap 接着就是画按钮了,要处理的消息是:WM_Activate和WM_NcPaint()用CLASS WIZARD添加消息入口后,最终代码如下void CMyButtonDlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) { CDialog::OnActivate(nState, pWndOther, bMinimized); DrawMyButton(); }void CMyButtonDlg::OnNcPaint() {CDialog::OnNcPaint(); file://注意此处,此处是自己添加的,而非VC自动生成,若省略此代码,则重画窗体,很慢 DrawMyButton();}大家注意到了,在画BUTTON的时候,用到了DrawMyButton自定义函数,此函数代码如下:void CMyButtonDlg::DrawMyButton(){ if ( !IsWindowVisible()|| IsIconic() ) return; CDC memDC; CDC* pDC = GetWindowDC ( ) ; memDC.CreateCompatibleDC( pDC ); memDC.SelectObject( m_bPressed ? &m_bitmapPressed : &m_bitmapUnpressed ); file://选择要画哪中位图 CRect rect, rectWnd; GetButtonRect(rect); GetWindowRect(rectWnd) ; rect.OffsetRect(-rectWnd.left, -rectWnd.top ); // draw it pDC -> StretchBlt( rect.left, rect.top, rect.Width () , rect.Height(), &memDC, 0, 0, 16, file://画一个16x16 的button 16, SRCCOPY ); memDC.DeleteDC(); ReleaseDC( pDC );}file://获取要创建的BUTTON的位置void CMyButtonDlg::GetButtonRect(CRect &rect){ GetWindowRect(&rect) ; rect.top += GetSystemMetrics(SM_CYFRAME)+1; rect.bottom = rect.top + GetSystemMetrics( SM_CYSIZE )-4; rect.left = rect.right - GetSystemMetrics( SM_CXFRAME ) - (2 * GetSystemMetrics( SM_CXSIZE ) )-1; rect.right = rect.left + GetSystemMetrics(SM_CXSIZE)-3;}为了响应按钮单击事件,我们还需要添加函数(此处处理WM_NCLBUTTONDOWN消息)void CMyButtonDlg::OnNcLButtonDown(UINT nHitTest, CPoint point) { if ( nHitTest == HTCAPTION ) { CRect rect; GetButtonRect( rect ); file://判断鼠标是不是按在了自画的"BUTTON"区域 if ( rect.PtInRect( point ) ) { m_bPressed = !m_bPressed; DrawMyButton() ; } MessageBox("按钮单击事件被捕捉......"); } CDialog::OnNcLButtonDown(nHitTest, point);}当然,根据需要我们还可以处理WM_NCMOUSEMOVE消息,此消息可用来改变按钮状态,比如:当鼠标处于BUTTON区域时,显示一种BITMAP,当鼠标移出BUTTON区域时,则改变BITMAP,很多换皮肤的程序就用到了这个!void CMyButtonDlg::OnNcMouseMove(UINT nHitTest, CPoint point) { CRect rect; GetButtonRect( rect ); if ( rect.PtInRect(point)) file://鼠标位置在按钮内部 { m_bPressed = FALSE; file://随便设置一种按钮图象风格 DrawMyButton() ; } else { m_bPressed = TRUE; file://反之 DrawMyButton() ; } CDialog::OnNcMouseMove(nHitTest, point);} OK,编译运行,结果如下,呵呵~~~ 效果是比较UGLY了一点,不过我在这里只是讲解下理论,具体实际应用中怎么做就看你的了! 重载PreCreateWindow():BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs){ if( !CFrameWnd::PreCreateWindow(cs) ) return FALSE; // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs cs.style &= ~WS_MAXIMIZEBOX; return TRUE;} 使用GetWindowLong把风格得到,然后把风格中的最大化按钮去掉,最后用SetWindowLong写入 能帮我看一下按钮为什么显示不出来吗? 阅读HTRAN代码的疑惑. 邮件附件还原 为什么我的CListCtrl中没有格子呢? “->m_nDrawType”的左边必须指向类/结构/联合/泛型类型的错误 picture控件刷新问题 slider控件和edit控件之间的数据联系问题? 如何分类显示一个实时更新的access数据库 用TEXTOUT输出了一串字符,怎么确定当前位置,接着输出字符啊 求问大神 bcg出现这个问题怎么解决呀? 关于FindItem(); 新手:不太明白OnNcDestroy , 什么是nonclient area呀?
------------------------------------
体验速度,体验CSDN新版论坛助手:http://community.csdn.net/Expert/TopicView.asp?id=3108679
根据需要,有时候我们可能要在一些特殊控件上创建控件,比如在STATUSBAR上创建进度条,在TOOLBAR,REBAR上创建COMBOX,上次发表了一个在STATUSBAR上创建BUTTON的文章,这次就介绍下如何在标题栏上画按钮吧?
现在很多换皮肤程序是怎么实现的呢? 实际上就是画上去的,当然,说起来很简单,做起来也要涉及很多知识,我们这次就在标题栏上创建一个BUTTON。程序的原理是把2副做好的图片(一个表示按下,另一个表示非按下状态),画到标题栏上。小弟水平很菜,希望大家不要见笑!首先画2个BITMAP图象,由于标题栏很小,所以就画16X16图象就行了,然后声明3个变量CBitmap m_bitmapPressed; file://按钮被按下的图象
CBitmap m_bitmapUnpressed; file://按钮没被按下的图象
BOOL m_bPressed; file://按钮是否被按下??接着在程序初始化构造函数里添加代码m_bPressed = FALSE ;
m_bitmapPressed.LoadBitmap(IDB_PRESS); /
m_bitmapUnpressed.LoadBitmap(IDB_UNPRESS); file://16x16 bitmap
接着就是画按钮了,要处理的消息是:
WM_Activate和WM_NcPaint()用CLASS WIZARD添加消息入口后,最终代码如下void CMyButtonDlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)
{
CDialog::OnActivate(nState, pWndOther, bMinimized);
DrawMyButton();
}void CMyButtonDlg::OnNcPaint()
{CDialog::OnNcPaint();
file://注意此处,此处是自己添加的,而非VC自动生成,若省略此代码,则重画窗体,很慢 DrawMyButton();
}
大家注意到了,在画BUTTON的时候,用到了DrawMyButton自定义函数,此函数代码如下:void CMyButtonDlg::DrawMyButton()
{ if ( !IsWindowVisible()|| IsIconic() )
return; CDC memDC;
CDC* pDC = GetWindowDC ( ) ;
memDC.CreateCompatibleDC( pDC );
memDC.SelectObject( m_bPressed ? &m_bitmapPressed : &m_bitmapUnpressed ); file://选择要画哪中位图 CRect rect, rectWnd;
GetButtonRect(rect);
GetWindowRect(rectWnd) ;
rect.OffsetRect(-rectWnd.left, -rectWnd.top ); // draw it pDC -> StretchBlt( rect.left, rect.top, rect.Width () ,
rect.Height(), &memDC, 0, 0, 16, file://画一个16x16 的button
16, SRCCOPY ); memDC.DeleteDC();
ReleaseDC( pDC );}file://获取要创建的BUTTON的位置
void CMyButtonDlg::GetButtonRect(CRect &rect)
{ GetWindowRect(&rect) ;
rect.top += GetSystemMetrics(SM_CYFRAME)+1;
rect.bottom = rect.top + GetSystemMetrics( SM_CYSIZE )-4;
rect.left = rect.right - GetSystemMetrics( SM_CXFRAME ) - (2 * GetSystemMetrics( SM_CXSIZE ) )-1;
rect.right = rect.left + GetSystemMetrics(SM_CXSIZE)-3;}
为了响应按钮单击事件,我们还需要添加函数(此处处理WM_NCLBUTTONDOWN消息)void CMyButtonDlg::OnNcLButtonDown(UINT nHitTest, CPoint point)
{
if ( nHitTest == HTCAPTION )
{
CRect rect;
GetButtonRect( rect );
file://判断鼠标是不是按在了自画的"BUTTON"区域
if ( rect.PtInRect( point ) )
{
m_bPressed = !m_bPressed;
DrawMyButton() ;
}
MessageBox("按钮单击事件被捕捉......"); }
CDialog::OnNcLButtonDown(nHitTest, point);
}
当然,根据需要我们还可以处理WM_NCMOUSEMOVE消息,此消息可用来改变按钮状态,比如:当鼠标处于BUTTON
区域时,显示一种BITMAP,当鼠标移出BUTTON区域时,则改变BITMAP,很多换皮肤的程序就用到了这个!void CMyButtonDlg::OnNcMouseMove(UINT nHitTest, CPoint point)
{
CRect rect;
GetButtonRect( rect );
if ( rect.PtInRect(point)) file://鼠标位置在按钮内部
{
m_bPressed = FALSE; file://随便设置一种按钮图象风格
DrawMyButton() ;
}
else
{
m_bPressed = TRUE; file://反之
DrawMyButton() ;
}
CDialog::OnNcMouseMove(nHitTest, point);
} OK,编译运行,结果如下,呵呵~~~ 效果是比较UGLY了一点,不过我在这里只是讲解下理论,具体实际应用中怎么做就看你的了!
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs cs.style &= ~WS_MAXIMIZEBOX;
return TRUE;
}