Win32 API 创建Rebar以及 ToolBar方法

其中要注意的是ToolBar一定要有CCS_NORESIZE风格,否则位置将被自动设定而出现问题
// Rebar.cpp : 定义应用程序的入口点。
//
#include "stdafx.h"
#include "Rebar.h"
#include "Commctrl.h"
#pragma comment(lib, "comctl32.lib")
#define MAX_LOADSTRING 100
// 全局变量:
HINSTANCE hInst;                                // 当前实例
TCHAR szTitle[MAX_LOADSTRING];                    // 标题栏文本
TCHAR szWindowClass[MAX_LOADSTRING];            // 主窗口类名
// 此代码模块中包含的函数的前向声明:
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_REBAR, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);
    // 执行应用程序初始化:
    if (!InitInstance (hInstance, nCmdShow))
    {
        return FALSE;
    }
    hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_REBAR));
    // 主消息循环:
    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_REBAR));
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground    = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName    = MAKEINTRESOURCE(IDC_REBAR);
    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|WS_CLIPCHILDREN,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
   if (!hWnd)
   {
      return FALSE;
   }
   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);
   return TRUE;
}
HWND CreateAToolBar(HWND hwndParent)
{
    HWND hwndTB;
    TBBUTTON tbb[3];
    TCHAR szBuf[16] = _T("Test");
    int iCut, iCopy, iPaste;
    INITCOMMONCONTROLSEX icex;
    // Ensure that the common control DLL is loaded.
    icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
    icex.dwICC  = ICC_BAR_CLASSES;
    InitCommonControlsEx(&icex);
    // Create a toolbar.
    hwndTB = CreateWindowEx(0, TOOLBARCLASSNAME, NULL,
        WS_CHILD | CCS_NORESIZE| CCS_ADJUSTABLE|CCS_NODIVIDER|CCS_NOPARENTALIGN , 0, 0, 0, 0, hwndParent,
        NULL, hInst, NULL);
    // Send the TB_BUTTONSTRUCTSIZE message, which is required for
    // backward compatibility.
    SendMessage(hwndTB, TB_BUTTONSTRUCTSIZE, (WPARAM) sizeof(TBBUTTON), 0);
    szBuf[_tcslen(szBuf) + 2] = 0;  //Double-null terminate.
   
    iCut = (int) SendMessage(hwndTB, TB_ADDSTRING, 0, (LPARAM) (LPSTR) szBuf);
    iCopy = (int) SendMessage(hwndTB, TB_ADDSTRING, (WPARAM) 0, (LPARAM) (LPSTR) szBuf);
    iPaste = (int) SendMessage(hwndTB, TB_ADDSTRING, (WPARAM) 0, (LPARAM) (LPSTR) szBuf);
    // Fill the TBBUTTON array with button information, and add the
    // buttons to the toolbar. The buttons on this toolbar have text
    // but do not have bitmap images.
    tbb[0].iBitmap = I_IMAGENONE;
    tbb[0].idCommand = 0x1001;
    tbb[0].fsState = TBSTATE_ENABLED;
    tbb[0].fsStyle = BTNS_BUTTON;
    tbb[0].dwData = 0;
    tbb[0].iString = iCut;
    tbb[1].iBitmap = I_IMAGENONE;
    tbb[1].idCommand = 0x1002;
    tbb[1].fsState = TBSTATE_ENABLED;
    tbb[1].fsStyle = BTNS_BUTTON;
    tbb[1].dwData = 0;
    tbb[1].iString = iCopy;
    tbb[2].iBitmap = I_IMAGENONE;
    tbb[2].idCommand = 0x1003;
    tbb[2].fsState = TBSTATE_ENABLED;
    tbb[2].fsStyle = BTNS_BUTTON;
    tbb[2].dwData = 0;
    tbb[2].iString = iPaste;
    SendMessage(hwndTB, TB_ADDBUTTONS, (WPARAM)3,
        (LPARAM) (LPTBBUTTON) &tbb);
    SendMessage(hwndTB, TB_AUTOSIZE, 0, 0);
    ShowWindow(hwndTB, SW_SHOW);
    return hwndTB;
}
HWND WINAPI CreateRebar(HWND hwndOwner)
{
    REBARINFO     rbi;
    REBARBANDINFO rbBand;
    RECT          rc;
    HWND   hwndCB, hwndTB, hwndRB;
    DWORD  dwBtnSize;
    INITCOMMONCONTROLSEX icex;
    icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
    icex.dwICC   = ICC_COOL_CLASSES|ICC_BAR_CLASSES;
    InitCommonControlsEx(&icex);
    hwndRB = CreateWindowEx(WS_EX_TOOLWINDOW,
        REBARCLASSNAME,
        NULL,
        WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|
        WS_CLIPCHILDREN | CCS_NODIVIDER,
        0,0,0,0,
        hwndOwner,
        NULL,
        hInst,
        NULL);
    if(!hwndRB)
        return NULL;
    // Initialize and send the REBARINFO structure.
    rbi.cbSize = sizeof(REBARINFO);  // Required when using this
    // structure.
    rbi.fMask  = 0;
    rbi.himl   = (HIMAGELIST)NULL;
    if(!SendMessage(hwndRB, RB_SETBARINFO, 0, (LPARAM)&rbi))
        return NULL;
    // Initialize structure members that both bands will share.
    rbBand.cbSize = sizeof(REBARBANDINFO);  // Required
    rbBand.fMask  = RBBIM_COLORS | RBBIM_TEXT | RBBIM_BACKGROUND |
        RBBIM_STYLE | RBBIM_CHILD  | RBBIM_CHILDSIZE |
        RBBIM_SIZE;
    rbBand.fStyle = RBBS_CHILDEDGE | RBBS_FIXEDBMP |RBBS_BREAK |RBBS_GRIPPERALWAYS;
    rbBand.hbmBack = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1));   
    // Create the combo box control to be added.
    hwndCB = CreateWindow(L"Button",L"Button",BS_PUSHBUTTON|WS_CHILD,0,0,20,20,hwndOwner, NULL,hInst,NULL);// CreateComboBox(hwndRB);
    // Set values unique to the band with the combo box.
    GetWindowRect(hwndCB, &rc);
    rbBand.lpText     = _T("Combo Box");
    rbBand.hwndChild  = hwndCB;
    rbBand.cxMinChild = 0;
    rbBand.cyMinChild = rc.bottom - rc.top;
    rbBand.cx         = 200;
    // Add the band that has the combo box.
    SendMessage(hwndRB, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand);
    // Create the toolbar control to be added.
    hwndTB = CreateAToolBar(hwndOwner);
    //hwndTB = CreateWindow(_T("Button"),_T("Button"),BS_PUSHBUTTON|WS_CHILD,0,0,20,20,hwndOwner, NULL,hInst,NULL);// CreateComboBox(hwndRB);
    // Get the height of the toolbar.
    dwBtnSize = (DWORD) SendMessage(hwndTB, TB_GETBUTTONSIZE, 0,0);
    // Set values unique to the band with the toolbar.
    rbBand.lpText     = _T("Tool Bar");
    rbBand.hwndChild  = hwndTB;
    rbBand.cxMinChild = 0;
    rbBand.cyMinChild = HIWORD(dwBtnSize);
    rbBand.cx         = 250;
    // Add the band that has the toolbar.
    SendMessage(hwndRB, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand);

    return (hwndRB);
}

//
//  函数: 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:
        {
            CreateRebar(hWnd);
            //CreateAToolBar(hWnd);
        }
        break;
    case WM_COMMAND:
        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        // 分析菜单选择:
        switch (wmId)
        {
        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;
}

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhlynn/archive/2009/05/07/4158968.aspx

上一篇: 上班族下班定时器 第一版   下一篇: 在WIN32操作_注册表的_API

提交疑问

回顶部