1.背景载入:
准备一个BMP,在ON_PAINT消息中将背景设置为BMP
CPaintDC dc(this);
CDC MemDC;
CBitmap bitmap;
BITMAP m_bitmap;
bitmap.LoadBitmap(IDB_MAIN);
bitmap.GetBitmap(&m_bitmap);
MemDC.CreateCompatibleDC(pDC);
MemDC.SelectObject(&bitmap);
pDC->BitBlt(0,0,m_bitmap.bmWidth,m_bitmap.bmHeight,&MemDC, 0,0,SRCCOPY);
2.按钮绘制,添加提示文本CToolTipCtrl
1)单纯的BMP背景:
准备两张BMP,一个是普通状态,一个是按下时,
按钮在.h头文件中将CButton m_back;改为CBitmapButton m_back;不能在类向导里添加变量!!!要直接在头文件的public添加就行
按钮的属性要钩选:所有者(owner draw)
在OnInitDialog中设置即可:
m_back.LoadBitmaps(IDB_BITMAPCLOSENORMAL,IDB_BITMAPDOWN);
2)复制的自绘按钮,自定义类
具体设置鼠标经过如何反应,图像的处理,花哨的反应之类.
3.控件提示文本:
在Dlg的Public中定义:
CToolTipCtrl m_ToolTip;
在OnInitDialog()中创建:
EnableToolTips(TRUE);
m_ToolTip.Create(this);
m_ToolTip.Activate(TRUE);
CWnd* pW=GetDlgItem(IDC_CLOSEBTN);//得到控件子窗口指针
m_ToolTip.AddTool(pW,"hello");
关键:在消息中响应:
BOOL CMyDlg::PreTranslateMessage(MSG *pMsg)
{
if(m_ToolTip.m_hWnd!=NULL) //若ToolTip的对应控件子窗口有效,就生效
m_ToolTip.RelayEvent(pMsg);
return false;
}
4.设置Static的文本
在类向导中设置Static的变量:m_static1
m_static1.SetWindowText("hello");
获取文本:
CString text1;
m_static1.GetWindowText(text1);
5.需要用到命名空间的,
在C#中的语法是:using System.Net;
在Vc++中的语法是:
#using <System.dll> //要加上这句
using namespace System::Net;
6:自绘窗口没有标题栏.要在窗口的OnLButtonDown中加入:
//向系统发送HTCAPTION消息,让系统以为鼠标点在标题栏上,加了这句才可以随便移动窗口
PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x, point.y));
7:给ToolBar的每个按钮添加位图
1)工具栏是用CreateToolBar创建的,那直接在创建时指定位图就行了
TBBUTTON tbb[12];
tbb[0].iBitmap = TB_PLAY; //对应图片里的小图片序号
tbb[0].idCommand = TB_PLAY;
tbb[0].fsState = 0;
tbb[0].fsStyle = TBSTYLE_BUTTON | TBSTYLE_CHECKGROUP;
tbb[0].dwData = 0;
tbb[0].iString = (INT_PTR)L"播放";
tbb[1].iBitmap = TB_PAUSE;
tbb[1].idCommand = TB_PAUSE;
tbb[1].fsState = 0;
tbb[1].fsStyle = TBSTYLE_BUTTON | TBSTYLE_CHECKGROUP;
tbb[1].dwData = 0;
tbb[1].iString = (INT_PTR)L"暂停";
g_hWndToolBar = CreateToolbarEx(g_hWndPanel,
WS_CHILD | WS_VISIBLE | TBSTYLE_FLAT | CCS_NODIVIDER | TBSTYLE_TOOLTIPS | CCS_NOMOVEY,
0,
sizeof(tbb)/sizeof(TBBUTTON),
g_hInstance,
IDB_BITMAP_TOOLBAR, //工具栏每个按钮对应的图片集合
tbb, sizeof(tbb)/sizeof(TBBUTTON),
16, 16, 0, 0, //每个按钮的宽度高度为16
sizeof(TBBUTTON));
SendMessage(g_hWndToolBar, TB_SETMAXTEXTROWS, 0, 0); //Toolbar就会使用TBBUTTON结构中的iString的值作为ToolTip上的说明文字
2)工具栏是在MFC的CToolBar类声明的对象
CToolBar m_ToolBar;
也有两种实现方法:
a.比较麻烦,插入资源Toolbar创建空的工具栏,根据需要创建数个按钮,创建方法在第一个按钮双击,弹出来的ID随意输入一个,就会生出第二个...以此类推.
生成完毕,在res文件夹会产生一个toolbar1.bmp,把准备好的位图覆盖过去.
在cpp里输入:
#define TB_PLAY 0 //播放工具栏按钮
#define TB_PAUSE 1
#define TB_STOP 2
#define TB_PREV 3
if (!m_ToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER |
CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || ! m_ToolBar.LoadToolBar(IDR_TOOLBAR1))
{
MessageBox("创建工具栏失败!");
EndDialog(IDCANCEL);
}
//设置按钮初始状态
m_ToolBar.SetButtonStyle(TB_PLAY, TBBS_DISABLED);
m_ToolBar.SetButtonStyle(TB_PAUSE, TBBS_DISABLED);
m_ToolBar.SetButtonStyle(TB_STOP, TBBS_DISABLED);
m_ToolBar.SetButtonStyle(TB_PREV, TBBS_DISABLED);
//这种方法惟一的好处就是在工具栏资源管理器中可以修改每个按钮的位图,
b.直接插入位图资源文件IDB_TOOLBAR,在CPP中输入:
#define TB_PLAY 0 //播放工具栏按钮
#define TB_PAUSE 1
#define TB_STOP 2
#define TB_PREV 3
if (!m_ToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER |
CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || ! m_ToolBar.LoadBitmap(IDR_TOOLBAR1))
{
MessageBox("创建工具栏失败!");
EndDialog(IDCANCEL);
}
//SetButtons也一定要输入,数组下标根据按钮个数来决定
UINT nArray[10];
for(int i=0;i<10;i++)
{
nArray[i]=501+i;
}
m_ToolBar.SetButtons(nArray,10);
//设置按钮初始状态
m_ToolBar.SetButtonStyle(TB_PLAY, TBBS_DISABLED);
m_ToolBar.SetButtonStyle(TB_PAUSE, TBBS_DISABLED);
m_ToolBar.SetButtonStyle(TB_STOP, TBBS_DISABLED);
m_ToolBar.SetButtonStyle(TB_PREV, TBBS_DISABLED);
8.创建工具栏按钮时,响应事件可以通过将按钮的ID跟菜单项设置成一样,就可以响应了.
但是特别注意:VC给工具栏按钮生成的ID可能是0~9之类的,有可能跟VC内部的某些东西冲突,
使按钮的响应失效.
这时要打开resource.h修改工具栏按钮的ID,比如32780~32790之类的.
9.
Updatedata(TRUE) == 将控件的值赋值给成员变量,即从窗口编辑框中读入数据;
Updatedata(FALSE) == 将成员变量的值赋值给控件,将数据从窗口显示。