网上找的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的缘故,看有什么办法来既解决闪烁又解决背景不刷新的问题
主界面设计+自定义按钮实现tab控件功能
来源:博客
作者:HuSo
时间:2008-04-17 点击:308 次
相关文章:
文章搜索
推荐文章
推荐产品
|
VARCHART XGantt
全球知名的甘特图控件,能够实现如 Microsoft Project 般强大的项目管理功能。
|
|
TurboDemo 中文版
TurboDemo - 抓取屏幕截图并通过动态演示示例及手册解释软件、个人电脑应用程序、网站与产品。
|
|
BCGControlBar Library .NET Edition
该组件包含大量可自定义程度高、可设计性好的组件,使用户可创建精致美观的图形用户界面。
|
|
WebUI Studio.NET
WebUI Studio.NET 是一套用于开发专业 ASP.NET web 应用程序必不可少的控件。
|





