// 工具栏学习.cpp : 定义应用程序的入口点。
//
#include "stdafx.h"
#include "工具栏学习.h"
#include "Resource.h"
#define MAX_LOADSTRING 100
#include "CommCtrl.h "
#pragma comment(lib,"comctl32.lib")
// 全局变量:
HINSTANCE hInst; // 当前实例
TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本
TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名
#define T_ID1 20000
#define T_ID2 20001
#define T_ID3 20002
#define T_ID4 20003
#define T_ID5 20004
#define T_ID6 20005
#define T_ID7 20006
#define T_ID8 20007
#define IDR_TOOLBAR1 10000
TBBUTTON ptoolbar[8]=
{
{0, //指定图标编号,用于按钮的以0开始的按钮图片索引
T_ID1, //工具条按钮的ID,按钮的CommandID
TBSTATE_ENABLED, //可用状态,按钮的状态标志
TBSTYLE_BUTTON, //指定创建一个可以下按的按钮,按钮的风格标志
0, //保留,由应用程序定义该参数意义
0}, //按钮字串索引
{1,T_ID2,TBSTATE_ENABLED,TBSTYLE_CHECK,0,0},
{2,T_ID3,TBSTATE_ENABLED,TBSTYLE_CHECK,0,0},
{3,T_ID4,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
//创建一个分割按钮用的竖线
{0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0},
{4,T_ID5,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
{5,T_ID6,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
{6,T_ID7,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
};
HWND McreateToolbar(HWND hWnd,HINSTANCE hInst)
{
HWND hTool=::CreateToolbarEx(hWnd, //指定hWnd为父窗口,将工具条创建在上面
WS_CHILD|WS_VISIBLE, //工具栏窗口的样式
//TBSTYLE_FLAT|CCS_ADJUSTABLE,
IDR_TOOLBAR1, //预定义的工具条资源ID,工具栏的控件ID
8, //在位图资源中的按钮图片数
NULL, //包含图片资源的可执行文件的实例句柄,程序的实例句柄。其中包含有按钮图片资源。
IDB_TOOLBAR, //按钮位图的资源ID
ptoolbar, //指向TBBUTTON结构的数组的指针
8, //加入到工具条的按钮的个数,竖线也是一个
16,16,16,16,sizeof(TBBUTTON)); //工具栏上的按钮的长和宽,工具栏上的图片的长和宽
if(hTool)
{
TBADDBITMAP tab; //TBADDBITMAP结构包含了向工具栏添加的位图的信息,Win32下的位图结构
tab.hInst=hInst;
tab.nID=IDB_TOOLBAR; //位图资源的ID
int iBmp=SendMessage(hTool,TB_ADDBITMAP,(WPARAM)8,(LPARAM)&tab);
SendMessage(hTool,TB_ADDBUTTONS,(WPARAM)0,(LPARAM)&ptoolbar);
return hTool;
}
return NULL;
}
HWND hwndStatus;
void moveStatus(HWND hwnd)
{
RECT rcClient;
int width[3]; //状态栏分割数组
GetClientRect(hwnd, &rcClient); //获取父窗口矩形
int length=rcClient.right/3; //根据父窗口宽度来分割指定大小
width[0]=length; //状态栏第一栏宽度,为分割长度length
width[1]=length*2; //状态栏往后栏目宽度,为length*栏目标号
width[2]=length*3;
//根据width数组来设置状态栏
SendMessage(hwndStatus, SB_SETPARTS, 3, (LPARAM)(LPINT)width);
MoveWindow(hwndStatus,0,0,0,0,TRUE);
}
HWND CreateMStatus(HWND hwnd)
{
//创建一个状态栏
hwndStatus=CreateWindow(STATUSCLASSNAME,L"",SBS_SIZEGRIP|WS_CHILD | WS_VISIBLE,
0,0,0,0,hwnd,NULL,hInst,NULL);
//移动初始化状态栏
moveStatus(hwnd);
//设置状态栏分栏文本,WPARAM指定栏目
SendMessage(hwndStatus, SB_SETTEXT, (WPARAM)0, (LPARAM)TEXT("就绪"));
//使用格式化字符串来设置状态栏文本
TCHAR status_line[256];
TCHAR status_size[256];
wsprintf(status_line,TEXT("%d,%d"),1,1);
wsprintf(status_size,TEXT("%s"),TEXT("本地时间:2013.3.14"));
SendMessage(hwndStatus, SB_SETTEXT, (WPARAM)1, (LPARAM)status_line);
SendMessage(hwndStatus, SB_SETTEXT, (WPARAM)2, (LPARAM)status_size);
return NULL;
}
// 此代码模块中包含的函数的前向声明:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
// TODO: 在此放置代码。
MSG msg;
HACCEL hAccelTable;
// 初始化全局字符串
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_MY, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);
// 执行应用程序初始化:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_MY));
// 主消息循环:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int) msg.wParam;
}
//
// 函数: MyRegisterClass()
//
// 目的: 注册窗口类。
//
// 注释:
//
// 仅当希望
// 此代码与添加到 Windows 95 中的“RegisterClassEx”
// 函数之前的 Win32 系统兼容时,才需要此函数及其用法。调用此函数十分重要,
// 这样应用程序就可以获得关联的
// “格式正确的”小图标。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MY));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;//MAKEINTRESOURCE(IDC_MY);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
return RegisterClassEx(&wcex);
}
//
// 函数: InitInstance(HINSTANCE, int)
//
// 目的: 保存实例句柄并创建主窗口
//
// 注释:
//
// 在此函数中,我们在全局变量中保存实例句柄并
// 创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
hInst = hInstance; // 将实例句柄存储在全局变量中
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
//
// 函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// 目的: 处理主窗口的消息。
//
// WM_COMMAND - 处理应用程序菜单
// WM_PAINT - 绘制主窗口
// WM_DESTROY - 发送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_CREATE:
{
McreateToolbar( hWnd,hInst);
CreateMStatus( hWnd);
break;
}
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// 分析菜单选择:
switch (wmId)
{
case T_ID1:
{
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
}
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: 在此添加任意绘图代码...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
// “关于”框的消息处理程序。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
}