主界面设计+自定义按钮实现tab控件功能

网上找的tab控件总是太丑,不符合我们美工的审美要求.就要求我用按钮来实现对话框的切换.这样button就可以采用美工设计的icon了.(最近发觉跟美工合作开发ui也是一件很愉快的事情,除了美工老是埋怨我不能按他的要求来实现界面,没办法,能力有限啊.谁让我用vc呢) 

采用技术:mfc类

首先让美工画出一张软件界面背景图作为主界面,vc的picture只能支持bmp格式,而且放在vc程序中还有点失真.背景图内容包括各个按钮及自绘标题栏.还有要切换的子对话框的位置.用ps或其他工具量出各个按钮的左上角的坐标位置以及长宽,子对话框也如此.

对话框类:

// buttons' IDs
const  UINT BUTTON_ONE =   1111 ;
const  UINT BUTTON_TWO =   1112 ;

and location

 

const  CPoint DLG_LOCATION( 192 99 );
const  CPoint BTNONE_LOCATION( 34 130 );
const  CPoint BTNTWO_LOCATION( 108 130 );

 

// button size
const   int  BUTTON_WIDTH  =   53 ;
const   int  BUTTON_HEIGHT  =   42 ;

新建几个对话框,style改成child,title bar 和system menu去掉
并在主对话框头文件声明这几个类
定义几个bool变量来表示对话框是否被打开和是否激活.
由于我们去掉了标题栏,为了在任务栏显示程序名称,在OnInitDialog中写上
 SetWindowText("Soben Digital Home");

                     // create first button
    m_pBtnOne  =   new  CMyButton;
    RECT rectOne;
    rectOne.left 
=  BTNONE_LOCATION.x;
    rectOne.right 
=  BTNONE_LOCATION.x + BUTTON_WIDTH;
    rectOne.top 
=  BTNONE_LOCATION.y;
    rectOne.bottom 
=  BTNONE_LOCATION.y + BUTTON_HEIGHT;

    m_pBtnOne 
-> Create( "" , WS_CHILD  |  WS_VISIBLE  |  WS_TABSTOP | BS_BITMAP, rectOne,  this , BUTTON_ONE);
    HBITMAP   hBmpOne
= ::LoadBitmap(AfxGetInstanceHandle(),   MAKEINTRESOURCE(IDB_ONE));   
                     
//  美工截取出的bmp图标,导入到资源中
    m_pBtnOne -> SetBitmap(hBmpOne);   
    
// Create second button
    m_pBtnTwo  =   new  CMyButton;
    RECT rectTwo;
    rectTwo.left 
=  BTNTWO_LOCATION.x;
    rectTwo.right 
=  BTNTWO_LOCATION.x + BUTTON_WIDTH;
    rectTwo.top 
=  BTNTWO_LOCATION.y;
    rectTwo.bottom 
=  BTNTWO_LOCATION.y + BUTTON_HEIGHT;

    m_pBtnTwo
-> Create( "" , WS_CHILD  |  WS_VISIBLE  |  WS_TABSTOP | BS_BITMAP, rectTwo,  this ,BUTTON_TWO);
    HBITMAP   hBmpTwo
= ::LoadBitmap(AfxGetInstanceHandle(),   MAKEINTRESOURCE(IDB_TWO));   
    m_pBtnTwo
-> SetBitmap(hBmpTwo); 

这里我用的是一个重载的CButton类,用于实现鼠标滑过改变一段文字.(懒得改了,用CButton类也一样

由于去掉了系统标题栏,并须自己写程序来实现最小化以及关闭功能

//  两个按钮消息,简单实现
void  CMain::OnButtonCloseClicked()
{
      SendMessage(WM_CLOSE);
}

void  CMain::OnButtonMinClicked()
{
       SendMessage(WM_SYSCOMMAND, SC_MINIMIZE, NULL);
    
}

关键地方来了,如何切换对话框,请教了很多前辈后,决定用showwindow这一简单方法来实现对话框的显示和隐藏

void  CMain::OnButtonOneClicked()
{
    
if (bOneActed==1)// 如果对话框已经激活
    {
        
return;
    }

    
if (bTwoActed==1)// 已打开另一对话框则关闭
    {
        m_pPageTwo
->ShowWindow(FALSE);
        bTwoActed
=0;
    }

        
if(bOneOpened==0){// 对话框未创建过
        
//create the TabDialog
        m_pPageOne = new COneDlg();
        m_pPageOne
->Create(IDD_ONE_DIALOG, this);
        
//set the TabDialog's positon
        m_pPageOne->SetWindowPos(this, DLG_LOCATION.x, DLG_LOCATION.y, 0 , 0, SWP_NOSIZE | SWP_NOZORDER | SWP_SHOWWINDOW);
        bOneOpened
=1;// 对话框创建过
    }

    
else// 创建过则直接显示
        m_pPageOne>ShowWindow(TRUE);
    bOneActed
=1;
}
暂时没出现什么问题,对话框闪烁问题已在另一文章中解决.不过仍有打开别的程序后在切换回来后子对话框背景会一团遭,现在想应该是OnEraseBkgnd里直接return true的缘故,看有什么办法来既解决闪烁又解决背景不刷新的问题

你可能感兴趣的:(UI,C++/C)