#include <windows.h>
#include <commctrl.h>
#include "Resource.h"
LRESULT CALLBACK WinProc(HWND, UINT, WPARAM, LPARAM);
void OnCreate(HWND);
void OnSize(HWND, UINT, WPARAM, LPARAM);
void DivisionStatusbar(HWND, int, int, int *);
HWND CreateToolbar(HWND, HBITMAP *, int, TBBUTTON *);
HINSTANCE g_hInstance; //本程序实例句柄
TCHAR g_szCaption[MAX_PATH]; //标题栏文字
HWND g_hwndStatusbar; //状态栏句柄
HWND g_hwndToolbar; //工具栏句柄
int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance,
LPSTR lpszArgument, int nCmdShow)
{
char szClassName[MAX_PATH] = "TryHandTalk";
WNDCLASSEX wc;
HWND hwnd;
MSG msg;
g_hInstance = hThisInstance;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW|CS_VREDRAW; //横纵大小改变时重绘客户端
wc.lpfnWndProc = WinProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hThisInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)COLOR_BACKGROUND;
wc.lpszMenuName = MAKEINTRESOURCE(IDM_MENU);
wc.lpszClassName = szClassName;
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
if(!RegisterClassEx(&wc))
return 0;
LoadString(g_hInstance, IDS_MAINCAPTION, g_szCaption, sizeof(g_szCaption));
hwnd = CreateWindow(szClassName, g_szCaption, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
HWND_DESKTOP, NULL, hThisInstance, NULL);
if(NULL == hwnd) return 0;
ShowWindow(hwnd, nCmdShow);
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WinProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_CREATE:
OnCreate(hwnd);
break;
case WM_SIZE:
OnSize(hwnd, msg, wParam, lParam);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
void OnCreate(HWND hwnd)
{
TBBUTTON btnToolbar[] = //工具栏按钮结构
{
{0, IDT_TOOLBAR_TURN, TBSTATE_ENABLED|TBSTATE_CHECKED, TBSTYLE_CHECKGROUP|TBSTYLE_AUTOSIZE},
{1, IDT_TOOLBAR_BLACK, TBSTATE_ENABLED, TBSTYLE_CHECKGROUP|TBSTYLE_AUTOSIZE},
{2, IDT_TOOLBAR_WHITE, TBSTATE_ENABLED, TBSTYLE_CHECKGROUP|TBSTYLE_AUTOSIZE},
{3, IDT_TOOLBAR_RESTRACT, TBSTYLE_BUTTON, TBSTYLE_AUTOSIZE}
};
int n = sizeof(btnToolbar)/sizeof(TBBUTTON); //工具栏上按钮的个数
char szTemp[n][10]; //工具栏按钮提示文字
HBITMAP hbmpToolbar[3]; //工具栏按钮图片
int i;
//注册并初始化通用控件窗口类
InitCommonControls();
//创建状态栏
g_hwndStatusbar = CreateWindow(STATUSCLASSNAME, NULL,
WS_CHILD|WS_VISIBLE,0,0,0,0, hwnd, NULL, g_hInstance, NULL);
//从文件中载入按钮图片
hbmpToolbar[0] = LoadImage(NULL, ".\\Res\\ToolbarNormal.bmp", IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
hbmpToolbar[1] = LoadImage(NULL, ".\\Res\\ToolbarHover.bmp", IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
hbmpToolbar[2] = LoadImage(NULL, ".\\Res\\ToolbarDisable.bmp", IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
//没有图片就使用文字
if(NULL == hbmpToolbar[0] || NULL == hbmpToolbar[1] || NULL == hbmpToolbar[2])
{
//从资源中载入按钮提示文字
for(i=0; i<n; i++)
{
LoadString(g_hInstance, IDS_TOOLBAR_TURN+i, szTemp[i], sizeof(szTemp[i]));
btnToolbar[i].iString = (INT_PTR)szTemp[i];
}
}
//创建工具栏
g_hwndToolbar = CreateToolbar(hwnd, hbmpToolbar, n, btnToolbar);
//清理不再使用的资源
DeleteObject(hbmpToolbar[0]);
DeleteObject(hbmpToolbar[1]);
DeleteObject(hbmpToolbar[2]);
}
void OnSize(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
int nwStatusbar[] = {55, 10, 15, 10, 10}; //状态栏各格宽度比例
RECT rc;
//通知子窗口
SendMessage(g_hwndStatusbar, msg, wParam, lParam);
SendMessage(g_hwndToolbar, msg, wParam, lParam);
GetClientRect(hwnd, &rc);
//分割状态栏
DivisionStatusbar(g_hwndStatusbar, rc.right, sizeof(nwStatusbar)/sizeof(int), nwStatusbar);
}
//分割状态栏
//参数:h 状态栏句柄,w 状态栏总宽度,n 状态栏划分格数,d[] 每格宽度比例
void DivisionStatusbar(HWND h, int w, int n, int *d)
{
int i, j=0, k=0;
//各部分宽度比例总和,确保其非100的情况下不出错
for(i=0; i<n; i++)
j += d[i];
//逐个计算实际宽度
for(i=0; i<n; i++)
{
k += d[i]*w;
d[i] = k/j;
}
//分割
SendMessage(h, SB_SETPARTS, (WPARAM)n, (LPARAM)d);
}
//创建工具栏
//返回值:工具栏句柄
//参数:hwnd 主窗口句柄,b 3态位图资源,n 按钮数量,t 按钮结构
HWND CreateToolbar(HWND hwnd, HBITMAP *b, int n, TBBUTTON *t)
{
HIMAGELIST hImageListNormal, hImageListHover, hImageListDisable;
BITMAP BMPInfo;
HWND h;
int i;
//创建工具栏
h = CreateWindow(TOOLBARCLASSNAME, NULL,
WS_CHILD|WS_VISIBLE|WS_BORDER|TBSTYLE_TOOLTIPS|TBSTYLE_FLAT|TBSTYLE_LIST|TBSTYLE_AUTOSIZE,
0,0,0,0, hwnd,(HMENU)IDT_TOOL_BAR, g_hInstance, NULL);
if(NULL == h) return NULL;
//加载按钮图片
if(b[0] && b[1] && b[2])
{
GetObject(b[0],sizeof(BMPInfo),&BMPInfo);
hImageListNormal = ImageList_Create(BMPInfo.bmWidth/n,BMPInfo.bmHeight,ILC_COLORDDB,3,1);
ImageList_Add(hImageListNormal,b[0],NULL);
SendMessage(h,TB_SETIMAGELIST,0,(LPARAM)hImageListNormal);
GetObject(b[1],sizeof(BMPInfo),&BMPInfo);
hImageListHover = ImageList_Create(BMPInfo.bmWidth/n,BMPInfo.bmHeight,ILC_COLORDDB,3,1);
ImageList_Add(hImageListHover,b[1],NULL);
SendMessage(h,TB_SETHOTIMAGELIST,0,(LPARAM)hImageListHover);
GetObject(b[2],sizeof(BMPInfo),&BMPInfo);
hImageListDisable = ImageList_Create(BMPInfo.bmWidth/n,BMPInfo.bmHeight,ILC_COLORDDB,3,1);
ImageList_Add(hImageListDisable,b[2],NULL);
SendMessage(h,TB_SETDISABLEDIMAGELIST,0,(LPARAM)hImageListDisable);
DeleteObject(hImageListNormal);
DeleteObject(hImageListHover);
DeleteObject(hImageListDisable);
}
//设置按钮结构的大小
SendMessage(h, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
//将按钮与工具栏关联(添加按钮到工具栏中)
SendMessage(h, TB_ADDBUTTONS, n, (LPARAM)t);
return h;
}
[纯C语言 + Win32 API]一步一步写个围棋程序之六:工具栏之二
5星 · 超过95%的资源 需积分: 10 59 浏览量
2012-08-28
16:33:20
上传
评论 2
收藏 16KB RAR 举报
whoozit
- 粉丝: 39
- 资源: 36
最新资源
- 徐州市区shp边界文件
- 简易数字频率计设计(原理图、PCB、源码、分析报告)
- 20225207038罗丽文财管专2201班.rar
- Golang:通过Gin框架+Redis+责任链,实现一个简单的钉钉机器人,进行消息处理 ps:多应用版
- 基于cnn和AlexNet的铝材缺陷检测内含数据集和demo原型2种方法
- 2023年各城市PM2.5, PM10, SO2, NO2等环境空气质量数据
- go 语言 实现的 使用modbus 协议 通过DTU tcp 链接 采集数据
- SHELL脚本(全是干货)
- Windows屏幕录屏软件
- 2022年各城市PM2.5, PM10, SO2, NO2等环境空气质量数据
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
- 3
前往页